handdator

Visa fullständig version : Får inte igång Box2D..



pponmm
2014-02-11, 17:58
Tjenare tjenare!

JAG HÅLLER PÅ ATT BLI GALEN! Nu är det såhär att jag har suttit och försökt att få igång Box2D i stort sett sedan jag vaknade idag, men jag klarar verkligen inte av det! :mad:

Först satt jag i ungefär fyra timmar bara för att lyckas bygga ihop biblioteket så att det skulle fungera ihop med allt annat jag hade tänkt att använda.. Sedan kommer det inte upp några fysiska kroppar i programmet när jag kör det..

Jag har börjat om från noll säkert tiohundratusen gånger nu, men ÄNTLIGEN! ÄNTLIGEN har jag lyckats få något att hända.

Jag kan nu skapa fallande fyrkantiga block som kan kollidera med varandra, jag kan även skapa statiska block som även dom kan kollidera (men de gör ju inte så mycket iof).

Nu är i alla fall problemet att mina kroppar beter sig otroligt konstigt, dom flyter in i varandra och börjar snurra runt i luften utan anledning osv. Här kommer ett klipp direkt från programmet:


http://www.youtube.com/watch?v=NY7C86mCzPg&feature=youtu.be

Här kommer hela koden för projektet:

#include <Windows.h>
#include <gl\GL.h>
#include <SDL.h>
#include <Box2D\Box2D.h>
#include <iostream>

using namespace std;


//-- GLOBALS
const int WIDTH = 500;
const int HEIGHT = 500;
const int BPP = 32;
const int FPS = 30;

const int BOX_SIZE = 10.f;

b2World *p_world = NULL;


//-- FUNCTIONS
void init() {

SDL_Init( SDL_INIT_EVERYTHING );
SDL_SetVideoMode( WIDTH, HEIGHT, BPP, SDL_OPENGL );
SDL_WM_SetCaption( "2D Plattformer - ALPHA - v0.0.1", NULL );

glMatrixMode( GL_PROJECTION );
glOrtho( 0.f, WIDTH, HEIGHT, 0.f, -1.f, 1.f );

glMatrixMode( GL_MODELVIEW );
glClearColor( 0.f, 0.f, 0.f, 1.f );
}

void init_world() {

// create world
p_world = new b2World( b2Vec2( 0.f, 9.81f ) );


}

void draw_bodys() {

b2Body *p_itr = p_world->GetBodyList();

while( p_itr )
{
glLoadIdentity();
glColor3f( 1.f, 1.f, 1.f );
glTranslatef( p_itr->GetPosition().x, p_itr->GetPosition().y, 0.f );
glRotatef( p_itr->GetAngle(), 0.f, 0.f, 1.f );

glBegin( GL_QUADS );

glVertex2f( -BOX_SIZE, -BOX_SIZE );
glVertex2f( BOX_SIZE, -BOX_SIZE );
glVertex2f( BOX_SIZE, BOX_SIZE );
glVertex2f( -BOX_SIZE, BOX_SIZE );

glEnd();

p_itr = p_itr->GetNext();
}
}

void create_body( int X, int Y, int W, int H, bool DYNAMIC ) {

b2BodyDef l_bodydef;
l_bodydef.position.Set( X, Y );
l_bodydef.type = b2_staticBody;
if( DYNAMIC )
l_bodydef.type = b2_dynamicBody;

b2Body *l_body = p_world->CreateBody( &l_bodydef );

b2PolygonShape l_shape;
l_shape.SetAsBox( W, H );

b2FixtureDef l_fixture;
l_fixture.shape = &l_shape;
l_fixture.density = 1.f;

l_body->CreateFixture( &l_fixture );

cout << "EVENT: Body created! (" << X << ", " << Y << ", " << W << ", " << H << ")\n";
}


//-- MAIN
int main(int argc, char** argv)
{
// initialization
init();
init_world();

// locals
bool quit = false;
SDL_Event event;
int time = 0;

// game loop
while( !quit )
{
time = SDL_GetTicks();

// input
while( SDL_PollEvent( &event ) )
{
switch( event.type )
{
case SDL_QUIT:
quit = true;
break;

case SDL_KEYDOWN:
if( event.key.keysym.sym == SDLK_ESCAPE )
{
quit = true;
}

case SDL_MOUSEBUTTONDOWN:
if( event.button.button == SDL_BUTTON_LEFT )
{
create_body( event.button.x, event.button.y, BOX_SIZE, BOX_SIZE, true );
}
else if( event.button.button == SDL_BUTTON_RIGHT )
{
create_body( event.button.x, event.button.y, BOX_SIZE, BOX_SIZE, false );
}
break;
}
}

// updating
glClear( GL_COLOR_BUFFER_BIT );

p_world->Step( 1000.f / FPS, 10, 10 );
draw_bodys();

SDL_GL_SwapBuffers();

// fps controll
if( 1000.f / FPS > SDL_GetTicks() - time )
SDL_Delay( 1000.f / FPS - ( SDL_GetTicks() - time ) );
}

// delete world and all it's content
if( p_world != NULL )
{
delete p_world;
p_world = NULL;
}

return 0;
}

Om det är möjligt att få det här att fungera som det ska så svär jag på att jag skall offra mitt förstfödda barn i Jesus namn!

Jag har för övrigt ingen som helst aning om vad felet kan vara, har försökt med allt jag kan komma på.

mvh!

Scarabus
2014-02-12, 12:59
Jag kan sätta pengar på att det beror på hur du throttlar fps:en och inte skickar in delta-tiden till Box2D.
Gör inte så.

Mattias Gustavsson
2014-02-17, 08:31
Jag har inte använt Box2D, så kan tyvärr inte vara till nån större hjälp... men, det verkar osannolikt att en fysikmotor skulle få problem av att man skickar in ett fixt time-step, så jag tror inte på att det är det som är felet (sen kan det finnas andra anledningar att undvika en cappad update rate, men tror inte det skulle påverka fysiken ).

För övrigt, när jag kollar på videon, så tycker jag inte att jag ser nåt större problem med hur boxarna beter sig, ser ut ungefär som det brukar i fysikmotorer... vad är det som du tycker verkar fel? Är det att boxarna inte lägger sig till vila som dom ska?

pponmm
2014-02-17, 21:40
Jag kan sätta pengar på att det beror på hur du throttlar fps:en och inte skickar in delta-tiden till Box2D.
Gör inte så.

Tackar! Detta var problemet! Jag lyckades inse mitt misstag och ordnade det morgonen därpå när jag vaknade! :)


Jag har inte använt Box2D, så kan tyvärr inte vara till nån större hjälp... men, det verkar osannolikt att en fysikmotor skulle få problem av att man skickar in ett fixt time-step, så jag tror inte på att det är det som är felet (sen kan det finnas andra anledningar att undvika en cappad update rate, men tror inte det skulle påverka fysiken ).

För övrigt, när jag kollar på videon, så tycker jag inte att jag ser nåt större problem med hur boxarna beter sig, ser ut ungefär som det brukar i fysikmotorer... vad är det som du tycker verkar fel? Är det att boxarna inte lägger sig till vila som dom ska?

Det verkar som det.. Förut (i videon) hade jag ett steg på ~33, och nu har jag 0,1. Jag kappade hela spel-loopen på 30fps också. När jag bytte ~33 till 0,1 så funkade det perfekt! Bara sådär, utan att ändra något annat alltså.

Men jag förstår hur du tänker, jag tänkte likadant, men jag antar att 33 är en otroligt lång tid för fysikmotorn att göra ett hopp, speciellt då jag kör med 0,1 nu och det funkar som en dröm.

Ledsen att jag var så sen tillbaka att svara föresten, hade helt glömt bort den här tråden..

Tack för hjälpen i alla fall!

Mattias Gustavsson
2014-02-18, 19:59
Ah, jag antar att fysikmotorn tar in tiden i sekunder - skulle säkert funkat fint om du hade gjort 1.0/FPS istället för 1000/FPS.