[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算得太慢,已经穿过去了,才算出有碰撞。

今天就先这样,先睡了,各位晚安...


<<:  Day 26:扩充性

>>:  2.4.3 Design System - Banner

[DAY-04] 以正面动机 说出你的真心话

ㄟ~~~ 这个需求 很白痴你认同麻 ? 可以 解释 & 说服 一下 为什麽 要这样搞? 就...

[DAY 13] ElastiCache

可视为 in memeory DB, 具高效低延迟的特性 AWS ElastiCache 提供托管...

哈罗,世界!

Photo by KOBU Agency on Unsplash 文章同步发布於:https://...

Day24 - 为 Kubernetes 应用增添 Database

前言 今天你接到了一份新任务,要求在 Kubernetes 的 NodeJS 应用增添一个 Mong...

用 Python 畅玩 Line bot - 21:LIFF(一)

LIFF 是一种 Line 提供让 line bot 可以不跳脱 Line 去开启网页的 API。 ...