将AS3代码从鼠标转换为ios Touch事件

时间:2012-09-04 13:55:44

标签: actionscript-3 flash box2d

我已经编写了一些代码来开始我的游戏,我现在想要将控件从鼠标更改为触摸事件,以便我可以在我的ipad上使用它。

下面的代码是我有多远,但我无法弄清楚如何改变它以使用触摸和拖动

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 个答案:

答案 0 :(得分:2)

所有标准光标和鼠标事件都应转换为触摸屏。障碍是当你开始使用多点触控,但浏览你的代码时,它看起来还没有任何实际上要求多点触控数据的东西。我不确定box2d libs是否需要多点触控支持而不是常规鼠标事件,但是你的错误很可能来自那些调用“触摸”相关变量的库,这些变量可能会或可能不会被创建,具体取决于你在你的位置游戏。你是否真的关注多重支持以及你得到的错误究竟是什么?