我已经为此奋斗了两天。我正在使用一个名为 ImpactJS 的 HTML5/JS 游戏引擎,有人制作了一个非常有用的插件来为移动设备创建操纵杆触摸区。这个想法是您在屏幕上指定一个区域,当该区域被触摸时,操纵杆被激活。
我正在使用的插件的代码在这里。我稍微修改了它以添加“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 时为两个操纵杆设置,即使在插件代码中这些坐标只是为了受到影响如果该操纵杆的触摸在指定区域内。我相信这部分是造成这个问题的原因。在这个阶段,我已经花了几个小时试图弄清楚这一点,并且就像我开始时一样迷茫。
有人可以同时使用这两个操纵杆为我指明正确的方向吗?