1

as3 のマルチタッチに少し問題があります。最近、私の学生の練習に関連してプロジェクトを開始しました。これはアンドロイド用の小さなゲームです。2 つの仮想ジョイスティックを制御するために使用されますが、それが問題です。それらのいずれかを個別に使用する限り、すべて非常にうまく機能します。しかし、2つ同時に使おうとすると、そのうちの1つがブロックされ、移動するオブジェクトがランダムに動き始め、制御できなくなります。

これが私のコードです:

ジョイスティック.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});
    }
}   

}

ジョイスティックKnob.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;
    }
}

}

2 番目のジョイスティック コードは、ファイル 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 つのジョイスティックを同時に使用すると、ノブのグラフィックでも問題が発生します。特定の領域を移動する代わりに、ほとんどの場合、そのうちの 1 つが画面の反対側の端、2 番目のジョイスティックの領域の近くに移動します。

あなたの誰かがすでにそのような問題に遭遇し、それを解決する方法を知っていますか?

よろしくお願いいたします。ご協力いただきありがとうございます。

4

2 に答える 2

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;

于 2013-07-30T09:42:55.773 に答える
0

touch_pointで検索するとこんな投稿が出てくるので、間違いないか確認したい。

TOUCH_POINT は複数のタッチ ポイントをサポートしています。各タッチは一意であり、一意の ID が与えられます。何百もの同時タッチが可能です。

TOUCH_POINT は、独自のタッチ ハンドラーをコーディングする場合に使用するものです。GESTURE は、あなたのために処理される TOUCH_POINT です。GESTURE は、タッチポイントがスワイプ、タップなどであるかどうかを決定します。TOUCH_POINT はマウス イベントのようなもので、生のイベントです。

于 2014-05-21T19:41:14.877 に答える