{CMoney战斗营} 的第七周 # 勉强堪用(?)的重力系统

本周的目标是要让横向卷轴中的角色可以左右移动及跳跃, 在没有碰到场景物件时自由落体, 碰到墙壁时被阻挡在墙的一侧。

在限定所有物件的形状都是没有对座标轴旋转的长方体时,可以使用简单的AABB碰撞盒来检测是否碰撞

private boolean isCollision(GameObj obj) {
            if (this.left() > obj.right()) return false;
            if (this.right() < obj.left()) return false;
            if (this.top() > rect.bottom()) return false;
            if (this.bottom() < rect.top()) return false;
            return true;
        }

为了让角色有越掉越快, 需要让角色的速度每次更新一个定值

private void update(){
    velocity.offsetY(Gravity) // y 轴速度每次增加
    offsetX = velocity(x);
    offsetY = velocity(y)
}

为了让角色合理的被场景物件阻挡, 要和场景物件判定碰撞, 并因碰撞结果设定角色位置和归零速度

原本的AABB碰撞仅依据物件的位置获得是否碰撞的结果,
因此需要知道物件的速度, 才会知道是与场景的哪个边碰撞,

再者, 因为与顶点接触时会判定为碰撞, 将使角色在行走在互相连接的下一块底板时,
无法判定与下一块地板的顶点碰撞是"墙壁或地板", 因此将角色碰撞後的位置设定在地板的上缘之上(1 单位)

actor.update();
        for (int i = 0; i < gameObjects.size(); i++) {
            GameObject obj = gameObjects.get(i);
            if (actor.isCollision(obj)) {
                actor.preMove();
                actor.moveY();
                if (actor.isCollision(obj)) { // 撞到 Y
                    actor.jumpReset();
                    if (actor.velocity().y() < 0) {
                        actor.setY(obj.collider().bottom() +1 );
                        actor.velocity().stopY();
                    } else if (actor.velocity().y() > 0) {
                        actor.setY(obj.collider().top() - actor.painter().height() -1);
                        actor.velocity().stopY();
                    }
                    actor.moveX();
                }
                if (actor.collider().bottom() == obj.collider().top() |
                        actor.collider().top() == obj.collider().bottom()) {
                    actor.moveX();
                }
            }
        }

<<:  CodeWars : 新手村练等纪录02- Growth of a Population

>>:  python 物件导向范例

Swift纯Code之旅 Day30. 「新增闹钟功能(最终章) - 分手快乐」

前言 昨天我们已经完成使用Delegate回传值到首页的部分了,那今天就要来完成最後一个步骤: 如何...

【Day 22】- 将朋朋的 Instagram 贴文全部按赞owo(实战 Selenium 自动点击 Instagram 好友贴文赞 2/2)

前情提要 前一篇带各位透过汇入 Session 达到不必输入帐号密码便可登入的目的。 开始之前 今天...

[Day28] Vue3 - 资料绑定

纯 JS 的环境里要改变 DOM 元素,除了要找到他,还要用 setAttribute, textC...

前端工程日记 28日 Flex 并排选单

codepen 连结处: flex 精神时光屋3.双栏选单设计 练习六张图,三张一行 用css的 ...

[Day14] 团队管理:建立团队信赖感(3)

有意义的讨论 层层拆解,找到歧异点 讨论过程里面,我们通常容易跳到结论做为起点,而我们通常也会先看到...