我已经编写了一些代码来开始我的游戏,我现在想将控件从鼠标更改为触摸事件,以便我可以在我的 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();
}
}
}