Beispiel #1
0
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();
}
Beispiel #2
0
void ClientRenderModule::renderSingleFrame()
{
    int i,j,ii,jj;
    MapCell *m;

    /* local copy for share data */
    int px,py;		/* player position */
    int dir,life,attr;	/* player attributes */
    int x1,x2,y1,y2;	/* map coordinates */
    float pfx,pfy;		/* interpolated player position (for main player) */
    float pfx2,pfy2;	/* interpolated player position (for another player) */
    MapCell map[CLIENT_MATRIX_SIZE][CLIENT_MATRIX_SIZE];
    OglObject *player_model;/* type of player */

    /* create local copy for shared data */
    SDL_LockMutex(client_data->game_mutex);
    px = client_data->xpos;
    py = client_data->ypos;
    x1 = client_data->x1;
    x2 = client_data->x2;
    y1 = client_data->y1;
    y2 = client_data->y2;
    dir = client_data->dir;
    life = client_data->life;
    attr = client_data->attr;
    for ( i = 0; i < CLIENT_MATRIX_SIZE; i++ )
        for ( j = 0; j < CLIENT_MATRIX_SIZE; j++ )
            memcpy( &map[i][j], &client_data->map[i][j], sizeof(MapCell) );
    SDL_UnlockMutex(client_data->game_mutex);

    /* begin rendering */
    w.beginRender();

    /* get new player position */
    updatePosition(&pmd, px,py);
    pfx = pmd.pfx;
    pfy = pmd.pfy;

    /* set camera and lights */
    gluLookAt(pfx-4.0,6.0,pfy-4.0, 	/* position */
              pfx-0.5,0.0,pfy-0.5,	/* look at */
              0,1,0);		/* up direction */

    /* draw floor */
    for ( i = max( 0, px - MAX_CLIENT_VIEW ); i <= min( client_data->mapx, px + MAX_CLIENT_VIEW ); i++ )
        for ( j = max( 0, py - MAX_CLIENT_VIEW ); j <= min( client_data->mapy, py + MAX_CLIENT_VIEW ); j++ )
            //for ( i = x1; i < x2; i++ )
            //	for ( j = y1; j < y2; j++ )
            wfloor->render(i,j);

    /* draw map */
    for ( i = x1; i < x2; i++ )
        for ( j = y1; j < y2; j++ )
        {
            ii = MAX_CLIENT_VIEW - ( px - i );
            jj = MAX_CLIENT_VIEW - ( py - j );
            m = &map[ii][jj];
            if ( m->terrain != 0 ) obstacle->render( i,j );
            if ( m->type == CELL_OBJECT ) resource->render( i,j, 0.3 + 0.1 * m->quantity );
            if ( m->type == CELL_PLAYER )
            {
                player_model = player[ m->p_attr % nplayer_models ];
                updatePositionForPlayer( m->id, i,j, &pfx2, &pfy2);
                if ( m->dir >= 0 )
                    player_model->render( pfx2,pfy2, 0.5 + 0.7 * m->life / 100, m->dir*90 );
                else
                    player_model->render( pfx2,pfy2, 0.5 + 0.7 * m->life / 100,
                                          -m->dir*90, -90);
            }
            if ( m->type == CELL_OBJ_PLAYER )
            {
                resource->render( i,j, 0.3 + 0.1 * m->quantity );

                player_model = player[ m->p_attr % nplayer_models ];
                updatePositionForPlayer( m->id, i,j, &pfx2, &pfy2);
                if ( m->dir >= 0 )
                    player_model->render( pfx2,pfy2, 0.5 + 0.7 * m->life / 100, m->dir*90 );
                else
                    player_model->render( pfx2,pfy2, 0.5 + 0.7 * m->life / 100,
                                          -m->dir*90, -90);
            }
        }

    /* draw player */
    player_model = player[ attr % nplayer_models ];
    if ( dir >= 0 )
        player_model->render( pfx,pfy, 0.5 + 0.7 * life / 100 , dir * 90 );
    else
        player_model->render( pfx,pfy, 0.5 + 0.7 * life / 100, -dir * 90, -90);

    /* get coordinates for the status area */
    SDL_Surface *screen = w.getScreen();
    SDL_Rect rect;
    rect.w = client_data->resx;
    rect.h = 40;
    rect.x = 0;
    rect.y = client_data->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( client_data->name, NULL);
    if ( client_data->state != PLAYING )
        sprintf(sbuffer, "%s", client_states[client_data->state]);
    else
        sprintf(sbuffer, "playing -> %s ( coord = %d,%d life = %d )",
                AI_state_names[client_data->purpose],
                px,py, life);
    font->render(rect.x + 9, rect.y + 2, sbuffer, screen);
    sprintf(sbuffer, "update interval: average = %.1lfms, last = %.1lfms, fps = %.1f",
            client_data->average_update_interval, client_data->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();
}