/* * Copyright (c) 2007 michiyasu wada * http://www.seyself.com/ * * Distributed under The MIT License. * [http://www.opensource.org/licenses/mit-license.php] */ package{ import flash.display.Sprite; import flash.events.Event; // Classes used in this example import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class Ball extends Sprite{ private var maze:Maze; public var m_world:b2World; public var m_iterations:int = 2;// 繰り返し public var m_timeStep:Number = 1/30;// 処理時間(?) public function Ball(){ initBox2D(); // Creat world Maze maze = new Maze(28,20); maze.create(); // Vars used to create bodies var bodyDef:b2BodyDef; var boxDef:b2BoxDef; var circleDef:b2CircleDef; var i:int, j:int; var x:int = maze.map.length; var y:int = maze.map[0].length; for(j=2;j<=y-3;j++){ for(i=2;i<=x-3;i++){ if ( maze.map[i][j] ) { createBox( i , -j ); } } } createBall( 200 , 200 ); } private function initBox2D() { // Add event for main loop addEventListener(Event.ENTER_FRAME, Update, false, 0, true); // Creat world AABB var worldAABB:b2AABB = new b2AABB(); worldAABB.minVertex.Set(-1000.0, -1000.0); worldAABB.maxVertex.Set(1000.0, 1000.0); // Define the gravity vector var gravity:b2Vec2 = new b2Vec2(0.0, 300.0); // Allow bodies to sleep var doSleep:Boolean = true; // Construct a world object m_world = new b2World(worldAABB, gravity, doSleep); } private function createBall( ix , iy ) { var size:int = 20 * 0.4; // Add some objects var bodyDef:b2BodyDef = new b2BodyDef(); // Circle var circleDef:b2CircleDef = new b2CircleDef(); circleDef.radius = size; circleDef.density = 1.0; // 比重 circleDef.friction = 0.5; // 摩擦 circleDef.restitution = 0.5; // 跳ね返り bodyDef.AddShape( circleDef ); bodyDef.userData = new PhysCircle(); bodyDef.userData.width = (circleDef.radius - 1) * 2; bodyDef.userData.height = (circleDef.radius - 1) * 2; bodyDef.userData.name = "ball"; bodyDef.position.x = ix; bodyDef.position.y = iy; m_world.CreateBody( bodyDef ); addChild( bodyDef.userData ); } private function createBox( ix , iy ) { var bodyDef:b2BodyDef; var boxDef:b2BoxDef; var size:int = 20; // Add ground body bodyDef = new b2BodyDef(); boxDef = new b2BoxDef(); boxDef.extents.Set(size*0.48, size*0.48); boxDef.friction = 0.3; bodyDef.position.Set( ix*size, iy*size+400 ); bodyDef.AddShape(boxDef); // Add sprite to body userData bodyDef.userData = new PhysGround(); bodyDef.userData.width = size; bodyDef.userData.height = size; addChild(bodyDef.userData); m_world.CreateBody(bodyDef); } public function Update(e:Event):void{ m_world.m_gravity.x = mouseX-640/2; m_world.m_gravity.y = mouseY-360/2; m_world.Step(m_timeStep, m_iterations); // Go through body list and update sprite positions/rotations for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){ if (bb.m_userData is Sprite){ bb.m_userData.x = bb.m_position.x; bb.m_userData.y = bb.m_position.y; bb.m_userData.rotation = bb.m_rotation * (180 / Math.PI); if ( bb.m_userData.name == "ball" ) { if( ballX == bb.m_position.x && ballY == bb.m_position.y ){ //bb.m_position.x += Math.random()*1; //bb.m_position.y += Math.random()*1; } ballX = bb.m_position.x; ballY = bb.m_position.y; } } } } private var ballX:Number; private var ballY:Number; } }