接續昨天的內容,接下來要製作碰撞的部分,既然要實現AABB,首先需要有碰撞框的資料,預想中,我製作的2D Platformer可以簡單看成裡面物體每個都是矩形,所以可以把一些資料集中,形成一個大結構,然後像是四個頂點的位置、大小、移動之類的,可以同時取得許多資料。
所以今天只是先把昨天一些可共用的資料拆出來,並沒有實際做出AABB碰撞,以下是我開的結構
typedef struct Entity {
V2f pos;
V2f dir;
V2f speed;
Rect rec;
V2f center_pos;
V2f draw_pos;
V2f vertex[4];
} Entity;
主要是這個功能,移動的同時取得其他相關資料
// 施工中....
static void MoveEntity(Entity* e, MOVE_DIR move_dir, float offset) {
switch (move_dir) {
case MOVE_DIR_X:
if (offset < 0)
e->dir.x = (-1.0f);
else
e->dir.x = (1.0f);
e->pos.x += offset;
break;
case MOVE_DIR_Y:
if (offset < 0)
e->dir.y = (-1.0f);
else
e->dir.y = (1.0f);
e->pos.y += offset;
break;
}
// center pos
e->center_pos.x = e->draw_pos.x + BLOCK_UNIT_SZ / 2.0f;
e->center_pos.y = e->draw_pos.y + BLOCK_UNIT_SZ / 2.0f;
// set draw pos
e->draw_pos.x = e->pos.x * BLOCK_UNIT_SZ;
e->draw_pos.y = e->pos.y * BLOCK_UNIT_SZ;
// set rect
e->rec.x = e->draw_pos.x;
e->rec.y = e->draw_pos.y;
e->rec.w = BLOCK_UNIT_SZ;
e->rec.h = BLOCK_UNIT_SZ;
// vertices
e->vertex[0].x = e->draw_pos.x;
e->vertex[0].y = e->draw_pos.y;
e->vertex[1].x = e->draw_pos.x + BLOCK_UNIT_SZ;
e->vertex[1].y = e->draw_pos.y;
e->vertex[2].x = e->draw_pos.x;
e->vertex[2].y = e->draw_pos.y + BLOCK_UNIT_SZ;
e->vertex[3].x = e->draw_pos.x + BLOCK_UNIT_SZ;
e->vertex[3].y = e->draw_pos.y + BLOCK_UNIT_SZ;
}