iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
自我挑戰組

翻車機率極高的2D平台遊戲(2D Platformer)製作系列 第 28

[Day28] 再訪碰撞偵測與解析 (一) - 需要的資料

今日目標

  • AABB碰撞

MISSION FAILED! 準備一下

接續昨天的內容,接下來要製作碰撞的部分,既然要實現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;
}

之後還會再改,目前算是在測試階段,code暫時沒上傳上去。


上一篇
[Day27] 測試場景與角色
下一篇
[Day29] 再訪碰撞偵測與解析(二) - AABB碰撞偵測
系列文
翻車機率極高的2D平台遊戲(2D Platformer)製作33

尚未有邦友留言

立即登入留言