今天只是單純想讓我的們角色動起來,結果又又又又卡在奇怪的地方了,方向感覺對了,但有很多東西要修。
根據昨天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,這樣,接下來要製作跳躍的時候,才不會起始值會是在底下一直疊加的速度。
下面直接貼我實驗的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重新計算頂點與法向量。
直接上圖,問題在於紅框標起來的部分,目前沒有準確的理由為什麼會這樣,可能是因為我寫的SAT算得太慢,已經穿過去了,才算出有碰撞。