Два дня с этим бьюсь. Я использую игровой движок HTML5/JS под названием ImpactJS, и кто-то сделал очень полезный плагин для создания зон касания джойстика для мобильных устройств. Идея состоит в том, что вы указываете зону на экране, где джойстик активируется при касании этой области.
Код подключаемого модуля, который я использую, находится здесь< /а>. Я немного изменил его, добавив «curPos» (координаты x и y места, которого в данный момент касается пользователь), в остальном весь код идентичен. Я пытался решить эту проблему сам, а также связался с первоначальным создателем, но в настоящее время они, похоже, недоступны, и я ничего не получаю.
Я уверен, что здесь я делаю что-то очень неправильное, но хотя я могу заставить сенсорные зоны работать идеально сами по себе, каждый раз, когда я пытаюсь использовать оба джойстика одновременно, они частично перезаписывают друг друга.
Я указал две зоны следующим образом, когда моя игра инициализируется:
this.joystick1 = new TouchJoystickZone(0, 0, ig.system.width / 2, ig.system.height);
this.joystick2 = new TouchJoystickZone(ig.system.width / 2, 0, ig.system.width / 2, ig.system.height);
this.joystick1 отвечает за вращение игрока. this.joystick2 отвечает за ускорение игрока. В моем объекте Player у меня есть следующий код движения для двух джойстиков. Опять же, это отлично работает, когда у меня только один палец на экране/используется один джойстик:
if( ig.ua.mobile ) {
// ROTATION
if (ig.game.joystick1.touchStart.x > 0 && ig.game.joystick1.touchStart.x < ig.system.width/2) {
if (Math.abs(ig.game.joystick1.delta.x) >= 50 || Math.abs(ig.game.joystick1.delta.y) >= 50) {
this.joystickAngle = ig.game.Controller.toDegrees(ig.game.Controller.joystickAngle());
if (this.angle > this.joystickAngle + 20) {
this.angle -= this.turnSpeed * ig.system.tick;
}
else if (this.angle < this.joystickAngle - 20) {
this.angle += this.turnSpeed * ig.system.tick;
}
else {
this.angle = this.joystickAngle;
}
}
}
// THRUST
if (ig.game.joystick2.touchStart.x > ig.system.width / 2) {
if (ig.game.joystick2.delta.y <= -50) {
this.accel.x = Math.cos(this.angle*Math.PI/180)*this.thrust;
this.accel.y = (Math.sin(this.angle*Math.PI/180)*this.thrust);
this.fuel -= 0.1;
}
else if (ig.game.joystick2.delta.y >= 50) {
this.accel.x = Math.cos(this.angle*Math.PI/180)*-this.thrust;
this.accel.y = (Math.sin(this.angle*Math.PI/180)*-this.thrust);
this.fuel -= 0.1;
}
}
else {
this.accel.x = 0;
this.accel.y = 0;
}
}
Однако, как только я кладу второй палец на экран, первый джойстик перезаписывается. Я могу вращаться, а затем двигаться или двигаться, а затем вращаться, и это работает нормально, но мне нужно делать и то, и другое одновременно.
Я обнаружил, что touchStart.x и touchStart.y, кажется, устанавливаются для обоих джойстиков, когда я нажимаю, чтобы использовать другой джойстик, а не только соответствующий джойстик1 или джойстик2, хотя в коде плагина эти координаты предназначены только для воздействия если касание этого джойстика находится в пределах указанной зоны. Я считаю, что это отчасти то, что способствует возникновению проблемы. На этом этапе я потратил часы, пытаясь понять это, и так же потерян, как и в начале.
Может ли кто-нибудь указать мне правильное направление с использованием обоих этих джойстиков одновременно?