Столкновение с плиткой GBDK

Я пытаюсь заставить работать плитку коллизий, используя GBDK с C, и не могу понять, почему коллизия чокнутая. Я конвертирую col_map (данные карты для плиток bg, которые я использую для столкновения) в двумерный массив, который я пытаюсь проиндексировать, вычисляя столбец и строку для каждой плитки на основе координат x и y игрока, как показано в коде ниже:

//this line here further down
//col_mapxy[playerxy[1] / 8][(playerxy[0] / 8) % 20]

Вы должны быть в состоянии скомпилировать код, используя комплект разработчика GBDK.

#include <gb/gb.h>
#include <string.h>

#define Mwidth      20 // in 8x8 tiles
#define Mheight     18

unsigned char col_tile_dat[] =
{
  0xFF,0xFF,0xFF,0xFF,0xC3,0xFF,0xDB,0xE7,
  0xDB,0xE7,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,
  0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,
  0x0C,0x00,0x70,0x00,0x10,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

unsigned char col_map[] =
{
  0x02,0x02,0x02,0x03,0x03,0x03,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,
  0x02,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,
  0x02,0x03,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,
  0x03,0x00,0x00,0x00,0x03,0x03,0x02,0x03,0x03,0x03,
  0x02,0x03,0x00,0x00,0x03,0x01,0x03,0x03,0x03,0x03,
  0x01,0x00,0x00,0x00,0x02,0x03,0x03,0x03,0x03,0x03,
  0x02,0x02,0x03,0x03,0x01,0x02,0x03,0x03,0x03,0x03,
  0x01,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,
  0x02,0x03,0x03,0x03,0x02,0x03,0x03,0x03,0x02,0x03,
  0x02,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x00,0x00,
  0x03,0x02,0x03,0x03,0x03,0x02,0x03,0x02,0x03,0x03,
  0x02,0x02,0x03,0x01,0x02,0x03,0x03,0x03,0x00,0x00,
  0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x02,
  0x03,0x02,0x03,0x03,0x01,0x01,0x02,0x03,0x00,0x00,
  0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x03,
  0x03,0x03,0x03,0x03,0x03,0x01,0x03,0x03,0x00,0x00,
  0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,
  0x03,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x00,0x00,
  0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x03,
  0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x00,0x00,
  0x03,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x03,
  0x02,0x02,0x02,0x01,0x00,0x00,0x01,0x02,0x00,0x00,
  0x03,0x03,0x01,0x01,0x03,0x00,0x00,0x00,0x03,0x03,
  0x03,0x03,0x02,0x01,0x02,0x03,0x01,0x03,0x00,0x00,
  0x03,0x03,0x03,0x01,0x03,0x00,0x00,0x00,0x03,0x03,
  0x02,0x02,0x01,0x03,0x03,0x03,0x01,0x03,0x00,0x00,
  0x03,0x03,0x03,0x02,0x01,0x00,0x00,0x00,0x03,0x03,
  0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,
  0x03,0x03,0x03,0x03,0x02,0x01,0x03,0x03,0x03,0x01,
  0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x03,0x00,0x00,
  0x00,0x00,0x03,0x03,0x03,0x02,0x03,0x02,0x03,0x02,
  0x02,0x02,0x03,0x02,0x03,0x03,0x00,0x00,0x00,0x00,
  0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x02,
  0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00
};

unsigned char player[] =
{
  0x3C,0x3C,0x42,0x7E,0x81,0xFF,0xA5,0xFF,
  0x81,0xFF,0xBD,0xFF,0x56,0x7E,0x3C,0x3C,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

UINT8 playerxy[2];
UINT8 col_mapxy[18][20];


void init() {
    memcpy(&col_mapxy, &col_map, sizeof(unsigned char) * 360);
    DISPLAY_ON;
    set_bkg_data(0, 2, col_tile_dat);
    set_bkg_tiles(0, 0, 20, 18, col_map);
    set_sprite_data(0, 2, player);
    set_sprite_tile(0, 0);
    playerxy[0] = 80;
    playerxy[1] = 72;
}

void updateSwitches() {
    HIDE_WIN;
    SHOW_BKG;
    SHOW_SPRITES;
}

void checkInput() { // here
// calculate the tiles in colmapxy based of player x, y cooridinates 
// I will add player[1] - 1 so that it checks for the next move. e.g up.
// when I get it working
    if ( (joypad() & J_UP) && (col_mapxy[playerxy[1] / 8][(playerxy[0] / 8) % 20] != 0x00)) {
                playerxy[1]--;  
    }

    if (joypad() & J_DOWN) playerxy[1]++;
    if (joypad() & J_LEFT) playerxy[0]--;
    if (joypad() & J_RIGHT) playerxy[0]++;

    move_sprite(0, playerxy[0], playerxy[1]);

}

void main() {
    init();
    while (1) {
        checkInput();
        updateSwitches();
        wait_vbl_done();
    }

}

0 ответов

Другие вопросы по тегам