2015-10-07 44 views
0

我目前在android上制作太空射击游戏(A.K.A:Hell Bullet)。所以我为独立使用Move和Fire的2个游戏杆做了一个基类。现在我的代码工作,如果我只移动一个,但不是同时。所以我做了一些研究并发现了多点触控,我尝试了一些东西,没有任何工作正确。多个虚拟游戏杆在As3中同时使用

任何人都知道为什么?

Joystick.as(带的MouseEvent,在一次工作之一)

package LP { 

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.events.MouseEvent; 

public class Joystick extends MovieClip { 

    private var _startX: Number = 0; 
    private var _startY: Number = 0; 
    private var _tension: Number = 0.3; 
    private var _xSpeed: Number = 0; 
    public var _isDragging: Boolean = false; 
    public var _angle: int; 
    private var _radius: int; 
    public var _amplitudeX: Number; 
    public var _amplitudeY: Number; 

    public function Joystick() { 
     this.addEventListener(Event.ADDED_TO_STAGE, stageInit); 
    } 

    private function stageInit(e: Event): void { 
     this.removeEventListener(Event.ADDED_TO_STAGE, stageInit); 

     _startX = x; 
     _startY = y; 
     _radius = background.width/2 

     addEventListener(MouseEvent.MOUSE_DOWN, on_mouseDown); 
     stage.addEventListener(MouseEvent.MOUSE_UP, on_mouseUp); 
     stage.addEventListener(Event.ENTER_FRAME, on_enterFrame); 
    } 

    protected function on_mouseDown(e: MouseEvent): void { 
     _isDragging = true; 
    } 


    protected function on_mouseUp(e: MouseEvent): void { 
     _isDragging = false; 
    } 

    protected function on_enterFrame(e: Event): void { 

     if (_isDragging) { 
      _angle = Math.atan2(root.mouseY - _startY, root.mouseX - _startX)/(Math.PI/180); 
      rotation = _angle; 
      stick.rotation = -_angle; 

      stick.x = mouseX; 
      if (stick.x > _radius) { 
       stick.x = _radius; 
      } 
     } else { 
      _xSpeed = -stick.x * _tension; 
      stick.x += _xSpeed; 
     } 

     _amplitudeY = Math.sin(_angle * (Math.PI/180)) * (stick.x/8); 
     _amplitudeX = Math.cos(_angle * (Math.PI/180)) * (stick.x/8); 


    } 


} 

} 

这是我尝试用MultitouchInputMode.GESTURE(不工作,什么都没有发生,没有错误)

package LP { 

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.events.TouchEvent; 
import flash.ui.Multitouch; 
import flash.ui.MultitouchInputMode; 

public class Joystick extends MovieClip { 

    Multitouch.inputMode = MultitouchInputMode.GESTURE; 

    private var _startX: Number = 0; 
    private var _startY: Number = 0; 
    private var _tension: Number = 0.3; 
    private var _xSpeed: Number = 0; 
    public var _isDragging: Boolean = false; 
    public var _angle: int; 
    private var _radius: int; 
    public var _amplitudeX: Number; 
    public var _amplitudeY: Number; 

    public function Joystick() { 
     this.addEventListener(Event.ADDED_TO_STAGE, stageInit); 
    } 

    private function stageInit(e: Event): void { 
     this.removeEventListener(Event.ADDED_TO_STAGE, stageInit); 

     _startX = x; 
     _startY = y; 
     _radius = background.width/2 

     addEventListener(TouchEvent.TOUCH_BEGIN, on_Touch); 
     stage.addEventListener(TouchEvent.TOUCH_END, on_TouchEnd); 

     stage.addEventListener(Event.ENTER_FRAME, on_enterFrame); 
    } 

    protected function on_Touch(e: TouchEvent): void { 
     _isDragging = true; 
    } 

    protected function on_TouchEnd(e: TouchEvent): void { 
     _isDragging = false; 
    } 

    protected function on_enterFrame(e: Event): void { 

     if (_isDragging) { 
      _angle = Math.atan2(root.mouseY - _startY, root.mouseX - _startX)/(Math.PI/180); 
      rotation = _angle; 
      stick.rotation = -_angle; 


      stick.x = mouseX; 
      if (stick.x > _radius) { 
       stick.x = _radius; 
      } 
     } else { 
      _xSpeed = -stick.x * _tension; 
      stick.x += _xSpeed; 
     } 

     _amplitudeY = Math.sin(_angle * (Math.PI/180)) * (stick.x/8); 
     _amplitudeX = Math.cos(_angle * (Math.PI/180)) * (stick.x/8); 


    } 


} 
} 

回答

0

使用Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

不要使用TouchEvent.DRAG,使用TouchEvent.MOVE

因为你有两个不同的Joystick实例,所以你不需要像以前那样分开你的触摸事件。

+0

使用TOUCH_POINT而不是GESTURE正是我所要做的,谢谢! 现在我必须弄清楚如何替换root.mouseX和root.mouseY,因为当我使用这两个游戏杆时,这会导致冲突,因为它们都使用相同的coordonate。 – Draknars

+0

e.stageX和e.stageY可能对你很有用。 –

0

你必须由家长coordin分离的操纵杆触摸事件,包括TOUCH_DRAG更新您的游戏杆的内部位置。然后,如果登记了一个TOUCH_BEGIN事件,则每个操纵杆应该通过查询其自己的(x,y)坐标并且与localToGlobal结果或e.stageXe.stageY比较,并且如果它不是他们的坐标,则检查其坐标是否在该操纵杆的区域中事件监听器。另外,您应该使用其他多点触摸模式MultitouchInputMode.TOUCH_POINT来实现此功能,因为只有此模式才会分派适当的触摸拖动/移动事件。举个例子:

Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 
private var _touchIndex:int; 
private function stageInit(e: Event): void { 
    this.removeEventListener(Event.ADDED_TO_STAGE, stageInit); 

    _startX = x; 
    _startY = y; 
    _radius = background.width/2 

    stage.addEventListener(TouchEvent.TOUCH_BEGIN, on_Touch); 
    stage.addEventListener(TouchEvent.TOUCH_END, on_TouchEnd); 
    stage.addEventListener(TouchEvent.TOUCH_DRAG, on_TouchDrag); 
} 
protected function on_Touch(e: TouchEvent): void { 
    var pe:Point=new Point(e.stageX,e.stageY); 
    var pc:Point=localToGlobal(new Point()); 
    // what if joystick was moved past placing? Otherwise use center X and Y stored 
    // it's critical that these points must be in same coordinate system 
    if (Point.distance(pe,pc)<_radius) { 
     // this touch is ours, keep it 
     _isDragging=true; 
     // grab touch point ID 
     _touchIndex=e.touchPointID; 
    } 
} 
protected function on_TouchEnd(e: TouchEvent): void { 
    if (!_isDragging) return; 
    if (e.touchPointID==_touchIndex) { 
     // it is "our" touch that's been released 
     _isDragging = false; 
    } 
} 
    protected function on_TouchDrag(e: TouchEvent): void { 
    if (!_isDragging) return; 
    if (e.touchPointID==_touchIndex) { 
     // it is "our" touch that's been dragged 
     // do your maths to update the joystick 
     // make sure you will use local coordinates to update parts of joystick! 
    } 
} 

而且不要忘记清除这些阶段连听众在收听Event.REMOVED_FROM_STAGE为了更大的利益。