NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Arduino IDE(gb.collideBitmapBitmap関数の使い方)

■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);
   }
}
イメージ 1
図1:プログラム例
 

 イメージ 1
図2:プログラム実行結果

 

■構文
 gb.collideBitmapBitmap(x1、y1、b1,x2、y2、b2)

■パラメータ
 x1  :最初のビットマップの水平座標
 y1  :最初のビットマップの垂直座標
 b1  :最初のビットマップ
 x2  :第2のビットマップの水平座標
 y2  :第2のビットマップの垂直座標
 b2  :2番目のビットマップ

■戻り値
 true(2つのビットマップが少なくとも1つの重なり合うピクセルを持つ場合)
 false(ビットマップが重複していない場合)
 

イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【Gamebuinoリファレンス】目次に戻る