■gb.collideBitmapBitmap関数
Gamebuimo.hライブラリのgb.collideBitmapBitmap関数は、2つのビットマップが重なっている場合、ピクセル単位でチェックします。
■使用例
gb.collideBitmapBitmap関数を使ったArduinoIDEのプログラム例は図1の通りです。
このプログラムを実行するとsetup関数中のgb.begin関数でGamebuinoオブジェクトを初期化し、gb.titleScreen関数で画面に「collideRectRect」と表示します。
スタート画面でキーボードの「K」(GamebuinoのA)ボタンを押すと画面左上に「Move with arrows」と表示されキャラをカーソルキーで動かすことが可能になります。
キャラを下に移動し壁に接触したとgb.collideRectRect関数が判定すると「Colliding」と画面に表示されます。
そのあとは如何にも着陸台の様な所に移動しました
参考に図1プログラムをHEXファイルに変換し、それをSimbuino4Webでエミュレートした結果を図2に示します。
#include <SPI.h> #include <Gamebuino.h> Gamebuino gb; //find the bitmap encoder at https://github.com/Rodot/BitmapEncoder const byte oponentBitmap[] PROGMEM = {88, 48, 0x0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0, 0xF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x7F, 0xFF, 0xF0, 0x0, 0x7, 0xFF, 0xF0, 0xFF, 0xFF, 0xFE, 0x0, 0x3F, 0xFF, 0xF0, 0x0, 0x3, 0xFF, 0xE0, 0x1F, 0xFF, 0xFE, 0x0, 0x1F, 0xFF, 0xF0, 0x0, 0x0, 0xFF, 0xE0, 0x3, 0xFF, 0xFC, 0x0, 0xF, 0xFF, 0xF0, 0x0, 0x0, 0x3F, 0xE0, 0x1, 0xFF, 0xFC, 0x0, 0xF, 0xFF, 0xF0, 0x0, 0x0, 0xF, 0xE0, 0x0, 0xFF, 0xF8, 0x0, 0xF, 0xFF, 0xF0, 0x0, 0x0, 0x7, 0xE0, 0x0, 0x7F, 0xF0, 0x0, 0xF, 0xFF, 0xF0, 0x0, 0x0, 0x7, 0xE0, 0x0, 0x1F, 0xE0, 0x0, 0x7, 0xFF, 0xF0, 0x0, 0x0, 0x3, 0xE0, 0x0, 0x7, 0xC0, 0x0, 0x7, 0xFF, 0xF0, 0x0, 0x0, 0x1, 0xC0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xFF, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xFE, 0x0, 0xE0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xFC, 0x0, 0xF0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xF8, 0x0, 0xF8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFC, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7C, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFC, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xFC, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xFC, 0x0, 0x0, 0x0, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xFC, 0x0, 0x0, 0x0, 0xFF, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xFC, 0x0, 0x0, 0x0, 0xFF, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7, 0xFC, 0x0, 0x0, 0x0, 0xFF, 0xC0, 0xFF, 0xFE, 0x0, 0x0, 0x7F, 0xFE, 0x0, 0x0, 0x10, 0xFF, 0xC0, 0x80, 0x2, 0x0, 0x0, 0xFF, 0xFF, 0x0, 0x0, 0x30, 0xFF, 0xE1, 0xAA, 0xAB, 0x0, 0x1, 0xFF, 0xFF, 0xC0, 0x0, 0x30, 0xFF, 0xF3, 0xFF, 0xFF, 0x0, 0x3, 0xFF, 0xFF, 0xF8, 0x0, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x3, 0xFF, 0xFF, 0xFF, 0xC0, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x3, 0xFF, 0xFF, 0xFF, 0xE0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x3, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x7, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0}; const byte playerBitmap[] PROGMEM = {8, 8, 0x7E, 0xE3, 0xF1, 0xE1, 0xFF, 0x34, 0xFF, 0xA5}; int player_x = LCDWIDTH / 2; int player_y = LCDHEIGHT / 2; int oponent_x = 0; int oponent_y = 6; void setup() { gb.begin(); gb.titleScreen(F("collideBitmapBitmap")); } void loop() { if (gb.update()) { gb.display.println(F("Move with arrows")); if (gb.buttons.pressed(BTN_C)) { gb.titleScreen(F("collideBitmapBitmap")); } //update player if (gb.buttons.repeat(BTN_RIGHT, 1)) { player_x = player_x + 1; } if (gb.buttons.repeat(BTN_LEFT, 1)) { player_x = player_x - 1; } if (gb.buttons.repeat(BTN_DOWN, 1)) { player_y = player_y + 1; } if (gb.buttons.repeat(BTN_UP, 1)) { player_y = player_y - 1; } //update collisions if (gb.collideBitmapBitmap(player_x, player_y, playerBitmap, oponent_x, oponent_y, oponentBitmap)) { gb.sound.playTick(); gb.display.print(F("Colliding")); } //draw bitmaps gb.display.setColor(INVERT); gb.display.drawBitmap(player_x, player_y, playerBitmap); gb.display.drawBitmap(oponent_x, oponent_y, oponentBitmap); gb.display.setColor(BLACK); } }
図2:プログラム実行結果
■構文
gb.collideBitmapBitmap(x1、y1、b1,x2、y2、b2)
■パラメータ
x1 :最初のビットマップの水平座標
y1 :最初のビットマップの垂直座標
b1 :最初のビットマップ
x2 :第2のビットマップの水平座標
y2 :第2のビットマップの垂直座標
b2 :2番目のビットマップ
■戻り値
true(2つのビットマップが少なくとも1つの重なり合うピクセルを持つ場合)
false(ビットマップが重複していない場合)