今天只是单纯想让我的们角色动起来,结果又又又又卡在奇怪的地方了,方向感觉对了,但有很多东西要修。
根据昨天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算得太慢,已经穿过去了,才算出有碰撞。
>>: 2.4.3 Design System - Banner
ㄟ~~~ 这个需求 很白痴你认同麻 ? 可以 解释 & 说服 一下 为什麽 要这样搞? 就...
可视为 in memeory DB, 具高效低延迟的特性 AWS ElastiCache 提供托管...
Photo by KOBU Agency on Unsplash 文章同步发布於:https://...
前言 今天你接到了一份新任务,要求在 Kubernetes 的 NodeJS 应用增添一个 Mong...
LIFF 是一种 Line 提供让 line bot 可以不跳脱 Line 去开启网页的 API。 ...