2013-07-30 81 views
1

我在as3中多點觸控有點問題。 最近開始一個與我的學生實踐有關的項目。 這是一個針對android的小遊戲。 用於控制兩個虛擬遊戲杆,這是他們的問題。 只要我單獨使用其中一個或另一個,所有工作都很好。但是,當我嘗試同時使用兩個時,其中一個被阻止,並且移動的對象開始隨機移動,我無法控制它。多點觸控as3問題

這裏是我的代碼:

joystick.as:

package com.controls { 

import flash.events.TouchEvent; 
import flash.ui.Multitouch; 
import flash.ui.MultitouchInputMode; 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.display.MovieClip; 
import flash.geom.Rectangle; 

import com.controls.JoystickKnob; 
import com.Hero; 
import com.Fire; 

import com.greensock.*; 
import com.greensock.easing.*; 

public class Joystick extends MovieClip { 

    Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 

    private var my_x:Number; 
    private var my_y:Number; 

    private var knob:JoystickKnob; 
    private var hero:Hero; 
    private var fire:Fire; 

    private var knob_tween:TweenLite; 

    public function Joystick(margin_left, margin_bottom, hero_mc) { 

     var circle:Sprite = new Sprite(); 
     circle.graphics.beginFill(0x696969); 
     circle.graphics.drawCircle(50, 50, 60); 
     circle.graphics.endFill(); 
     addChild(circle); 

     my_x = margin_left; 
     my_y = margin_bottom; 
     hero = hero_mc; 

     if (stage) { 
      init(); 
     } else { 
      addEventListener(Event.ADDED_TO_STAGE,init); 
     }  
    } 

    private function init(e:Event = null):void { 


     if (hasEventListener(Event.ADDED_TO_STAGE)) { 
      removeEventListener(Event.ADDED_TO_STAGE,init); 
     } 

     this.x = my_x + this.width/2; 
     this.y = stage.stageHeight - my_y - this.height/2; 

     knob = new JoystickKnob(); 
     knob.x = 0; 
     knob.y = 0; 

     knob.origin_x = 0; 
     knob.origin_y = 0; 

     addChild(knob); 

     this.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin, true); 
     knob.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove, true); 
     stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd, true); 

     knob.buttonMode = true; 
    } 

    private function onTouchBegin(event:TouchEvent):void { 

     knob.x = this.mouseX; 
     knob.y = this.mouseY; 

     onTouchMove(null); 

    } 

    private function onTouchMove(event:TouchEvent):void { 

     if (knob_tween) { 
      knob_tween.kill(); 
     } 

     this.addEventListener(Event.ENTER_FRAME, knobMoved); 
     knob.startDrag(false, new Rectangle(- this.width /2, - this.height /2, this.width, this.height)); 

    } 

    private function knobMoved(event:Event):void { 

     // LEFT OR RIGHT 
     if (knob.x > 15) { 
      hero.move_right = true; 
      hero.move_left = false; 

     } else if (knob.x < -15) { 
      hero.move_right = false; 
      hero.move_left = true; 

     } else { 
      hero.move_right = false; 
      hero.move_left = false; 

     } 

     // UP OR DOWN 
     if (knob.y > 15) { 
      hero.move_down = true; 
      hero.move_up = false; 

     } else if (knob.y < -15) { 
      hero.move_down = false; 
      hero.move_up = true; 

     } else { 
      hero.move_down = false; 
      hero.move_up = false; 
     } 
    } 

    private function onTouchEnd(event:TouchEvent):void { 

     knob.stopDrag(); 

     hero.move_left = false; 
     hero.move_up = false; 
     hero.move_right = false; 
     hero.move_down = false; 


     if (this.hasEventListener(Event.ENTER_FRAME)) { 
      this.removeEventListener(Event.ENTER_FRAME, knobMoved); 
     } 


     mover(); 
    } 

    private function mover():void { 

     knob_tween = new TweenLite(knob, 0.5, {x: knob.origin_x, y:knob.origin_y, ease:Bounce.easeOut}); 
    } 
} 

}

joystickKnob.as:

package com.controls { 

import flash.display.Sprite; 
import flash.display.MovieClip; 

public class JoystickKnob extends MovieClip {  

    private var _origin_x:Number; 
    private var _origin_y:Number;  

    private var knob:Class; 

    public function JoystickKnob() { 

     var circle:Sprite = new Sprite(); 
     circle.graphics.beginFill(0x32CD32); 
     circle.graphics.drawCircle(50, 50, 35); 
     circle.graphics.endFill(); 
     addChild(circle); 
    } 

    public function get origin_x():Number { 

     return _origin_x; 
    } 

    public function set origin_x(o_x:Number):void { 

     _origin_x = o_x; 
    } 

    public function get origin_y():Number { 

     return _origin_x; 
    } 

    public function set origin_y(o_y:Number):void { 

     _origin_y = o_y; 
    } 
} 

}

第二操縱手柄的代碼看起來牛逼他是一樣的,只是它存儲在文件joystick2.as,joystickKnob2.as中。

這是主類我的程序:

package com { 

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

import com.controls.Joystick; 
import com.controls.Joystick2; 

import com.Hero; 
import com.Fire; 

public class MyApp extends MovieClip { 

    private var joystick:Joystick; 
    private var hero:Hero; 
    private var joystick2:Joystick2; 
    private var fire:Fire; 

    public function MyApp() { 

     hero = new Hero(); 
     hero.x = stage.stageWidth/1.7; 
     hero.y = stage.stageHeight/1.7; 
     addChild(hero); 

     fire = new Fire(); 
     fire.x = stage.stageWidth/1.7; 
     fire.y = stage.stageHeight/1.7; 
     addChild(fire); 

     joystick = new Joystick(-350, 100, hero); 
     addChild(joystick); 

     joystick2 = new Joystick2(600, 100, fire); 
     addChild(joystick2); 

    } 
} 

}

當使用兩個操縱桿的同時,問題也出現與旋鈕圖形 - 而不是在一個特定的區域中移動,其中一個幾乎總是移動到屏幕的另一端,靠近第二個操縱桿的區域。

有沒有人遇到過這樣的問題,並知道如何補救?

最好的問候,並感謝您在您的幫助

回答

2

Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;書面德文檔中不支持多個手指:

For user interaction with multiple points of contact (such as several fingers moving across a touch screen at the same time) use the related GestureEvent, PressAndTapGestureEvent, and TransformGestureEvent classes. And, use the properties and methods of these classes to construct event handlers that respond to the user touching the device.

所以要Multitouch.inputMode = MultitouchInputMode.GESTURE;

+0

是的!就是這樣! 非常感謝您的幫助。你救了我的命。 問候 – Adder

0

這篇文章顯示當在touch_point上搜索信息時需要注意,所以我想確保它是正確的。

TOUCH_POINT確實支持多個接觸點。每次觸摸都是獨一無二的,並賦予一個唯一的ID你可以有100個同時觸摸。

如果您想編寫自己的觸摸處理程序,您可以使用TOUCH_POINT。 GESTURE是TOUCH_POINTs爲您處理。 GESTURE決定接觸點是否滑動,輕敲等。TOUCH_POINT就像一個鼠標事件 - 原始事件。