本周的目标是要让横向卷轴中的角色可以左右移动及跳跃, 在没有碰到场景物件时自由落体, 碰到墙壁时被阻挡在墙的一侧。
在限定所有物件的形状都是没有对座标轴旋转的长方体时,可以使用简单的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
前言 昨天我们已经完成使用Delegate回传值到首页的部分了,那今天就要来完成最後一个步骤: 如何...
前情提要 前一篇带各位透过汇入 Session 达到不必输入帐号密码便可登入的目的。 开始之前 今天...
纯 JS 的环境里要改变 DOM 元素,除了要找到他,还要用 setAttribute, textC...
codepen 连结处: flex 精神时光屋3.双栏选单设计 练习六张图,三张一行 用css的 ...
有意义的讨论 层层拆解,找到歧异点 讨论过程里面,我们通常容易跳到结论做为起点,而我们通常也会先看到...