シューティングゲームの「とりあえず完成バージョン」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
#include <Adafruit_Microbit.h> Adafruit_Microbit_Matrix microbit; unsigned long time = 0; // プログラムの経過時間 //この配列要素を1にするとLEDが点灯する。初期値はすべてオフ。 char LED[5][5] ={ {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}; int button_A = 0; // ボタンAが押されたことを検知 int button_B = 0; // ボタンBが押されたことを検知 int my_position = 2; // 自機の位置(0〜4で変化する) int old_position = 2; // 自機の前の位置を覚えておく int target_position = 0; //敵の場所(0~4) int target_direction = 1; //敵の移動方向(1なら右、-1なら左) unsigned long lasttime=-1; //最後に移動した時刻を覚えておく void showTarget() { if(time-lasttime<300) return; //300ミリ秒経過するまで何もしない lasttime+=300; LED[0][target_position]=0; //いま光っている場所を消す target_position += target_direction; //場所をひとつ移動 //端に到達したら向きを変える if(target_position==0){ target_direction = 1; }else if(4==target_position){ target_direction = -1; } LED[0][target_position]=1; //新しい場所を点灯 } void setup() { //シリアル通信を開始 Serial.begin(9600); while (!Serial); // ボタンを初期化 pinMode(PIN_BUTTON_A, INPUT_PULLUP); pinMode(PIN_BUTTON_B, INPUT_PULLUP); // 割り込み設定 attachInterrupt(PIN_BUTTON_A, irq_by_A_button, FALLING); attachInterrupt(PIN_BUTTON_B, irq_by_B_button, FALLING); //Adafruitライブラリを初期化 microbit.begin(); microbit.fillScreen(LED_OFF); } // 割り込みハンドラ void irq_by_A_button() { button_A = 1; } void irq_by_B_button() { button_B = 1; } void updateDisplay() { for(int y=0;y<5;y++){ for(int x=0;x<5;x++){ microbit.drawPixel(x,y,LED[y][x]); } } } void showMyPosition() { LED[4][old_position] = 0; LED[4][my_position] = 1; old_position = my_position; } void shoot() { for(int y=3;0<=y;y--){ microbit.drawPixel(my_position,y,1); delay(100); microbit.drawPixel(my_position,y,0); } } void loop(){ //プログラム開始時からの経過時間(ミリ秒) time = millis(); Serial.print("Time: "); Serial.println(time); if (button_A && button_B) { button_A = 0; button_B = 0; // 3ms待ってボタンAが立ち下がってなければチャタリングと判断 delay(3); if (digitalRead(PIN_BUTTON_A) == HIGH || digitalRead(PIN_BUTTON_A) == HIGH) { Serial.println("CHATTERING!"); return; } shoot(); Serial.println("SHOOT!"); } else if (button_A) { button_A = 0; // 3ms待ってボタンAが立ち下がってなければチャタリングと判断 delay(3); if (digitalRead(PIN_BUTTON_A) == HIGH) { Serial.println("CHATTERING!"); return; } my_position--; if (my_position<0) my_position=0; Serial.print("my_position="); Serial.println(my_position); } else if (button_B) { button_B = 0; // 3ms待ってボタンBが立ち下がってなければチャタリングと判断 delay(3); if (digitalRead(PIN_BUTTON_B) == HIGH) { Serial.println("CHATTERING!"); return; } my_position++; if (4<my_position) my_position=4; Serial.print("my_position="); Serial.println(my_position); } showTarget(); showMyPosition(); //現在の状態を表示 updateDisplay(); delay(50); } |