Показать сообщение отдельно
Старый 30.06.2012, 09:52
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 6  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Цитата:
Сообщение от 54321go Посмотреть сообщение
http://redefy.net/category/box2dflash/ здесь хорошие уроки
Не читал другие, но эти уроки настоятельно рекомендую. Box2D осилил за один день по ним .
PS: Так как информация осваивается слишком быстро, то свойственно скоро забывать пройденное. Поэтому сразу советую написать небольшую утилитку, обобщающую некоторые методы. Вот, например, моя. Прошу не судить строго - я к этому классу еще не возвращался. Писал в первый день во время изучения box2D:
Код AS3:
package {
	import Box2D.Collision.Shapes.*;
	import Box2D.Common.Math.*;
	import Box2D.Dynamics.*;
	import flash.display.*;
	import game.subjects.*;
 
	/**
	 * Box2D basic transformations
	 * @author HardCoder
	 */
	public class B2Transformer {
		/**
		 * Constant of transformation pixels/meters
		 */
		public static const METERS:int = 30;
		/**
		 * Constant to update world
		 */
		public static const TIMES_STEP:Number = 1 / 60;
		/**
		 * Constant to update world
		 */
		public static const VELOCITY_ITERATIONS:int = 10;
		/**
		 * Constant to update world
		 */
		public static const POSITION_ITERATIONS:int = 10;
 
		public function B2Transformer() {
		}
 
		/**
		 * Converts meters to pixels
		 * @param	meters - number of meters
		 * @return	number of pixels
		 */
		public static function metersTopixels(meters:Number):Number {
			return METERS * meters;
		}
 
		/**
		 * Converts  pixels to meters
		 * @param	pixels - number of pixels
		 * @return	number of meters
		 */
		public static function pixelsToMeters(pixels:Number):Number {
			return pixels / METERS;
		}
 
		/**
		 * Create Box2D world
		 * @param	gravity - world gravity
		 * @return	Box2D world
		 */
		public static function createWorld(gravity:b2Vec2 = null):b2World {
			if (!gravity)
				gravity = b2Vec2.Make(0, 0);
			return new b2World(gravity, true);
		}
 
		/**
		 * Adds the debug drawing to b2World
		 * @param	world - b2World
		 * @param	sprite - sprite, where graphics will be displayed
		 */
		public static function addDebugDraw(world:b2World, sprite:Sprite):void {
			var debugDraw:b2DebugDraw = new b2DebugDraw();
			debugDraw.SetSprite(sprite);
			debugDraw.SetDrawScale(30);
			debugDraw.SetFillAlpha(0.5);
			debugDraw.SetLineThickness(1);
			debugDraw.SetFlags(b2DebugDraw.e_jointBit | b2DebugDraw.e_shapeBit);
			world.SetDebugDraw(debugDraw);
		}
 
		/**
		 * Creates circle body to b2World
		 * @param	world - b2World
		 * @param	type - (b2Body.b2_staticBody:uint = 0, b2Body.b2_kinematicBody:uint = 1, b2Body.b2_dynamicBody:uint = 2)
		 * @param	x - position in the world in pixels
		 * @param	y - position in the world in pixels
		 * @param	radius - circle radius in pixels
		 * @param	userData - data that is linked to this body
		 * @param	allowSleep - will the body be automaticly deactivated
		 * @return	b2Body
		 */
		public static function createCircleBody(world:b2World, type:uint, x:Number, y:Number, radius:Number, userData:* = null, allowSleep:Boolean = true):b2Body {
			var bodyDef:b2BodyDef = new b2BodyDef();
			bodyDef.type = type;
			bodyDef.allowSleep = allowSleep;
			bodyDef.userData = userData;
			bodyDef.position.Set(B2Transformer.pixelsToMeters(x), B2Transformer.pixelsToMeters(y));
			var body:b2Body = world.CreateBody(bodyDef);
			var circleShape:b2CircleShape = new b2CircleShape(B2Transformer.pixelsToMeters(radius))
			var fixture:b2FixtureDef = new b2FixtureDef();
			fixture.density = 1000;
			fixture.friction = 0;
			fixture.restitution = 0;
			fixture.shape = circleShape;
			body.CreateFixture(fixture);
			return body;
		}
 
		/**
		 * Creates polygon body to b2World
		 * @param	world - b2World
		 * @param	type - (b2Body.b2_staticBody = 0, b2Body.b2_kinematicBody = 1, b2Body.b2_dynamicBody = 2)
		 * @param	x - position in the world in pixels
		 * @param	y - position in the world in pixels
		 * @param	width - poligon width in pixels
		 * @param	height - poligon height in pixels
		 * @param	userData - data that is linked to this body
		 * @param	allowSleep - will the body be automaticly deactivated
		 * @return	b2Body
		 */
		public static function createPolygonBody(world:b2World, type:uint, x:Number, y:Number, width:Number, height:Number, userData:* = null, allowSleep:Boolean = true):b2Body {
			var bodyDef:b2BodyDef = new b2BodyDef();
			bodyDef.type = type;
			bodyDef.allowSleep = allowSleep;
			bodyDef.userData = userData;
			bodyDef.position.Set(B2Transformer.pixelsToMeters(x), B2Transformer.pixelsToMeters(y));
			var body:b2Body = world.CreateBody(bodyDef);
			var polygonShape:b2PolygonShape = b2PolygonShape.AsBox(B2Transformer.pixelsToMeters(width) / 2, B2Transformer.pixelsToMeters(height) / 2);
			var fixture:b2FixtureDef = new b2FixtureDef();
			fixture.density = 2;
			fixture.friction = 0;
			fixture.restitution = 0;
			fixture.shape = polygonShape;
			body.CreateFixture(fixture);
			return body;
		}
	}
}
Добавлено через 3 минуты
Ну и, конечно, в методах можно по своему настроить density, friction и restitution. Я писал под конкретную игру, поэтому эти свойства фиксированы.

Добавлено через 11 минут
раз уж начал, то и пример использования:
Код AS3:
package {
	import Box2D.Common.Math.b2Vec2;
	import Box2D.Dynamics.b2World;
	import flash.display.Sprite;
	import flash.events.Event;
 
	/**
	 * ...
	 * @author HardCoder
	 */
	public class Main extends Sprite {
		private var _world:b2World;
 
		public function Main() {
			this._world = B2Transformer.createWorld(new b2Vec2(0, 10));
			B2Transformer.addDebugDraw(this._world, this);
			B2Transformer.createCircleBody(this._world, 2, 100, 20, 20);
			B2Transformer.createPolygonBody(this._world, 0, 0, 300, 600, 30);
			this.addEventListener(Event.ENTER_FRAME, loop);
		}
 
		private function loop(e:Event):void {
			this._world.Step(B2Transformer.TIMES_STEP, B2Transformer.VELOCITY_ITERATIONS, B2Transformer.POSITION_ITERATIONS);
			this._world.ClearForces();
			this._world.DrawDebugData();
		}
	}
}
__________________
Я мало чего умею, но зато хорошо умею учиться...