Разобрался с рендером по умолчанию. Для правильного вывода нужно задавать смещение в высоту экрана(окна).
Пример(Для работы примеров нужно скопировать в папку проекта render.bmx из BlitzMax\mod\bah.mod\box2d.mod\examples):
Framework BaH.Box2D
Import BRL.StandardIO
Import BRL.LinkedList
Import BRL.FreeTypeFont
Import "render.bmx"
Const WORLD_WIDTH:Float=400
Const WORLD_HEIGHT:Float=300
Global worldAABB:b2AABB = New b2AABB.Create()
worldAABB.SetLowerBound(New b2Vec2.Create(0.0, 0.0))
worldAABB.SetUpperBound(New b2Vec2.Create(WORLD_WIDTH, WORLD_HEIGHT))
Global gravity:b2Vec2 = New b2Vec2.Create(0.0, -10.0)
Global doSleep:Int = True
Global world:b2World = New b2World.Create(worldAABB, gravity, doSleep)
Local m_debugDraw:b2DebugDraw = New debugDraw
m_debugDraw.SetFlags(131)
xScale=1
yScale=1
world.SetWarmStarting(1)
world.SetContinuousPhysics(1)
world.SetDebugDraw(m_debugDraw)
Local groundBodyDef:b2BodyDef = New b2BodyDef
groundBodyDef.SetPosition(New b2Vec2.Create(200, 10.0))
Local groundBody:b2Body = world.CreateBody(groundBodyDef)
Local groundShapeDef:b2PolygonDef = New b2PolygonDef
groundShapeDef.SetAsBox(200.0, 10.0)
'groundShapeDef.setFriction(1)
groundBody.CreateShape(groundShapeDef)
Local cd:b2CircleDef = New b2CircleDef
cd.SetRadius(2.0)
cd.SetDensity(1.0)
Local restitution:Float[] = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5,0.6,0.7,0.8,0.9,1.0]
Local j:Int=0
For Local i:Int = 0 Until 77
Local bd:b2BodyDef = New b2BodyDef
bd.SetPositionXY(10 + 5.0 * i, 200.0)
Local body:b2Body = world.CreateBody(bd)
If i<11 Then
j=i
Else
j=i-11*(Int(Float(i)/11.0))
EndIf
cd.SetRestitution(restitution[j])
body.CreateShape(cd)
body.SetMassFromShapes()
Next
Local timeStep:Float = 1.0 / 60.0
Local iterations:Int = 10
Const SCREEN_WIDTH:Float=700
Const SCREEN_HEIGHT:Float=500
Graphics SCREEN_WIDTH,SCREEN_HEIGHT
SetOrigin(0,SCREEN_HEIGHT)
While Not KeyHit( KEY_ESCAPE )
Cls()
world.DoStep(timeStep, iterations,8)
world.Validate()
Flip()
Wend
На основе материала
https://habr.com/ru/post/199064/
сделал капсулу коллизий (хотя в материале не капсула, а прямоугольник) и управление как у платформера:
Framework BaH.Box2D
Import BRL.StandardIO
Import BRL.LinkedList
Import BRL.FreeTypeFont
Import "render.bmx"
SuperStrict
Const WORLD_WIDTH:Float=70
Const WORLD_HEIGHT:Float=50
Global worldAABB:b2AABB = New b2AABB.Create()
worldAABB.SetLowerBound(New b2Vec2.Create(0.0, 0.0))
worldAABB.SetUpperBound(New b2Vec2.Create(WORLD_WIDTH, WORLD_HEIGHT))
Global gravity:b2Vec2 = New b2Vec2.Create(0.0, -10.0)
Global doSleep:Int = True
Global world:b2World = New b2World.Create(worldAABB, gravity, doSleep)
Local m_debugDraw:b2DebugDraw = New debugDraw
m_debugDraw.SetFlags(131)
xScale=10
yScale=10
world.SetWarmStarting(1)
world.SetContinuousPhysics(1)
world.SetDebugDraw(m_debugDraw)
Local groundBodyDef:b2BodyDef = New b2BodyDef
groundBodyDef.SetPosition(New b2Vec2.Create(35, 1.0))
Local groundBody:b2Body = world.CreateBody(groundBodyDef)
Local groundShapeDef:b2PolygonDef = New b2PolygonDef
groundShapeDef.SetAsBox(35.0, 1.0)
groundShapeDef.setFriction(1)
groundBody.CreateShape(groundShapeDef)
Local leftBodyDef:b2BodyDef = New b2BodyDef
leftBodyDef.SetPosition(New b2Vec2.Create(1, 25.0))
Local leftBody:b2Body = world.CreateBody(leftBodyDef)
Local boundShapeDef:b2PolygonDef = New b2PolygonDef
boundShapeDef.SetAsBox(1.0, 24.0)
boundShapeDef.SetFriction(0.0)
leftBody.CreateShape(boundShapeDef)
Local rightBodyDef:b2BodyDef = New b2BodyDef
rightBodyDef.SetPosition(New b2Vec2.Create(69, 25.0))
Local RightBody:b2Body = world.CreateBody(rightBodyDef)
rightBody.CreateShape(boundShapeDef)
Global cd:b2CircleDef = New b2CircleDef
cd.SetRadius(0.35)
cd.SetDensity(0.3)
cd.setrestitution(0.0)
cd.setfriction(0.8)
Local corpusShapeDef:b2PolygonDef = New b2PolygonDef
corpusShapeDef.SetAsBox(0.357, 0.65)
corpusShapeDef.setrestitution(0.0)
corpusShapeDef.setDensity(0.3)
Global bd:b2BodyDef = New b2BodyDef
bd.SetPositionXY(35.0, 15.0)
bd.setfixedRotation(1)
bd.setissleeping(0)
Global body:b2Body = world.CreateBody(bd)
body.CreateShape(corpusShapeDef)
cd.setlocalposition(New b2Vec2.Create(0.0,0.65))
body.CreateShape(cd)
cd.setlocalposition(New b2Vec2.Create(0.0,-0.65))
Global bottom:b2Shape = body.CreateShape(cd)
body.SetMassFromShapes()
Global OnSurface:Int=0
Type MyContactListener Extends b2ContactListener
Rem
Method Add(point:b2ContactPoint)
If(point.getShape1()=bottom Or point.getShape2()=bottom) Then OnSurface=1
End Method
End Rem
Method Persist(point:b2ContactPoint)
If(point.getShape1()=bottom Or point.getShape2()=bottom) Then OnSurface=1
End Method
Method Remove(point:b2ContactPoint)
OnSurface=0
End Method
End Type
world.setContactListener( New MyContactListener)
Local timeStep:Float = 1.0 / 60.0
Local iterations:Int = 10
Const SCREEN_WIDTH:Float=700
Const SCREEN_HEIGHT:Float=500
Graphics SCREEN_WIDTH,SCREEN_HEIGHT
SetOrigin(0,SCREEN_HEIGHT)
While Not KeyHit( KEY_ESCAPE )
Local Velocity:b2Vec2=body.getlinearvelocity()
If(KeyDown(KEY_RIGHT)) Then
body.wakeup()
If Velocity.getx()<10 Then
Velocity.setx(10.0)
body.setlinearVelocity(Velocity)
EndIf
EndIf
If(KeyDown(KEY_LEFT)) Then
body.wakeup()
If Velocity.getx()>-10 Then
Velocity.setx(-10.0)
body.setlinearVelocity(Velocity)
EndIf
EndIf
If(KeyDown(KEY_UP)) Then
'body.getcontactlist()
body.wakeup()
If OnSurface= 1 Then
Velocity.sety(10.0)
body.setlinearVelocity(Velocity)
OnSurface=0
EndIf
EndIf
Cls()
world.DoStep(timeStep, iterations,8)
world.Validate()
Flip()
Wend
Для стабильной работы нужно правильно реализовывать ContactListener, а также делать радиус входящих в капсулу окружностей чуть меньшим чем ширина прямоугольного корпуса капсулы.