2012-09-04 79 views
0

我已經寫了一些代碼開始我的遊戲,我現在想要更改控件從鼠標到觸摸事件,所以我可以在我的ipad上使用它。將AS3代碼從鼠標轉換爲ios觸摸事件

下面的代碼是多遠我有,但我可以不知道如何去改變它與觸摸工作,並拖動

package { 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.events.TouchEvent; 
    import flash.ui.Multitouch; 
    import flash.ui.MultitouchInputMode 
    import Box2D.Dynamics.*; 
    import Box2D.Collision.*; 
    import Box2D.Collision.Shapes.*; 
    import Box2D.Common.Math.*; 
    import Box2D.Dynamics.Joints.*; 

    public class Main extends Sprite { 

     private var world:b2World; 
     private var worldScale:Number = 30; 
     private var mouseJoint:b2MouseJoint; 
     Multitouch.inputMode=MultitouchInputMode.TOUCH_POINT;  

     var myBlock:Array = new Array(
      new Block(), 
      new Block(), 
      new Block() 
     ); 



     public function Main() { 

      addChild(myBlock[0]); 
      addChild(myBlock[1]); 
      addChild(myBlock[2]); 



      world = new b2World(new b2Vec2(0,9.81),true); 
      debugDraw(); 
      var bodyDef:b2BodyDef=new b2BodyDef(); 
      bodyDef.position.Set(320/worldScale,470/worldScale); 

      var polygonShape:b2PolygonShape=new b2PolygonShape(); 
      polygonShape.SetAsBox(320/worldScale,10/worldScale); 

      var fixtureDef:b2FixtureDef=new b2FixtureDef(); 
      fixtureDef.friction = 1; 
      fixtureDef.restitution = 0.5; 
      fixtureDef.shape = polygonShape; 
      var groundBody:b2Body = world.CreateBody(bodyDef); 
      groundBody.CreateFixture(fixtureDef); 

      for (var i:int=0; i<3; i++) { 
       createBox(Math.random()*500+70,400,b2Body.b2_dynamicBody); 
       var targetBox:TargetBox=new TargetBox(); 
       addChild(targetBox); 
       targetBox.x = 220 + i * 100; 
       targetBox.y = 180; 
      } 

      addEventListener(Event.ENTER_FRAME,updateWorld); 

      stage.addEventListener(TouchEvent.TOUCH_BEGIN, createJoint); 
     } 
     private function createBox(pX:Number,pY:Number,type:int):void { 
      var bodyDef:b2BodyDef=new b2BodyDef(); 
      bodyDef.position.Set(pX/worldScale,pY/worldScale); 
      bodyDef.type = type; 
      var polygonShape:b2PolygonShape=new b2PolygonShape(); 
      polygonShape.SetAsBox(30/worldScale,30/worldScale); 
      var fixtureDef:b2FixtureDef=new b2FixtureDef(); 
      fixtureDef.shape = polygonShape; 
      fixtureDef.density = 1; 
      fixtureDef.friction = 0.5; 
      fixtureDef.restitution = 0.2; 
      var box:b2Body = world.CreateBody(bodyDef); 
      box.CreateFixture(fixtureDef); 
     } 
     private function createJoint(e:TouchEvent):void { 
      world.QueryPoint(queryCallback,mouseToWorld()); 
     } 
     private function queryCallback(fixture:b2Fixture):Boolean { 
      var touchedBody:b2Body = fixture.GetBody(); 
      if (touchedBody.GetType() == b2Body.b2_dynamicBody) { 
       var jointDef:b2MouseJointDef=new b2MouseJointDef(); 
       jointDef.bodyA = world.GetGroundBody(); 
       jointDef.bodyB = touchedBody; 
       jointDef.target = mouseToWorld(); 
       jointDef.maxForce = 1000 * touchedBody.GetMass(); 
       mouseJoint = world.CreateJoint(jointDef) as b2MouseJoint; 
       stage.addEventListener(TouchEvent.TOUCH_MOVE, moveJoint); 


       stage.addEventListener(TouchEvent.TOUCH_END, finish); 
       stage.addEventListener(TouchEvent.TOUCH_END,killJoint); 
      } 
      return false; 
     } 
     private function moveJoint(e:TouchEvent):void { 
      mouseJoint.SetTarget(mouseToWorld()); 
     } 
     private function killJoint(e:TouchEvent):void { 
      world.DestroyJoint(mouseJoint); 
      mouseJoint = null; 
      stage.removeEventListener(TouchEvent.TOUCH_MOVE,moveJoint); 
      stage.removeEventListener(TouchEvent.TOUCH_END,killJoint); 
      stage.removeEventListener(TouchEvent.TOUCH_END,finish); 

     } 
     private function mouseToWorld():b2Vec2 { 
      return new b2Vec2(mouseX/worldScale,mouseY/worldScale); 
     } 
     private function debugDraw():void { 
      var debugDraw:b2DebugDraw=new b2DebugDraw(); 
      var debugSprite:Sprite=new Sprite(); 
      addChild(debugSprite); 
      debugDraw.SetSprite(debugSprite); 
      debugDraw.SetDrawScale(worldScale); 
      debugDraw.SetFlags(b2DebugDraw.e_shapeBit|b2DebugDraw.e_jointBit); 
      debugDraw.SetFillAlpha(0.5); 
      world.SetDebugDraw(debugDraw); 
     } 
     private function finish(e:TouchEvent):void { 
      for (var b:b2Body=world.GetBodyList(); b; b=b.GetNext()) { 
       for (var i:int=0; i<3; i++) { 
        var distX:Number = b.GetPosition().x * worldScale - (220 + i * 100); 
        var distY:Number = b.GetPosition().y * worldScale - 180; 

        if (distX*distX+distY*distY<900 && b.GetType()==b2Body.b2_dynamicBody) { 

        world.DestroyBody(b); 
        createBox(220 + i * 100,180,b2Body.b2_staticBody); 
        } 

       } 
      } 


     } 

     private function updateWorld(e:Event):void { 
      world.Step(1/30,10,10); 
      world.ClearForces(); 

       var m=0; 
       for (var b:b2Body=world.GetBodyList(); b; b=b.GetNext()) { 
        if (m==3) {m=0;} 
        var distX:Number = b.GetPosition().x * worldScale - (220 + m * 100); 
        var distY:Number = b.GetPosition().y * worldScale - 180; 

        if (b.GetType()==b2Body.b2_dynamicBody) { 
         myBlock[m].x = distX + (220 + m * 100); 
         myBlock[m].y = distY + 180; 
         myBlock[m].rotation = b.GetAngle() * 180/Math.PI; 

        } 

        m++ 
       } 

      world.DrawDebugData(); 
     } 
    } 
} 
+1

你需要更具體,它怎麼不工作?你有錯誤嗎? – BadFeelingAboutThis

+1

除了@LondonDrugs_MediaServices問題,我會建議看看,如果你真的需要觸摸而不是鼠標。觸摸鼠標事件在iPad和其他設備上觸發就很好,並且具有在非觸摸平臺上也能正常工作的優點。觸摸事件給你帶來的唯一好處是它們提供了多點觸控支持,但這並不是很多時候需要的。 –

回答

2

所有標準的鼠標和鼠標事件應該翻譯成觸摸屏。障礙在於當你開始使用多點觸控,但瀏覽代碼時,它看起來還沒有看到實際上需要多點觸控數據的任何東西。我不確定box2d庫是否需要多點觸控支持而不是常規的鼠標事件,但是你的錯誤很可能來自那些調用一個「touch」相關變量的庫,這個變量可能已經創建,也可能不會創建,這取決於你在哪裏遊戲。你是否真的關心多重支持?你得到的錯誤究竟是什麼?