iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
自我挑戰組

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

[Day17] 基本移動

今天只是單純想讓我的們角色動起來,結果又又又又卡在奇怪的地方了,方向感覺對了,但有很多東西要修。

今日目標

  • 角色的基本移動、跳躍、與重力

移動與重力

根據昨天SAT碰撞偵測的結果,碰到的話,兩個就矩形就會變色。稍微簡單的改一下,就可以讓角色可以在方塊上跑跑跳跳的了。

首先是移動,這很簡單,之前就有設計這樣的結構了。

typedef struct {
    V2f pos;
    V2f speed;
    V2f size;
    float rotate_deg;
    Color c;

    V2f vert_pos[4];
    V2f norm_axis[4];
    V2f edges[4];
} Entity;

以下會稱角色為變數p

只要在IsKeyDown的時候處理speed變化,角色就會走路了,但是是以「舞空術」的形式,然後請記得要乘上delta time,不然會衝到地圖外。

if (IsKeyDown(KEY_RIGHT)) {
    p.pos.x += p.speed.x * GetDeltaTime();
}

註:請使用IsKeyDown,如果使用IsKeyPressed的話,走路會需要一直連點...

接下來,就需要重力的幫忙了,國中時學過重力是個常數9.81,但事實上就我所知大部分的遊戲都不會用現實世界實際的重力常數。這邊我用400,一樣,現在是對Y軸做處理

// 緩慢降落
p.speed.y += (G * delta_time);
p.pos.y += p.speed.y * delta_time;

往下掉的同時,如果觸碰到另一個矩形的時候,記得將p.speed.y變為0,這樣,接下來要製作跳躍的時候,才不會起始值會是在底下一直疊加的速度。

MISSION FAILED! 跳不起來

下面直接貼我實驗的Code,角色是跳起來了,但是幅度非常小不知道為什麼....之後再來處理。

    if (IsKeyDown(KEY_SPACE) && can_jump) {
            LogInfo("Pressed jump");
            p.pos.y += (-1500.0f * dt);
            move_player = true;
            can_jump = false;
        }

        if (!is_stand_on_floor) {
            LogInfo("In air");
            p.pos.y += p.speed.y * dt;
            p.speed.y += G * dt;
            can_jump = false;
            move_player = true;
        } else {
            LogInfo("On ground");
            can_jump = true;
            p.speed.y = 0.0f; 
            move_player = true;
        }

move_player是用來標記這幀底下,角色有沒有位移的的布林值,用來看這一幀要不要替SAT重新計算頂點與法向量。

MISSION FAILED! 太重陷下去了...

直接上圖,問題在於紅框標起來的部分,目前沒有準確的理由為什麼會這樣,可能是因為我寫的SAT算得太慢,已經穿過去了,才算出有碰撞。

今天就先這樣,先睡了,各位晚安...


上一篇
[Day16] 再戰SAT
下一篇
[Day 18] 製作更多的Debug工具 (1) - 連接期錯誤
系列文
翻車機率極高的2D平台遊戲(2D Platformer)製作33

尚未有邦友留言

立即登入留言