1

我对 as3 中的多点触控有一点问题。最近开始了一个与我的学生实践有关的项目。这是一款安卓小游戏。用于控制两个虚拟操纵杆,这就是它们的问题。只要我分别使用其中一个或另一个,一切都很好。但是,当我尝试同时使用两个时,其中一个被阻挡,移动的物体开始随机移动,我无法控制它。

这是我的代码:

操纵杆.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});
    }
}   

}

操纵杆旋钮.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);

    }
}

}

当同时使用两个操纵杆时,旋钮图形也会出现问题 - 而是在特定区域移动,其中一个几乎总是移动到屏幕的另一端,靠近第二个操纵杆的区域。

有没有人遇到过这样的问题并且知道如何解决?

最好的问候,并提前感谢您的帮助

4

2 回答 2

2

Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;不支持 de 文档中所写的多个手指:

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。您可以同时进行 100 次触摸。

如果您想编写自己的触摸处理程序,则使用 TOUCH_POINT。GESTURE 已为您处理 TOUCH_POINTs。GESTURE 决定触摸点是否在滑动、点击等。TOUCH_POINT 就像鼠标事件 - 原始事件。

于 2014-05-21T19:41:14.877 回答