void render_game(GameState * state) { /* Variables */ Color color = {255, 0, 255, 255}; Color black = {0, 0, 0, 255}; Color white = {255, 255, 255, 255}; char buffer [20]; int i,n; /* Set redraw off */ state->redraw = 0; /* Render world */ render_world(&state->world); /* Render pathfinding, if enabled */ if (SHOW_PATHFINDING) render_paths(state); /* Render towers */ for (i = 0; i < state->towers_length; i++) { render_entity(state->towers[i]); } /* Render enemies if they are alive */ for (i = 0; i < state->enemies_length; i++) { if (state->enemies[i].enemy.alive) render_entity(&state->enemies[i]); } /* Render spellscreen */ render_spellscreen(&state->spells); /* Render projectiles */ for (i = 0; i < state->towers_length; i++) { render_projectiles(state->towers[i]); } /* render selection */ render_mouse_actions(state); /* Render ui on top */ render_ui(state); /* Fps rendering */ n = sprintf(buffer, "%#.1f FPS", get_current_fps()); draw_text(buffer, FONT_LARGE, color, SCREEN_WIDTH-20 -100, 6, ALIGN_RIGHT); /* Game over? */ render_game_over(state); /* Render to screen */ flip_display(); clear_to_color(color); }
void renderSingleFrame() { coord_t px,py; /* player position */ value_t life; float pfx,pfy; /* interpolated player position (for main player) */ if( !cl.updated ) return; SDL_LockMutex(cl.game_mutex); px = cl.pl->r.v1.x; py = cl.pl->r.v1.y; life = cl.pl->attrs[PL_LIFE]; /* get new player position */ updatePosition(&pmd, px,py); pfx = pmd.pfx; pfy = pmd.pfy; /* compute render range */ vect_init( &cl.pl->r.v1, (coord_t)pfx, (coord_t)pfy ); vect_add( &cl.pl->r.v1, &cl.pl->size, &cl.pl->r.v2 ); rect_t render_r = game_action_range( AC_VIEW, cl.pl, &wm.map_r ); vect_init( &cl.pl->r.v1, px, py ); vect_add( &cl.pl->r.v1, &cl.pl->size, &cl.pl->r.v2 ); /* begin rendering */ w.beginRender(); /* set camera and lights */ /* position */ /* look at */ /* up direction */ action_range_t* ar = &action_ranges[AC_VIEW]; gluLookAt( pfx-ar->front,1.5*ar->front,pfy-ar->front, pfx-0.1*ar->front,0.0,pfy-0.1*ar->front, 0,1,0); /* draw floor */ int i, j; for ( i = render_r.v1.x; i <= render_r.v2.x; i++ ) for ( j = render_r.v1.y; j <= render_r.v2.y; j++ ) floor_model->render(i,j); /* draw entities */ int et; for( et = n_entity_types-1; et >= 0; et-- ) { pentity_set_t* pe_set = worldmap_get_entities( &render_r, 1 << et ); elem_t* pos; pentity_set_for_each( pos, pe_set ) render_entity( ((pentity_t*)pos)->ent ); pentity_set_destroy( pe_set ); } SDL_UnlockMutex(cl.game_mutex); /* get coordinates for the status area */ SDL_Surface *screen = w.getScreen(); SDL_Rect rect; rect.w = cl.resx; rect.h = 40; rect.x = 0; rect.y = cl.resy - rect.h; /* display status */ SDL_FillRect( screen, &rect, SDL_MapRGB( screen->format, 0x00, 0x00, 0x00 ) ); SDL_UpdateRect(screen, rect.x,rect.y, rect.w,rect.h); char sbuffer[256]; SDL_WM_SetCaption( cl.name, NULL); if ( cl.state != PLAYING ) sprintf(sbuffer, "%s", client_states[cl.state]); else sprintf(sbuffer, "playing -> %s ( coord = %d,%d life = %d )", AI_state_names[cl.purpose], px, py, life); font->render(rect.x + 9, rect.y + 2, sbuffer, screen); sprintf(sbuffer, "update interval: average = %.1lfms, last = %.1lfms, fps = %.1f", cl.average_update_interval, cl.last_update_interval, 1000.0 / frame_render_interval ); font->render(rect.x + 9, rect.y + 21, sbuffer, screen); SDL_UpdateRect(screen, rect.x,rect.y, rect.w,rect.h); /* finish frame rendering */ updateMovementDataVectors(); w.endRender(); }