Resultat 1 till 5 av 5

Ämne: Får inte igång Box2D..

  1. #1

    C++ Får inte igång Box2D..

    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!

    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:



    Här kommer hela koden för projektet:
    Kod:
    #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!

  2. #2
    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å.

  3. #3
    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?

  4. #4
    Citat Ursprungligen postat av Scarabus Visa inlägg
    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!

    Citat Ursprungligen postat av Mattias Gustavsson Visa inlägg
    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!

  5. #5
    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.

Bokmärken

Behörigheter för att posta

  • Du får inte posta nya ämnen
  • Du får inte posta svar
  • Du får inte posta bifogade filer
  • Du får inte redigera dina inlägg
  •