work on obstacle collision
This commit is contained in:
parent
d788b3931d
commit
8646b6c1a0
|
@ -19,8 +19,8 @@ static void drawBg(){
|
|||
|
||||
// update
|
||||
|
||||
#define BG_SPEED FIX16(1)
|
||||
#define BG_SPEED_NORM FIX16(0.707)
|
||||
#define BG_SPEED FIX16(0.5)
|
||||
#define BG_SPEED_NORM FIX16(0.354)
|
||||
|
||||
#define BG_SIZE 64
|
||||
|
||||
|
@ -28,7 +28,6 @@ static void drawBg(){
|
|||
|
||||
s16 bgPosX[GAME_H_T];
|
||||
fix16 bgPosXF[GAME_H_T];
|
||||
Vect2D_f16 bgPos;
|
||||
|
||||
static void scrollBg(){
|
||||
for(u8 y = 0; y < GAME_H_T; y++){
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
struct obstacle {
|
||||
bool active, top;
|
||||
Vect2D_f16 pos;
|
||||
Vect2D_f16 pos, size;
|
||||
s16 startX;
|
||||
};
|
||||
struct obstacle obstacles[OBSTACLE_COUNT];
|
||||
|
@ -31,10 +31,13 @@ static void drawFg(){
|
|||
|
||||
// obstacle
|
||||
|
||||
#define OBS_CEIL_Y CEIL_Y + 4
|
||||
#define OBS_FLOOR_Y FLOOR_Y - 4
|
||||
#define OBS_CEIL_Y 7
|
||||
#define OBS_FLOOR_Y 20
|
||||
#define OBS_X 32
|
||||
|
||||
#define OBS_TOP_Y FIX16(24)
|
||||
#define OBS_BOTTOM_Y FIX16(160)
|
||||
|
||||
s16 fgPos;
|
||||
|
||||
static void spawnObstacle(bool top){
|
||||
|
@ -44,6 +47,9 @@ static void spawnObstacle(bool top){
|
|||
obstacles[i].active = TRUE;
|
||||
obstacles[i].top = top;
|
||||
obstacles[i].pos.x = FIX16(256);
|
||||
obstacles[i].pos.y = top ? OBS_TOP_Y : OBS_BOTTOM_Y;
|
||||
obstacles[i].size.x = FIX16(64);
|
||||
obstacles[i].size.y = FIX16(32);
|
||||
obstacles[i].startX = OBS_X;
|
||||
if(top){
|
||||
VDP_drawImageEx(BG_B, &rock1lt, TILE_ATTR_FULL(PAL2, 1, 0, 0, FG_I + 32), OBS_X, OBS_CEIL_Y - 2, 0, DMA);
|
||||
|
@ -64,20 +70,19 @@ static void spawnObstacle(bool top){
|
|||
|
||||
static void killObstacle(s16 i){
|
||||
obstacles[i].active = FALSE;
|
||||
if(obstacles[i].top){
|
||||
VDP_clearTileMapRect(BG_B, obstacles[i].startX, OBS_CEIL_Y, 8, 8);
|
||||
for(u8 i = 0; i < 2; i++) VDP_drawImageEx(BG_B, &rock1t, TILE_ATTR_FULL(PAL2, 1, 0, 0, FG_I),obstacles[i].startX + 4 * i, CEIL_Y, 0, DMA);
|
||||
} else {
|
||||
VDP_clearTileMapRect(BG_B, obstacles[i].startX, OBS_FLOOR_Y, 8, 8);
|
||||
for(u8 i = 0; i < 2; i++) VDP_drawImageEx(BG_B, &rock1, TILE_ATTR_FULL(PAL2, 1, 0, 0, FG_I + 16), obstacles[i].startX + 4 * i, FLOOR_Y, 0, DMA);
|
||||
}
|
||||
VDP_clearTileMapRect(BG_B, obstacles[i].startX, obstacles[i].top ? OBS_CEIL_Y : OBS_FLOOR_Y, 8, 4);
|
||||
for(u8 x = 0; x < 2; x++)
|
||||
VDP_drawImageEx(BG_B, obstacles[i].top ? &rock1t : &rock1, TILE_ATTR_FULL(PAL2, 1, 0, 0, FG_I + (obstacles[i].top ? 0 : 16)),
|
||||
obstacles[i].startX + 4 * x, obstacles[i].top ? CEIL_Y : FLOOR_Y, 0, DMA);
|
||||
}
|
||||
|
||||
static void collideObstacle(s16 i){
|
||||
collideObstacleWithPlayer(i);
|
||||
}
|
||||
|
||||
static void updateObstacle(s16 i){
|
||||
obstacles[i].pos.x = fix16Sub(obstacles[i].pos.x, FG_SPEED);
|
||||
if(obstacles[i].pos.x <= OBSTACLE_LIMIT_X){
|
||||
killObstacle(i);
|
||||
}
|
||||
obstacles[i].pos.x <= OBSTACLE_LIMIT_X ? killObstacle(i) : collideObstacle(i);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -36,4 +36,6 @@ struct bulletSpawner {
|
|||
bool bools[COUNT_INT];
|
||||
s16 ints[COUNT_INT];
|
||||
fix16 fixes[COUNT_INT];
|
||||
};
|
||||
};
|
||||
|
||||
void collideObstacleWithPlayer(s16);
|
|
@ -27,9 +27,9 @@ static void loadInternals(){
|
|||
|
||||
static void loadGame(){
|
||||
loadBg();
|
||||
loadChrome();
|
||||
loadFg();
|
||||
loadPlayer();
|
||||
loadChrome();
|
||||
}
|
||||
|
||||
static void updateGame(){
|
||||
|
|
15
src/player.h
15
src/player.h
|
@ -27,6 +27,8 @@ static void spawnPlayer(){
|
|||
TILE_ATTR(PAL1, 0, 0, 0));
|
||||
}
|
||||
|
||||
#define PLAYER_SPEED FIX16(2.5)
|
||||
#define PLAYER_SPEED_NORM FIX16(1.768)
|
||||
|
||||
// collision
|
||||
|
||||
|
@ -45,10 +47,19 @@ static void checkPlayerBounds(){
|
|||
else if(player.pos.y > PLAYER_LIMIT_H_HORI) player.pos.y = PLAYER_LIMIT_H_HORI;
|
||||
}
|
||||
|
||||
void collideObstacleWithPlayer(s16 i){
|
||||
if(obstacles[i].pos.x < fix16Add(player.pos.x, PLAYER_OFF) &&
|
||||
fix16Add(obstacles[i].pos.x, obstacles[i].size.x) > fix16Sub(player.pos.x, PLAYER_OFF) &&
|
||||
obstacles[i].pos.y < fix16Add(player.pos.y, PLAYER_OFF) &&
|
||||
fix16Add(obstacles[i].pos.y, obstacles[i].size.y) > fix16Sub(player.pos.y, PLAYER_OFF)){
|
||||
if(obstacles[i].pos.x > player.pos.x) player.pos.x = fix16Sub(fix16Sub(obstacles[i].pos.x, FG_SPEED), PLAYER_OFF);
|
||||
else if(obstacles[i].pos.y > player.pos.y) player.pos.y = fix16Sub(obstacles[i].pos.y, PLAYER_OFF);
|
||||
checkPlayerBounds();
|
||||
}
|
||||
}
|
||||
|
||||
// movement
|
||||
|
||||
#define PLAYER_SPEED FIX16(2.5)
|
||||
#define PLAYER_SPEED_NORM FIX16(1.768)
|
||||
|
||||
s16 playerFrame;
|
||||
|
||||
|
|
Reference in New Issue