- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我和我的 friend 决定制作一款游戏,所以我决定为游戏创建一个引擎。一切都很顺利,我实现了一种称为“插入碰撞”的碰撞类型,这基本上意味着:当玩家向物体移动时,采用物体在物体上移动的速度并将其减去该位置,所以说我是按 W 或向上箭头,当我移动到墙壁时,墙壁将采用我的水平速度或 ysp(Y 速度)并将其减去我的 y 位置。它开始工作,直到我添加了第二个盒子,知道当我一个接一个地与盒子碰撞时它起作用了,但是当我进入两个墙壁物体的中间时,我的玩家会开始从盒子来回弹跳墙壁。现在我知道发生了什么,因为它与一堵墙相撞,所以它会减去我到 y 或 x 位置的速度,但由于我与两堵墙相撞,它会减去我向 x 或 y 移动的速度的两倍,我是我认为我可以增加对象/玩家的 x 或 y 速度,但是当我移动时,对象只会减去两倍,所以我有点尴尬。这是我为“Push Collision type”和 Game 类以及 Player 类和 TestBox 类或 Wall 类编写的代码。
碰撞等级:
package engine.test.core;
public class Collision {
public static void PushCollision(BaseObject obj1, BaseObject obj2) {
if (obj1.box.CollideWOB(obj2.box)) {
if (obj1.MoveDir == 2) {
obj1.Position.x -= obj1.xsp;
} else if (obj1.MoveDir == 1) {
obj1.Position.x += obj1.xsp;
} else if (obj1.MoveDir == 3) {
obj1.Position.y += obj1.ysp;
} else if (obj1.MoveDir == 4) {
obj1.Position.y -= obj1.ysp;
}
}
}
}
玩家等级:
package engine.test.game;
import org.lwjgl.input.Keyboard;
import engine.test.core.BaseObject;
import engine.test.core.Renderer;
public class Player extends BaseObject {
public Player(int x, int y, int w, int h) {
super(x, y, w, h);
}
@Override
public void Init() {
xsp = 5;
ysp = 5;
}
@Override
public void Update() {
if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
MoveDir = 2;
} else if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
MoveDir = 1;
} else if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
MoveDir = 4;
} else if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
MoveDir = 3;
} else {
MoveDir = 0;
}
if (MoveDir == 1) {
Position.x -= xsp;
} else if (MoveDir == 2) {
Position.x += xsp;
} else if (MoveDir == 3) {
Position.y -= ysp;
} else if (MoveDir == 4) {
Position.y += ysp;
}
box.UpdateBox(Position, Size);
}
@Override
public void Draw() {
Renderer.Quad(Position, Size);
}
}
测试盒类:
package engine.test.game;
import engine.test.core.BaseObject;
import engine.test.core.Renderer;
public class TestBox extends BaseObject {
public TestBox(int x, int y, int w, int h) {
super(x, y, w, h);
}
@Override
public void Init() {
}
@Override
public void Update() {
box.UpdateBox(Position, Size);
}
@Override
public void Draw() {
Renderer.Quad(Position, Size);
}
}
游戏类别:
package engine.test.game;
import java.util.ArrayList;
import java.util.List;
import engine.test.core.BaseGame;
import engine.test.core.Collision;
public class Game extends BaseGame {
Player p;
TestBox tb;
TestBox tb2;
List<TestBox> TestBoxes = new ArrayList<TestBox>();
boolean Debug = false;
@Override
public void Init() {
p = new Player(0, 0, 32, 32);
p.Init();
tb = new TestBox(100, 100, 32, 32);
tb2 = new TestBox(132, 100, 32, 32);
tb.Init();
tb2.Init();
TestBoxes.add(tb);
TestBoxes.add(tb2);
}
@Override
public void Update() {
p.Update();
for (TestBox box : TestBoxes) {
Collision.PushCollision(p, box);
}
}
@Override
public void Draw() {
p.Draw();
for (TestBox box : TestBoxes) {
box.Draw();
}
}
}
最佳答案
解决此问题可以采取的一种方法是:
这是我想到的第一个解决方案。如果您对此有任何疑问,请告诉我! :)
关于java - LWJGL - 当我的玩家与多个墙壁物体碰撞时,他开始来回弹跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44562375/
我目前在使用边界框使 sprite 显示为实体时遇到问题。碰撞与下面的代码一起工作得很好。 位置是主要角色在 map 上的位置。character2 是主角将与之发生碰撞的 18 x 28 Sprit
这个问题在这里已经有了答案: JavaScript: Collision detection (10 个回答) 10 个月前关闭。 检测 2 个物体(墙壁)碰撞的好方法。是的,不仅仅是检测,还有进一步
我正在制作一个 roguelike 游戏,但在编码方面我是初学者。我已经让我的角色移动了,我的墙壁和地板 Sprite ,但我的代码中有一些错误,允许角色穿过墙壁。 我用了 block_path在地板
我使用的代码只是取自一个示例,它确实为我的场景建了一堵墙: /** This loop builds a wall out of individual bricks. */ public vo
我已经尝试解决平滑播放器-墙壁-碰撞的问题,使播放器沿着墙壁滑动。 我试过以下: playerBox->move(); if (playerBox->intersects(wall)) { c
我是一名优秀的程序员,十分优秀!