Везде попадается только версия 2.1 или 2.1а, в то время как уроки (и на русском, и на английском) только по версии 2.0 или 2.01. Не знаю, сильно ли они различаются по функционалу, но имена функций изменены существенно.
[Ответ]
Вопрос людям, которые знакомы с разработкой 2D-игр.
Сейчас делаю 2D-слешер на ActionScript3. Дело в том, что в играх,которые я делал раньше, никогда не было персонажей - делал крестики-нолики, шашки, танчики, змейку и т.д. А теперь появился вопрос - персонажей нужно анимировать отдельно и просто проигрывать в игре анимации или всё делать через физ. движок (т.е. делать персонажа составным и вместо анимации прикладывать к рукам/ногам силы в определённых направлениях)? Первый способ проще, конечно, но у меня хардкорный слешер - почти имитация фехтования. Т.е., например, бьёт игрок противника рубящим ударом в голову - NPC заблокировал удар, и мечи скрестились. Анимация здесь не подойдёт, похоже.
Я правильно мыслю?
[Ответ]
В общем, написал я что-то вроде Hello, world! в Box2D с учётом изменений в новой версии - но оно не работает. Т.е. ошибок и креша нет, но выводит чистый экран и не меняет координаты. Если кто-нибудь умеет работать с этим движком, объясните, что я делаю неправильно.
Код:
package {
import Box2D.Collision.Shapes.b2CircleShape;
import Box2D.Collision.Shapes.b2MassData;
import Box2D.Collision.b2AABB;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2Fixture;
import Box2D.Dynamics.b2FixtureDef;
import Box2D.Dynamics.b2World;
import flash.display.Sprite;
public class TestBox2D extends Sprite
{
public function TestBox2D()
{
var worldb2AABB:b2AABB = new b2AABB();
worldb2AABB.lowerBound.Set(-100.0, -100.0);
worldb2AABB.upperBound.Set(100.0, 100.0);
var gravity:b2Vec2=new b2Vec2(0.0, -10.0);
var doSleep:Boolean=true;
var world:b2World=new b2World(gravity, doSleep);
var groundBodyDef:b2BodyDef=new b2BodyDef();
groundBodyDef.position.Set(0.0, -10.0);
var groundBody:b2Body =
world.CreateBody(groundBodyDef);
var fd:b2FixtureDef = new b2FixtureDef();
fd.density = 1.0;
fd.shape = new b2CircleShape(5.0);
var fixture:b2Fixture = groundBody.CreateFixture(fd);
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set(0.0, 4.0);
var body:b2Body = world.CreateBody(bodyDef);
var bodyFD:b2FixtureDef=new b2FixtureDef();
bodyFD.density=1.0;
bodyFD.friction=0.3;
bodyFD.shape=new b2CircleShape(1.0);
var bodyFixture:b2Fixture = body.CreateFixture(bodyFD);
var bodyMD:b2MassData = new b2MassData();
bodyMD.mass=0.2;
var massCenter:b2Vec2=new b2Vec2();
massCenter.x=0; massCenter.y=0;
bodyMD.center=massCenter;
body.SetMassData(bodyMD);
var timeStep:Number = 1.0 / 60.0;
var iterations:Number = 10;
for (var i:Number = 0; i < 60; ++i)
{
world.Step(timeStep, iterations, 20);
var position:b2Vec2 = body.GetPosition();
var angle:Number = body.GetAngle();
trace(position.x +','+ position.y +','+ angle);
}
}
}
}
[Ответ]