Arduboy ゲームプログラム 「ロボ」
Arduboyでゲーム開発へ戻る
●操作方法とルール
・左右ーで自機(ロボット)を左右に移動
・Aボタンでジャンプ、押し続けると滞空時間が伸びる
・Bボタンでレーザー発射、敵を自動でロックオンし破壊します
・敵にぶつかるとゲームオーバー
※より高い位置で敵を倒すとスコアが多く増えます
※本気でプレイするより、レーザーを発射し続けてストレスを解消するゲームです(笑)
・プログラムの行数 152行
●ゲームサンプルコード04「ロボ」
#include <Arduboy2.h>
Arduboy2 arduboy;
BeepPin1 beep;
const unsigned char BMP[] PROGMEM = {
0x00, 0xc0, 0x7c, 0x3e, 0xf6, 0x9c, 0x0c, 0x04, // ロボ歩き
0x00, 0x00, 0x0e, 0xff, 0xeb, 0x8c, 0x0c, 0x04, // 〃
0x00, 0x00, 0xe0, 0x7e, 0x1f, 0x0b, 0x0c, 0x04, // ロボジャンプ
0x30, 0x18, 0xec, 0x7e, 0x1f, 0x0b, 0x0c, 0x04, // 〃
0x18, 0x6e, 0x4a, 0x9f, 0x99, 0x42, 0x66, 0x18, // ┬敵機(回転アニメ)
0x18, 0x66, 0x42, 0x99, 0x9f, 0x4a, 0x6e, 0x18, // │
0x18, 0x66, 0x42, 0x99, 0xf9, 0x52, 0x76, 0x18, // │
0x18, 0x76, 0x52, 0xf9, 0x99, 0x42, 0x66, 0x18, // ┘
0x07, 0x05, 0xfd, 0x55, 0x05, 0xfd, 0x05, 0x05 // 地面
};
char scene = 0;
int cntr = 0;
long int score = 0;
int pl_x, pl_y, pl_yp, pl_jmp; // プレイヤー(ロボ)キャラ用
const int EMAX = 50; // 敵 最大出現数
int ex[EMAX], ey[EMAX], ee[EMAX], emax;
void drawBmp(int x, int y, int n) { // ビットっマップ描画
arduboy.drawBitmap(x, y, BMP+n*8, 8, 8, WHITE);
}
void prt(int x, int y, char *t, int s) { // 文字列出力
arduboy.setCursor(x, y);
arduboy.setTextSize(s);
arduboy.print(t);
}
void setup() { // 初期化
arduboy.begin();
arduboy.setFrameRate(30);
beep.begin();
}
void loop() { // メインループ
int i;
if (!(arduboy.nextFrame())) return;
cntr++;
beep.timer();
arduboy.clear();
for(i=0; i<33; i++) drawBmp(i*8-(cntr/10)%8, 56, 8); // 地面
emax = 2 + score/50; // 敵出現数
if(emax>EMAX) emax = EMAX;
if(scene>1) { // 敵の処理
for(i=0; i<emax; i++) {
if(ee[i]>0) { // 爆発
if(ee[i]%2) arduboy.drawCircle(ex[i]+3, ey[i]+3, ee[i], WHITE);
ee[i]++;
if(ee[i]==16) {
ex[i] = 128+rand()%128;
ey[i] = rand()%48;
ee[i] = 0;
}
continue;
}
ex[i] = ex[i] - 1 - (i%3)/2;
if(ex[i]<-8) ex[i] = 128+rand()%128;
if(-8<ex[i] && ex[i]<128) {
drawBmp(ex[i], ey[i], 4+(cntr/2)%4);
if(scene==2) { // プレイヤーとのヒットチェック
int d = (ex[i]-pl_x)*(ex[i]-pl_x) + (ey[i]-pl_y)*(ey[i]-pl_y);
if(d<8*8) {
scene = 3;
cntr = 0;
}
}
}
}
}
switch(scene) {
case 0: // 初期化
pl_x = 30, pl_y = 48, pl_yp = 0, pl_jmp = 0;
for(i=0; i<EMAX; i++) {
ex[i] = 128+rand()%128;
ey[i] = rand()%40;
ee[i] = 0;
}
scene = 1;
break;
case 1: // タイトル
prt(22, 12, "R O B O", 2);
prt(10, 36, "(A)or(B) to Start.", 1);
if(arduboy.pressed(A_BUTTON) || arduboy.pressed(B_BUTTON)) {
scene = 2;
score = 0;
}
break;
case 2: // ゲーム
if(arduboy.pressed(LEFT_BUTTON) && pl_x>0) pl_x--;
if(arduboy.pressed(RIGHT_BUTTON) && pl_x<120) pl_x++;
if(pl_jmp==0) { // ジャンプ?
if(arduboy.pressed(A_BUTTON)) {
pl_yp = -4;
pl_jmp = 1;
}
}
else if(pl_jmp==1) { // ジャンプ中
pl_y += pl_yp;
if(arduboy.pressed(A_BUTTON))
pl_yp += (cntr%4)/3;
else
pl_yp += 1;
if(pl_y>=48) {
pl_y = 48;
pl_jmp = 2;
}
} // 着地後
else {
if(!arduboy.pressed(A_BUTTON)) pl_jmp = 0;
}
if(arduboy.pressed(B_BUTTON)) { // ビーム
for(i=0; i<emax; i++) {
if(ee[i]==0 && 0<ex[i] && ex[i]<128) {
ee[i] = 1;
score = score + 1 + (48-pl_y)/2;
arduboy.drawLine(pl_x+9, pl_y+2, ex[i]+3, ey[i]+3, WHITE);
beep.tone(beep.freq(800), 4);
break;
}
}
}
if(pl_jmp !=1)
drawBmp(pl_x, pl_y, (cntr/10)%2); // 歩行
else
drawBmp(pl_x, pl_y, 2+cntr%2); // ジャンプ姿勢
break;
case 3: // ゲームオーバー
if(cntr<30*4) {
for(i=0; i<4; i++) arduboy.drawCircle(pl_x+rand()%8, pl_y+rand()%8, 4, WHITE);
if(cntr%5==1) beep.tone(beep.freq(490-cntr*4), 2);
}
else if(cntr<30*8) {
prt(37, 24, "GAME OVER", 1);
}
else {
scene = 0;
}
break;
}
prt(0, 0, "SC ", 1);
arduboy.print(score*10);
arduboy.display();
}
Arduboyでゲーム開発のページへ移動