РЕДАКТИРОВАТЬ: я понял, что было не так, и это больше не вопрос. Решением была глупая ошибка, и я случайно установил итерации на 0. Извините!
Я только изучаю Box2D и выполняю симуляцию "hello world", но у меня возникла проблема.
У меня падает объект ящика, и он должен упасть на землю и сгладиться / подпрыгнуть, однако ящик полностью игнорирует тело пола и продолжает.
Я рендерил все, используя debugDraw, и не изменил исходный код. Я использую версию 2.0.2.
.swf можно найти здесь .
Мой класс Main.as выглядит следующим образом:
// Main.as
//
//
/*
/ TODO:
/
/ *Collision not working
/
/ *Correct todo list size
/
/ *Fill empty area of todo list with useless items
/
/ *Stop writing comments at 2AM.
/
*/
package
{
import flash.display.*
import flash.events.*
import flash.display.MovieClip;
import Box2D.Collision.*
import Box2D.Collision.Shapes.*
import Box2D.Common.*
import Box2D.Common.Math.*
import Box2D.Dynamics.*
public class Main extends MovieClip
{
public static const RATIO:int = 30
private var world:b2World
private var crate:b2Body
private var timeStep:Number = 1/60
private var iterations:int = 0
public function Main()
{
createWorld()
createShapes()
addCrate()
startDebug()
stage.addEventListener(Event.ENTER_FRAME, loop)
}
private function startDebug()
{
var drawing:Sprite = new Sprite()
addChild(drawing)
var drawer:b2DebugDraw = new b2DebugDraw()
drawer.m_sprite = drawing
drawer.m_drawScale = RATIO
drawer.SetFlags(b2DebugDraw.e_shapeBit)
drawer.m_lineThickness = 2
drawer.m_fillAlpha = .8
world.SetDebugDraw(drawer)
}
private function loop(e:Event)
{
world.Step(timeStep, iterations)
//tracing
trace('X: ' + crate.GetPosition().x * RATIO + '; Y: ' + crate.GetPosition().y * RATIO)
}
private function addCrate()
{
//Add falling block and shit, IDK.
// Coords should be 230, 15.
var crateDef:b2BodyDef = new b2BodyDef()
crateDef.position.Set(230 / RATIO, -40 / RATIO)
crateDef.angle = 30
var crateShapeDef:b2PolygonDef = new b2PolygonDef()
crateShapeDef.SetAsBox(25 / RATIO ,25 / RATIO)
crateShapeDef.density = .7
crateShapeDef.friction = .4
crateShapeDef.restitution = .6
crate = world.CreateBody(crateDef)
crate.CreateShape(crateShapeDef)
crate.SetMassFromShapes()
trace('Crate added, biatch.')
stage.addEventListener(Event.ENTER_FRAME, loop)
}
private function createWorld()
{
var universeAABB:b2AABB = new b2AABB()
universeAABB.lowerBound.Set(-3000 / RATIO,-3000 / RATIO)
universeAABB.upperBound.Set(3000 / RATIO,3000 / RATIO)
var gravity:b2Vec2 = new b2Vec2(0, 15)
var ignoreSleep:Boolean = true
world = new b2World(universeAABB, gravity, ignoreSleep)
trace('World created, ' + world.GetBodyCount() + ' bodies contained within.')
}
private function createShapes()
{
var floorRectDef:b2PolygonDef = new b2PolygonDef()
floorRectDef.SetAsBox(275 / RATIO, 5 / RATIO)
floorRectDef.friction = 0.4
floorRectDef.restitution = 0.4
floorRectDef.density = 0
var floorBodyDef:b2BodyDef = new b2BodyDef()
floorBodyDef.position.Set(275 / RATIO, 395 / RATIO)
var floorBody:b2Body = world.CreateBody(floorBodyDef)
floorBody.CreateShape(floorRectDef)
floorBody.SetMassFromShapes()
var wallShapeDef:b2PolygonDef = new b2PolygonDef()
wallShapeDef.SetAsBox(5 / RATIO, 195 / RATIO)
wallShapeDef.friction = 0.4
wallShapeDef.restitution = 0.4
wallShapeDef.density = 0
var wallBodyDef:b2BodyDef = new b2BodyDef()
wallBodyDef.position.Set(5 / RATIO, 195 / RATIO)
var leftWall:b2Body = world.CreateBody(wallBodyDef)
leftWall.CreateShape(wallShapeDef)
wallBodyDef.position.Set(545 / RATIO, 195 / RATIO)
var rightWall:b2Body = world.CreateBody(wallBodyDef)
rightWall.CreateShape(wallShapeDef)
trace('Walls created, simulation now has ' + world.GetBodyCount() + ' bodies.')
}
}
}
Заранее спасибо за вашу помощь, вы никогда не подводили меня, когда я застрял в проблеме.