プログラミングはいつも楽しく、Arduinoのような開発プラットフォームでずっと良くなりました。ここにいるほとんどすべてのプログラマーは、彼らが学んだ/練習している言語を使用して、ある種のゲームを開発しようとしたでしょう。これにより、プログラミングスキルを楽しく生産的な方法で調整できます。 Arduinoを紹介されて以来、私はArduinoの大ファンであり、常に何かクールなものを試してみたいと思っていました。ゲームを開発するという私のアイデアであるArduinoと一緒にNokia5110のようなグラフィカルLCDでどれほどクールになるかを知りました。いくつかのプログラミングスキルを調整し、同時に楽しむための興味深い方法だったので、皆さんもゲームの開発に興味があるかもしれません。したがって、このチュートリアルでは、ArduinoとグラフィカルLCDを使用してまともなゲームを作成する方法を学習します。
Arduinoを使用して昔ながらのスネークゲームをすでに構築しているので、今回は新しいことを試みており、ジョイスティックを使用して敵の船から船を守る必要があるスペースレースゲームと名付けました。
作戦:
始める前に、ゲームが実際にどのように機能するかを計画することが非常に重要です。ハードウェアの選択には、Nokia5110グラフィカルLCDとジョイスティックを使用しました。このチュートリアルでは、あなたも同じものを選択したと仮定します。Nokia 5110には十分なスペースがないため、ゲーム全体をディスプレイの84 * 48ピクセルの解像度内で計画しました。Nokia 5110 LCDをArduinoに、JoystickをArduinoに接続する方法についてのチュートリアルはすでに作成しています。
このスペース内では、ゲームエリアとスコアボードエリアにぴったりと収まる必要があります。スコアボードエリアには、スコアなどが表示されます。ピクセルの位置を追跡し、画面上でそれらを更新するために、ものを配置する場所のピクセルの位置を知ることは非常に重要です。
ゲーム画面の外観が決まったら、ゲーム内のキャラクターを決定する必要があります。私のゲームでは、宇宙船であるプレイヤーキャラクターと、エイリアンの宇宙船のように見えるはずの敵キャラクターの2つしかありません。Nokia LCDはビットマップ画像を表示できるので、そのオプションを使用して宇宙船と敵を表示することにしました。
したがって、エイリアンの宇宙船を駆け抜ける宇宙船があります。この宇宙船には、エイリアンとの衝突を避けるために、変更する3つのレーンがあります。エイリアンは常に2つのトラックしか占有できず、プレーヤーはフリートラックをドライブできる必要があります。これらのアイデアが完成したら、ハードウェア、次にプログラミングに進むことができます。
回路図:
このArduinoゲームの回路は非常に単純です。Nokia 5110LCDモジュールとジョイスティックをArduinoとインターフェースするだけです。完全な回路図を以下に示します。
Nokia 5110 LCDは3.3Vで動作し、Joystickモジュールは5Vで動作します。したがって、5Vは永久に損傷する可能性があるため、LCDは3.3Vのみで接続してください。LCDはSPIプロトコルを介してArduinoと通信し、ジョイスティックは電圧の変化を読み取るためにADCのみを読み取ります。接続設定は以下のようになります
前提条件:
プログラミングの部分に飛び込む前に、ディスプレイモジュールとジョイスティックを使いこなせることが重要です。次のチュートリアルを使用してそれらについて詳しく知り、ここに戻って、問題が正常に機能していることを確認してください。必要です!
- ArduinoとのNokia5110LCDインターフェース
- Arduinoとインターフェースするジョイスティックモジュール
宇宙開発競争ゲームのためのArduinoのプログラミング:
ゲームの完全なプログラムは、このページの最後にあります。Arduino IDEで直接使用して、ボードにアップロードできます。しかし、コード内で実際に何が起こっているのかを知りたい場合は、さらに読んでください。
いつものように、ライブラリヘッダーファイルを追加してプログラムを開始します。このプロジェクトには3つのライブラリが必要であり、そのうちSPIライブラリがデフォルトでIDEに追加されます。他の2つのライブラリは、AdafruitGithubページからダウンロードする必要があります。ライブラリを追加する方法がわからない場合は、前提条件のセクションに記載されているLCDインターフェイスのチュートリアルに従ってください。
#include
チュートリアルに従っている場合は、ビットマップ画像をLCDに表示できることを知っておく必要があります。したがって、チュートリアルに記載されているソフトウェアを使用して、必要な画像をビットマップコードに変換する必要があります。インターネットから任意の画像を選択し、ビットマップコードに変換して使用できます。画像がLCD画面に表示できるほど単純であることを確認し、実際にLCD画面で試す前にプレビューを確認してください。このプログラムでは、2つのビットマップ文字を使用しました。1つは宇宙船で、もう1つは敵船です。以下に示すように、両方のビットマップコードがコードに追加されます。
// SpaceShipのビットマップデータ staticconst unsigned char PROGMEM ship = { B00000000、B00000000、 B00000001、B00000000、 B00000011、B10000000、 B00000010、B10000000、 B00000010、B11000000、 B00000111、B11000000、 B00001101、B11100000、 B00011111、B11110000、 B00111111、B11111000、 B01111111、B11111100、 B01111111、B11111100、 B01111111、B11111100、 B00011111、B11110000、 B00000111、B11100000、 B00000000、B00000000、 }; // 敵の ビットマップデータstaticconst unsigned char PROGMEMenemy = { B00000101、B11000000、 B00001011、B11100000、 B00000011、B11100000、 B00110011、B11111000、 B01111111、B11111100、 B10111111、B11111010、 B01110111、B11011100、 B01111110、B11111100、 B00111111、B11111100、 B11101111、B11101110、 B11000001、B00000110、 B10000001、B00000010、 B10000000、B00000010、 B00000000、B00000000、 };
Nokia LCD5110ディスプレイ が接続されているピンを指定する必要があります。ディスプレイはSPI通信を使用して通信されます。上記の回路図に従っている場合、LCDを初期化するためのコードは次のようになります。変更する必要はありません。
Adafruit_PCD8544 display = Adafruit_PCD8544(7、6、5、4、3); // LCDが接続されているピンを指定します
セットアップ 機能の内部では、シリアルモニターを9600ボーレートで起動するだけで、デバッグしてLCDディスプレイを初期化できます。また、LCDディスプレイのコントラストを設定する必要があります。各ディスプレイは、異なるコントラストレベルで最適に機能するため、値を試して、どちらが最適かを確認してください。最後に、表示画面をクリアして、最初からやり直します。
void setup(){ Serial.begin(9600); //デバッグ用のシリアルモニター display.begin(); // LCD通信ディスプレイを開始します 。setContrast(30); //ディスプレイのコントラストを設定します display.clearDisplay(); //画面をクリアして、新しく開始します }
画面がクリアされるとすぐに ループ 機能にジャンプし、そこでゲーム画面を表示します。ゲーム画面は、スコアと速度レベルとともにゲームの基本的なスケルトンを表示するだけです。ライン機能を使用して3本の線を境界線として描画し、右側には、古いレトロなハンドヘルドゲームデバイスと同じようにテキストのスコアと速度を表示します。
void gamescreen() { //画面の境界線を描画する display.drawLine(0、0、0、47、BLACK); display.drawLine(50、0、50、47、BLACK); display.drawLine(0、47、50、47、BLACK); //デフォルトのテキストを入力し ますdisplay.setTextSize(1); display.setTextColor(BLACK); display.setCursor(52,2); display.println( "Speed"); display.setCursor(54,12); display.println(game_speed); display.setCursor(52,25); display.println( "Score"); display.setCursor(54,35); display.println(score); }
次に、ユーザーが宇宙船を制御できるように、ユーザーからの入力を取得する必要があります。入力は、ピンA1に接続されているジョイスティックモジュールから受信されます。センサーからのアナログ値は、動かさない場合は512になり、X軸に沿って動かすと増減します。これらの値を使用して、ユーザーが左に移動するか右に移動するかを決定します。以下のプログラムを理解するのが難しい場合は、前提条件に記載されているArduinoチュートリアルとインターフェイスするジョイスティックを読む必要があります。
//ユーザーからの入力を取得 Joy_X = analogRead(A1); //ジョイスティックからX値を読み取る if(Joy_X <312 && POS!= 1 && control == true)//ジョイスティックが右に移動した場合 {POS--; control = false;} //宇宙船の位置をデクリメントし ますelseif(Joy_X> 712 && POS!= 3 && control == true)//ジョイスティックが右に移動した場合 {POS ++; control = false;} //宇宙船の位置をインクリメント elseif(Joy_X> 502 && Joy_X <522)//ジョイスティックが初期位置に戻る場合 control = true; //次の移動のために準備 します//受信したユーザーからの入力
ユーザーから宇宙船の位置を取得した後、その特定の場所に宇宙船を配置する必要があります。以下の関数を使用して、位置の値をパラメーターとして渡し、その位置に基づいて、宇宙船がそれぞれの軌道に配置されます。
void player_car(char pos)//ユーザーが選択した位置に基づいて宇宙船を配置します { if(pos == 1) display.drawBitmap(2、32、ship、15、15、BLACK); if(pos == 2) display.drawBitmap(18、32、ship、15、15、BLACK); if(pos == 3) display.drawBitmap(34、32、ship、15、15、BLACK); }
宇宙船が画面に配置され、レースの準備ができたので、プレイヤーと一緒に競争する敵の船を紹介する必要があります。敵の船が画面を横切るたびに、彼は死んでいると想定し、彼が死んだときは、新しい宇宙船を作成する必要があります。以下の関数はまったく同じことをします。2隻の敵船の新しい位置を作成し、画面の上部に配置します。
if(enemy_dead)//敵船のチェックが死んでいる {// 死んでいる場合enemy_0_pos = POS; //宇宙船の上に最初の敵を作成します enemy_1_pos = random(0,4); //他のランダムな場所に 2 番目の敵を作成しますenemy_phase = 0; //敵を一番上のenemy_dead = false;から 持ってきます //敵はもう死んでいないように作成されます}
敵の船を画面の上部に配置した後、プレイヤーが上向きにレースをしているように槍で突き刺すように敵の船を降ろす必要があります。これを行うには、フェーズ(画像が表示される場所)をインクリメントするだけです。ゆっくりと降りてきます。以下に示すように、両方の敵船に対して同じことが行われます。
敵船(enemy_0_pos、enemy_phase); 敵フェーズ++; //最初の敵を画面に配置し、敵を倒し ます(enemy_1_pos、enemy_phase); 敵フェーズ++; // 2番目の敵を画面に配置し、追い詰めます
以下に、 enemy_ship 関数を示します。これは、プレイヤーの車の関数と非常によく似ていますが、ここでは2つのパラメーターがあります。1つは敵をトラックに配置するためのもので、もう1つは敵を下に移動するためのものです。
voidenemy_ship(int place、int phase)//敵船を新しい場所とフェーズに配置します { if(place == 1) display.drawBitmap(2、phase、enemy、15、15、BLACK); if(place == 2) display.drawBitmap(18、phase、enemy、15、15、BLACK); if(place == 3) display.drawBitmap(34、phase、enemy、15、15、BLACK); }
次のコードは、宇宙船が敵船を回避したかどうかを確認する必要があります。これを確認するには、敵船とプレイヤーの宇宙船の位置を知る必要があります。私たちはすべてを知っているので、宇宙船の位置が敵の船と同じであるかどうかを確認する必要があります。これは、敵船が宇宙船の近くに到達した場合にのみチェックします。プレイヤーが敵を回避しなかった場合、それはゲームオーバーを意味します。
if(enemy_phase> 22 &&((enemy_0_pos == POS)-(enemy_1_pos == POS)))//宇宙船が敵のいずれかに接触した場合 game_over(); //ゲームオーバーを表示
プレイヤーが敵をうまく回避した場合は、敵を殺してプレイヤーにポイントを与える必要があります。これを行うには、敵が画面の下部に到達したかどうかを確認し、到達した場合は、以下のコードを使用して敵を殺します
if(enemy_phase> 40)//宇宙船が敵を脱出した場合 {enemy_dead = true; スコア++;} //スコアを上げて敵を倒す
ハイスコアを出してゲームの難易度を上げないとしたら、どんなに楽しいでしょう。そのため、プレーヤーのスコアを監視する別の関数を使用し、スコアに基づいてゲームの速度を上げます。速度は実際には遅延機能を使用して制御されます。これにより、ゲームの更新間隔が制御され、ゲームが速くなったり遅くなったりします。
void Level_Controller()//スコアに基づいてゲームの速度を上げます。 { if(score> = 0 && score <= 10)//スコア0-10の場合 { game_speed = 0; delay(80); //ゲームを80ms遅くします } if(score> 10 && score <= 20)//スコア10-40の場合 { game_speed = 1; delay(70); //ゲームを70ms遅くします } if(score> 20 && score <= 30)//スコア20-40の場合 { game_speed = 2; delay(60); //ゲームを60ms遅くします } if(score> 30 && score <= 40)//スコア30-40の場合 { game_speed = 3; delay(50); //ゲームを50ミリ秒遅くします } }
Arduinoスペースレーサーゲームの動作:
ハードウェアとプログラムが理解されていることを確認したら、回路を構築してコードをArduinoボードにアップロードするだけです。以下に示すように、ゲームが開始されていることに気付くはずです。
ジョイスティックを使用して、左または右に移動して敵の船から脱出します。各敵を回避するために、あなたはあなたのスコアを1つ増やします。スコアが高くなると、ゲームの速度も上がります。つまり、スコアが10ポイントになるごとに速度が10msずつ上がります。このゲームに基づいて新しいレベルを導入したり、ハードウェアを変更して加速度計を使用してモーションを制御したりすることができます。創造性が唯一の限界です。参考までに、ここでArduinoで加速度計を使用する方法を学びます。
あなたがプロジェクトを理解し、それを構築することを楽しんだことを願っています。これを機能させる上で問題が発生した場合は、下のコメントセクションに問題を投稿するか、フォーラムを使用して技術的なヘルプを参照してください。ハッピーゲーム!!
完全なコードと以下のデモンストレーションビデオを確認してください。