【发布时间】:2020-12-17 08:53:25
【问题描述】:
我正在 LibGDX 中创建游戏。我最初是在 youtube 上关注超级马里奥兄弟游戏的教程,但是,我已经更改了游戏以包含我自己的角色和图形。我正在使用 Kryonet 作为在我的游戏中包含多人游戏功能的一种方式。这是我遇到几个问题的地方。
首先,我使用线性脉冲来移动,所以当我的角色击中能量提升时,会施加线性脉冲,并赋予他们更快前进的力量。在您同时查看两个屏幕之前,这可以正常工作,角色 A 在一个玩家的屏幕上的位置不同,而在另一个玩家的屏幕上的位置不同。我得到的两个角色的线性脉冲值也不同。我正常的右、左、上运动也是用线性脉冲完成的。由于线性脉冲值的随机性,我一直得到这个错误,我说这就像滑动冰错误,将冰块推过表面并不总是保证相同的位置。下面是我的多人客户端类的一些代码。
client.addListener(new ThreadedListener(new Listener() {
// What to do with the packets.
public void connected(Connection connection) {
}
public void received(Connection connection, Object object) {
if (object instanceof MovementJump) {
MovementJump packet = (MovementJump) object;
PlayScreen.player.b2body.applyLinearImpulse(new Vector2(0, 4f),
PlayScreen.player.b2body.getWorldCenter(), true);
}
if (object instanceof MovementRight) {
MovementRight packet = (MovementRight) object;
PlayScreen.player.b2body.applyLinearImpulse(new Vector2(packet.impulse, 0),
PlayScreen.player.b2body.getWorldCenter(), true);
}
if (object instanceof MovementLeft) {
MovementLeft packet = (MovementLeft) object;
PlayScreen.player.b2body.applyLinearImpulse(new Vector2(-packet.impulse, 0),
PlayScreen.player.b2body.getWorldCenter(), true);
}
if (object instanceof MovementP2Jump) {
MovementP2Jump packet = (MovementP2Jump) object;
PlayScreen.player2.b2body.applyLinearImpulse(new Vector2(0, 4f),
PlayScreen.player2.b2body.getWorldCenter(), true);
}
if (object instanceof MovementP2Right) {
MovementP2Right packet = (MovementP2Right) object;
PlayScreen.player2.b2body.applyLinearImpulse(new Vector2(packet.impulse, 0),
PlayScreen.player2.b2body.getWorldCenter(), true);
}
if (object instanceof MovementP2Left) {
MovementP2Left packet = (MovementP2Left) object;
PlayScreen.player2.b2body.applyLinearImpulse(new Vector2(-packet.impulse, 0),
PlayScreen.player2.b2body.getWorldCenter(), true);
}
}
}));
}
这是我 playScreen 中的一些代码
if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)
&& player.b2body.getLinearVelocity().x <= player.getMinSpeed()) {
MovementRight pos = new MovementRight();
MPClient.client.sendTCP(pos);
}
if (Gdx.input.isKeyPressed(Input.Keys.LEFT)
&& player.b2body.getLinearVelocity().x >= -player.getMinSpeed()) {
MovementLeft pos = new MovementLeft();
MPClient.client.sendTCP(pos);
}
【问题讨论】:
标签: java android libgdx game-physics kryonet