 
			
				30/09/2012, 17:31
			
			
			     |  
      |    |    |    Fecha de Ingreso: agosto-2012  
						Mensajes: 94
					  Antigüedad: 13 años, 2 meses Puntos: 7     |        |  
  |      Respuesta: Una variable no cambia de valor.        Hola   
Entiendo perfectamente el tema de los FPS. Pero por mas veces que intente acomodarlo en el programa sigue pasando excactamente lo mismo. Al principio anda de lujo, pero a los pocos segundos de hacerlo dar vueltas empieza a ir cada vez mas lento hasta que se cuelga y anda todo a saltitos. Ademas, mi pobre CPU ruge (o al menos eso escucho desde mi silla).  
Dejo el codigo de nuevo.  
Ademas, intente fijarme cuanto dura cada loop, pero no me anda. Empiezo a volverme loco, y no entiendo porque anda, deberia esperar, y no lo hace.  
Saludos, y dejo el codigo de nuevo, con las modificaciones a ver si alguien encuentra el programa. Por favor, alguien lealo completo porque yo me canse de leerlo sin encontrar el problema.    Cita:   
//Flier Land Rover por Alejandro*/ 
/*El programa genera un auto, y permite moverlo por la pantalla. Ademas, prende y apaga la luz de retroceso si retrocede, 
y el audio aun no funciona, pero estoy haciendo un code para un juego.*/   
#include <stdio.h> 
#include "SDL.h" 
#include <time.h> 
//#include <SDL_mixer.h> 
const int WINDOW_WIDTH = 1020;//altura de ventana 
const int WINDOW_HEIGHT = 709;//ancho de ventana 
const char* WINDOW_TITLE = "Flier Land Rover";//titulo de ventana 
void destruccion();/*Averigua si el vehiculo toca tierra.*/ 
int x, y;//posicion inicial de el vehiculo 
int c, d;//posicion inicial de enemigo 
int balax, balay;//posicion de bala1   
SDL_Surface *image;//Landi con luz normal 
SDL_Surface *image2;//Landi con luz blanca 
SDL_Rect dest;//Posicion de superficie cuadrada que contiene el BMP 
bool gameRunning = true;//Variable que mantiene el loop 
SDL_Rect found;//Superficie de fondo. 
SDL_Surface *fondo;//Apuntador a la superficie Fondo. 
SDL_Surface *bala;//Apuntador a la superficie cuadradobala 
SDL_Rect cuadradobala;//Superficie CuadradoBala. 
void salir();//Cierra el Loop en caso de que el user aprete Esc. 
void movimiento();//Funcion que mueve el vehiculo de acuerdo a las teclas presionadas. 
bool luz_blanca = false;//Maneja el apagado y encendido de luces blancas. 
bool disparo = false; 
SDL_Surface *enemigo;//Superficie de enemigo 
SDL_Rect enemigoc;//Cuadrado donde esta el enemigo; 
void movenemigo();//Mueve el enemigo, siguiendo al Landi.(Nota, falta agregar sistema detector de disparos. 
SDL_Event event; 
//int canal;   
int main(int argc, char **argv)   
{ 
clock_t inicio, fin;   
FILE *fp; 
fp = fopen("Variables.txt","w"); 
x = 100; 
y = 100; 
c = 600; 
d = 200; 
balax = x; 
balay = y; 
int milisegundosloop;     
SDL_Init( SDL_INIT_VIDEO |SDL_INIT_AUDIO); 
SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH, WINDOW_HEIGHT, 0,SDL_HWSURFACE | SDL_DOUBLEBUF /*| SDL_FULLSCREEN*/);//Inicia la ventana 
SDL_WM_SetCaption( WINDOW_TITLE, 0 );           
image = SDL_LoadBMP("LandRover2.bmp"); 
image2 = SDL_LoadBMP("LandRover3.bmp"); 
SDL_SetColorKey(image,SDL_SRCCOLORKEY|SDL_RLEACCEL  ,SDL_MapRGB(image->format,255,255,255)); 
SDL_SetColorKey(image2,SDL_SRCCOLORKEY|SDL_RLEACCE  L,SDL_MapRGB(image->format,255,255,255)); 
bala = SDL_LoadBMP("Bala.bmp"); 
while (gameRunning)//Inicio del Loop 
{ 
inicio = clock(); 
milisegundosloop = SDL_GetTicks(); 
found.x = 0; 
found.y = 0; 
found.h = image->h;  
found.w = image->w;    
fondo = SDL_LoadBMP("Fondo.bmp"); 
SDL_BlitSurface(fondo, NULL, screen, &found);   
if(luz_blanca == false) 
{ 
dest.x = x; 
dest.y = y; 
dest.w = image2->w;  
dest.h = image2->h;     
SDL_BlitSurface(image, NULL, screen, &dest);       
//SDL_Flip(screen);   
SDL_FreeSurface(screen);     
} 
else 
{ 
dest.x = x; 
dest.y = y; 
dest.w = image->w;  
dest.h = image->h;     
SDL_BlitSurface(image2, NULL, screen, &dest);       
//SDL_Flip(screen);   
SDL_FreeSurface(screen); 
luz_blanca = false;   
}     
enemigo = SDL_LoadBMP("Avion.bmp"); 
enemigoc.x = c; 
enemigoc.y = d; 
enemigoc.w = enemigo->w; 
enemigoc.h = enemigo->h; 
SDL_SetColorKey(enemigo,SDL_SRCCOLORKEY|SDL_RLEACC  EL,SDL_MapRGB(image->format,255,255,255));     
SDL_BlitSurface(enemigo, NULL, screen, &enemigoc);       
SDL_Flip(screen);   
SDL_FreeSurface(screen);   
movimiento();//Mueve el Landi 
Uint8 *keys; 
keys=SDL_GetKeyState(NULL); 
if (keys[SDLK_SPACE] == 1) 
{   
/*balax = x; 
balay = y;     
cuadradobala.x = balax; 
cuadradobala.y = balay; 
cuadradobala.w = bala->w; 
cuadradobala.h = bala->h;  
SDL_SetColorKey(bala,SDL_SRCCOLORKEY|SDL_RLEACCEL,  SDL_MapRGB(image->format,255,255,255));   
SDL_BlitSurface(bala, NULL, screen, &cuadradobala); 
SDL_Flip(screen);   
SDL_FreeSurface(screen); 
    balax = balax + 1;*/ 
disparo = true; 
}      
if(disparo == true) 
{ 
cuadradobala.x = balax; 
cuadradobala.y = balay; 
cuadradobala.w = bala->w; 
cuadradobala.h = bala->h;  
SDL_SetColorKey(bala,SDL_SRCCOLORKEY|SDL_RLEACCEL,  SDL_MapRGB(image->format,255,255,255));   
SDL_BlitSurface(bala, NULL, screen, &cuadradobala); 
SDL_Flip(screen);   
SDL_FreeSurface(screen); 
balax = balax + 10; 
      if(balax >= 709) 
      { 
               disparo = false; 
               balax = x; 
      } 
} 
movenemigo(); 
destruccion();//Detecta si toca el Landi el piso. Si lo hace cierra el programa. Hay que generar la explosion. 
(SDL_PollEvent(&event)); 
salir();//Cierra el programa en el caso de que Esc. sea apretado 
fprintf(fp, "Posicion de vehiculo %d , %d.\n Posicion de Vehiculo enemigo: %d, %d\n.Tiempo de duracion de frame: %f ",x, y, c, d,(fin - inicio)/CLK_TCK); 
} 
fclose ( fp );   
milisegundosloop = SDL_GetTicks() - milisegundosloop;     //obtenemos el tiempo que ha pasado 
if(milisegundosloop < 110) 
{                                  //si aun sobra tiempo hasta llegar a los 30 ms 
SDL_Delay( Uint32(110 - milisegundosloop) ); //vete a dormir durante 30-x milisegundos   
fin = clock(); 
}   
SDL_Quit(); 
return 0; 
}   
void movimiento() 
{ 
     Uint8 *keys; 
     keys=SDL_GetKeyState(NULL); 
     if (keys[SDLK_UP] == 1 && y > 0)  
                  { 
                  y = y - 5; 
                  } 
     if (keys[SDLK_DOWN] == 1 && y < 640)  
                    { 
                    y = y + 5; 
                    } 
    if (keys[SDLK_LEFT] == 1 && x > 0)  
    { 
                    x = x - 5; 
                    luz_blanca = true; 
    } 
    if (keys[SDLK_RIGHT] == 1 && x < 790)  
    {   
                        x = x + 5; 
    }     
}      
void destruccion() 
{ 
     if(y > 550) 
     { 
          gameRunning = false; 
     } 
}   
void salir() 
{ 
     Uint8 *keys; 
     keys=SDL_GetKeyState(NULL); 
     if (keys[SDLK_ESCAPE] == 1)    
     { 
                           gameRunning = false; 
     }   
} 
void movenemigo() 
{ 
     if(d < y) 
     { 
          d = d + 10; 
     } 
     if 
     (d > y) 
     { 
          d = d - 10; 
     } 
}
      Por favor, ayuda. /*Se arrastra por el piso suplicando*/ Saludos!            |