Я создаю игру в LibGDX. Сначала я следовал учебному пособию по игре Super Mario Brother на YouTube, однако я изменил игру, включив в нее своих персонажей и графику. Я использую Kryonet как средство включения многопользовательских функций в свою игру. Здесь я столкнулся с несколькими проблемами.
Во-первых, я использую линейный импульс для движения, поэтому, когда мой персонаж нажимает усиление, применяется линейный импульс, и ему дается сила двигаться вперед быстрее. Это работает нормально, пока вы не посмотрите на оба экрана, позиция персонажа А отличается на экране одного игрока и другая позиция на экране другого. Значения, которые я получаю для линейного импульса для обоих персонажей, также различаются. Мои обычные движения вправо, влево и вверх также выполняются с линейным импульсом. Из-за случайности значений линейного импульса я получаю эту ошибку, которая, я бы сказал, похожа на ошибку скольжения льда: толкание кубика льда по поверхности не всегда гарантирует одно и то же положение. Ниже приведен код из моего многопользовательского клиентского класса.
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);
}