Показать сообщение отдельно
Старый 24.03.2020, 21:51   #3
Sikkyboy
AnyKey`щик
 
Регистрация: 22.03.2020
Сообщений: 6
Написано одно полезное сообщение
Ответ: Эксперименты с box2d

Разобрался с рендером по умолчанию. Он описан в файле "render.bmx". Исполюзуется для отладочного изображения. При разработке программ очень необходим. Я написал два примера с рендером по умолчанию. Что-бы они запустились их нужно создать в папке BlitzMax\mod\bah.mod\box2d.mod\examples( render.bmx там лежит, или указать полный путь к нему при импорте).
Первый пример повторяет пример из первого сообщения, однако не нужно самому перебирать вершины форм - это сделает рендер и нарисует.

Framework BaH.Box2D

Import BRL.StandardIO
Import BRL.LinkedList


Import BRL.FreeTypeFont
Import "render.bmx"

Const WORLD_WIDTH:Float=700
Const WORLD_HEIGHT:Float=500

Local worldAABB:b2AABB = New b2AABB.Create()
worldAABB.SetLowerBound(New b2Vec2.Create(0.0, 0.0))
worldAABB.SetUpperBound(New b2Vec2.Create(WORLD_WIDTH, WORLD_HEIGHT))

Local gravity:b2Vec2 = New b2Vec2.Create(0.0, -10.0)

Local doSleep:Int = True

Local world:b2World = New b2World.Create(worldAABB, gravity, doSleep)
Local m_debugDraw:b2DebugDraw = New debugDraw
m_debugDraw.SetFlags(5)
xScale=1
yScale=1
world.SetWarmStarting(1)
world.SetContinuousPhysics(1)

world.SetDebugDraw(m_debugDraw)

Local groundBodyDef:b2BodyDef = New b2BodyDef
groundBodyDef.SetPosition(New b2Vec2.Create(350.0, 10.0))

Local groundBody:b2Body = world.CreateBody(groundBodyDef)

Local groundShapeDef:b2PolygonDef = New b2PolygonDef
groundShapeDef.SetAsBox(350.0, 10.0)

groundBody.CreateShape(groundShapeDef)

Local bodyDef:b2BodyDef = New b2BodyDef
bodyDef.SetPosition(New b2Vec2.Create(350.0, 400.0))
Local body:b2Body = world.CreateBody(bodyDef)

Local shapeDef:b2PolygonDef = New b2PolygonDef
shapeDef.SetAsBox(10.0, 10.0)
shapeDef.SetDensity(1.0)
shapeDef.SetFriction(0.3)
body.CreateShape(shapeDef)
body.SetMassFromShapes()

Local timeStep:Float = 1.0 / 60.0
Local iterations:Int = 10

Graphics WORLD_WIDTH,WORLD_HEIGHT
SetOrigin(0,WORLD_HEIGHT)
While Not KeyHit( KEY_ESCAPE )
	
	Cls()
	world.DoStep(timeStep, iterations,8)
	world.Validate()
	Flip()

Wend
Во втором примере можно гонять шарик стрелочками( очень медленно).

Framework BaH.Box2D

Import BRL.StandardIO
Import BRL.LinkedList


Import BRL.FreeTypeFont
Import "render.bmx"

Const WORLD_WIDTH:Float=700
Const WORLD_HEIGHT:Float=500

Local worldAABB:b2AABB = New b2AABB.Create()
worldAABB.SetLowerBound(New b2Vec2.Create(0.0, 0.0))
worldAABB.SetUpperBound(New b2Vec2.Create(WORLD_WIDTH, WORLD_HEIGHT))

Local gravity:b2Vec2 = New b2Vec2.Create(0.0, -10.0)

Local doSleep:Int = True

Local 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(350.0, 10.0))

Local groundBody:b2Body = world.CreateBody(groundBodyDef)

Local groundShapeDef:b2PolygonDef = New b2PolygonDef
groundShapeDef.SetAsBox(350.0, 10.0)

groundBody.CreateShape(groundShapeDef)

Local bodyDef:b2BodyDef = New b2BodyDef
bodyDef.SetPosition(New b2Vec2.Create(350.0, 400.0))
Local body:b2Body = world.CreateBody(bodyDef)

Local shapeDef:b2PolygonDef = New b2PolygonDef
shapeDef.SetAsBox(10.0, 10.0)
shapeDef.SetDensity(1.0)
shapeDef.SetFriction(0.3)
body.CreateShape(shapeDef)
body.SetMassFromShapes()

Local circ:b2CircleDef = New b2CircleDef
		circ.SetDensity(0.002)
		circ.SetRadius(10)
		circ.SetFriction(0.8)

		
Local circbody:b2BodyDef= New b2BodyDef
		'circbody.SetAllowSleep(False)
		circbody.SetPosition(New b2Vec2.Create(100.0,100.0))
		
Local		Wheel:b2Body = world.CreateBody(circbody)
		Wheel.CreateShape(circ)
		Wheel.SetMassFromShapes()

Local timeStep:Float = 1.0 / 60.0
Local iterations:Int = 10

Graphics WORLD_WIDTH,WORLD_HEIGHT

SetOrigin(0,WORLD_HEIGHT)
SetColor(0,255,0)

While Not KeyHit( KEY_ESCAPE )
	
	Cls()


	world.DoStep(timeStep, iterations,8)
	world.Validate()
	If KeyDown (KEY_RIGHT) Then Wheel.applyTorque(-500.0)
	If KeyDown (KEY_LEFT) Then Wheel.applyTorque(500.0)

	
	Flip()

Wend
А теперь о неприятной засаде. Рендер всегда импортируется именно в две строчки
Import BRL.FreeTypeFont
Import "render.bmx"
В файле рендера есть зумирование в 8 раз! Поэтому через глобальные настройки рендера в своём проекте нужно убрать зумирование, вот так
xScale=1
yScale=1
Но это ещё не всё. Почему-то рендеру надо задовать смещение в ширину мира(или экрана, надо проверить, так как у меня ширина мира равна ширине экрана).
SetOrigin(0,WORLD_HEIGHT)
Иначе он неправильно выводит объекты.
Надо ещё включить рендер! Командой
Рендер.SetFlags(Флаги)
где флаги совмещаются по OR
Флаги

e_shapeBit = 0x0001, ///< draw shapes
e_jointBit = 0x0002, ///< draw joint connections
e_coreShapeBit = 0x0004, ///< draw core (TOI) shapes
e_aabbBit = 0x0008, ///< draw axis aligned bounding boxes
e_obbBit = 0x0010, ///< draw oriented bounding boxes
e_pairBit = 0x0020, ///< draw broad-phase pairs
e_centerOfMassBit = 0x0040, ///< draw center of mass frame
e_controllerBit = 0x0080, ///< draw controllers

Последний раз редактировалось Sikkyboy, 25.03.2020 в 00:04.
(Offline)
 
Ответить с цитированием