void World::run() { m_screen->init( "Phys2D" ); m_grid->init( vec2d { -20, -20 }, vec2d { 800, 600 }, 40 ); const double fps = 100; const double dt = 1 / fps; double accumulator = 0; double frame_start = get_time(); //Positional correction test (inside circle) Circle test1 ( vec2d { 300, 300 }, 50 ); Rectangle test2 ( vec2d { 310, 300 }, 10, 10 ); Circle test3 ( vec2d { 300, 310 }, 10 ); test3.set_colour( 0xFFFF0000 ); test2.set_colour( 0xFFFFFF00 ); m_grid->add( &test1 ); //m_grid->add( &test2 ); m_grid->add( &test3 ); m_grid->add( &test2 ); //Positional correction test (inside Rectangle) Rectangle test4 ( vec2d { 500, 300 }, 50, 70 ); Circle test5 ( vec2d { 500, 320 }, 10 ); Rectangle test6 ( vec2d { 510, 300 }, 10, 10 ); m_grid->add( &test4 ); m_grid->add( &test5 ); m_grid->add( &test6 ); Circle test7 ( vec2d { 100, 500 }, 100, 1, vec2d { 200, -200 } ); m_grid->add( &test7 ); while( m_screen->is_running() ) { const double current_time = get_time(); accumulator += current_time - frame_start; frame_start = current_time; if( accumulator > 0.2 ) { accumulator = 0.2; } m_screen->clear(); m_screen->handle_events(); while( accumulator > dt ) { accumulator -= dt; m_grid->update( dt ); } draw_entities(); m_screen->render(); } m_screen->quit(); }
// Render the game to the screen void update_screen(void) { // Locals int elapsed; frame++; draw_backdrop(); draw_entities(); draw_overlay(); // Lock the refresh rate to 60 FPS SDL_Flip(screen); elapsed = frame_start_time - SDL_GetTicks(); if (elapsed < FRAME_TIME) { SDL_Delay(FRAME_TIME - elapsed); } }
void draw_playing_field(sf::RenderWindow & win, level const & l) { auto top_left_pos = top_left_window_position(l); draw_entities(win, top_left_pos, l); draw_chip(win, top_left_pos, l); }