0

私はマルチタッチゲームに取り組んでいますが、何かがうまくいかないようです。現時点では、左下隅にドロー Dpad があります。ユーザーが Dpad ボタンに触れると、画面上の正方形が移動します。指を離すと止まるので、右下に 2 つのボタンを追加しました。これで、ユーザーが Dpad を押したまま右側の下部の 1 つを押すと、指が上にあることを忘れます。右側のボタンを押してください。マルチタッチイベントをサポートするにはどうすればよいですか?

ここに私のコードのスニペットがありますので、私が何を扱っているかを見ることができます

this.addEventListener(Event.ENTER_FRAME,mainLoop);

//should make a game class
var _hero:Hero;
_hero = new Hero();
this.addChild(_hero);
_hero.init();

//variable for touch events
var touchOn:Boolean = false;
var touchX,touchY:Number;

//Direction buttons
var _DpadUp:Dpad_up;        _DpadUp = new Dpad_up();       _DpadUp.init(0);    this.addChild(_DpadUp);
var _DpadLeft:Dpad_Left;    _DpadLeft = new Dpad_Left();    _DpadLeft.init(3);     this.addChild(_DpadLeft);
var _DpadRight:Dpad_Right;  _DpadRight = new Dpad_Right();  _DpadRight.init(1);    this.addChild(_DpadRight);
var _DpadDown:Dpad_Down;    _DpadDown = new Dpad_Down();    _DpadDown.init(2);     this.addChild(_DpadDown);
var _DpadReset:Dpad_Down;   _DpadReset = new Dpad_Down();   _DpadReset.init(4);    this.addChild(_DpadReset);

var points:Object = new Object();

//Touch Events
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

   //Constant update on move
   this.stage.addEventListener (TouchEvent.TOUCH_BEGIN, onTouchBegin);

function onTouchBegin(e:TouchEvent):void{
//Touch Screen code
//touchOn = true;
touchX = e.stageX;
touchY = e.stageY;
  }

 //Constant update on move
  this.stage.addEventListener (TouchEvent.TOUCH_MOVE, onTouchMove);

  function onTouchMove(e:TouchEvent):void{
touchX = e.stageX;
touchY = e.stageY;
  }

  this.stage.addEventListener (TouchEvent.TOUCH_END, onTouchFinish);

  function onTouchFinish(e:TouchEvent):void{
//touchOn = false;
touchX = -100;
touchY = -100;
  }

  //Main Loop
  function mainLoop(e:Event):void {

if(_DpadUp.hitTestPoint(touchX,touchY,true)){_hero.y -=4;}else{};
if(_DpadRight.hitTestPoint(touchX,touchY,true)){_hero.x +=4;}else{};
if(_DpadDown.hitTestPoint(touchX,touchY,true)){_hero.y +=4;}else{};
if(_DpadLeft.hitTestPoint(touchX,touchY,true)){_hero.x -=4;}else{};
if(_DpadReset.hitTestPoint(touchX,touchY,true)){trace("RESET hit");}else{};
_hero.update();
    }

どんな助けでも素晴らしいでしょう

これは私が望む制御システムですhttp://www.actionscript.org/forums/attachment.php3?attachmentid=38864&d=1352778655 PS 私はこのチュートリアルを見ましたhttp://gotoandlearn.com/play.php?id= . _

これはメインループだけのコードです

function mainLoop(e:Event):void {
for each(var p:Point in m_oTouchIDs)
{
    trace(p);
if(_DpadUp.hitTestPoint(p.x,p.y,true)){_hero.y -=4;}else{};
if(_DpadRight.hitTestPoint(p.x,p.y,true)){_hero.x +=4;}else{};
if(_DpadDown.hitTestPoint(p.x,p.y,true)){_hero.y +=4;}else{};
if(_DpadLeft.hitTestPoint(p.x,p.y,true)){_hero.x -=4;}else{};
if(_DpadReset.hitTestPoint(p.x,p.y,true)){trace("RESET hit");}else{};
}
_hero.update();
}

ボタンを押しても何も起こらず、そのトレースでもトレースが4回出力されます

(x=27, y=12)
(x=27, y=12)
(x=27, y=12)

理由はありますか?ボタンを押すと、そのオブジェクトの位置が表示されるので、オブジェクトの左上隅をクリックすると、x:1 と y:1 が返されることがわかりました。どうすれば衝突をテストできますか?

私はそれを修正しました:) p.localXを使用する代わりにp.stageXを使用します。これにより、タッチイベントがある場所のX位置が得られます。

4

1 に答える 1

0

TouchEvent#touchPointIDを使用してタッチ ポイントを識別し、保存する必要があります。ループ内で、これらすべてのタッチ ポイントに対してヒット テストを実行できます。

protected var m_oTouchIDs:Object = {};


protected function onTouchBegin(e:TouchEvent):void
{
    m_oTouchIDs[e.touchPointID] = new Point(e.localX, e.localY);
}

protected function onTouchMove(e:TouchPoint):void
{
    //update
    var p:Point = m_oTouchIDs[e.touchPointID] as Point;
    p.x = e.localX;
    p.y = e.localY;
}


protected function onTouchEnd(e:TouchEvent):void
{
    delete m_oTouchIDs[e.touchPointID];//release
}

protected function loop(e:Event):void
{
    for each(var p:Point in m_oTouchIDs)
    {
        trace(p);//here you can compare touch position to execute some actions
    }
    /*
    //or

    for (var id:String in m_oTouchIDs) 
    {
        m_oOutput.appendText("ID:" + id + " - " + m_oTouchIDs[id] + "\n");
    }
    */
}
于 2012-11-13T07:25:15.873 に答える