HardCoder |
30.06.2012 09:52 |
Цитата:
Сообщение от 54321go
(Сообщение 1086686)
|
Не читал другие, но эти уроки настоятельно рекомендую. 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();
}
}
}
|