Ver Mensaje Individual
  #3 (permalink)  
Antiguo 30/09/2012, 17:31
harryarcoiris
 
Fecha de Ingreso: agosto-2012
Mensajes: 94
Antigüedad: 12 años, 5 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!