gpt4 book ai didi

java - LWJGL - 当我的玩家与多个墙壁物体碰撞时,他开始来回弹跳

转载 作者:行者123 更新时间:2023-12-02 12:52:33 25 4
gpt4 key购买 nike

所以我和我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com