2013-07-30 1 views
1

as3의 멀티 터치에는 약간의 문제가 있습니다. 최근 내 학생과 관련된 프로젝트를 시작했습니다. 이것은 안드로이드를위한 작은 게임이 될 것입니다. 두 개의 가상 조이스틱을 제어하는 ​​데 사용되며 그 중 하나가 문제입니다. 하나만 사용하거나 다른 하나를 사용하는 경우 모두 잘 작동합니다. 그러나 동시에 두 개를 사용하려고하면 그 중 하나가 차단되고 움직이는 객체가 무작위로 이동하기 시작하며 제어 할 수 없습니다.멀티 터치 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; 
    } 
} 

}

두 번째 조이스틱 코드가 t을 보이는 여기

내 코드입니다 그는 파일 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_POINT입니다. GESTURE는 터치 포인트가 스 와이프, 태핑 등을 결정합니다. TOUCH_POINT는 마우스 이벤트와 같습니다 (원시 이벤트).