tengo el siguiente problema: estoy haciendo un juego tipico de avioncitos y resulta que quiero que los avioncitos se muevan en diagonal y que el programa reconozca varias teclas pulsadas al tiempo. pues bien, la unica forma que he encontrado para hacerlo es "sacando una foto al teclado" con su estado actual y que me diga si una tecla esta apretada o no lo esta, en cada caso, incremento o decremento una variable y asi se mueve todo bonito.
el problema es que cuando pulso una tecla, despues otra direccion y suelto la ultima direccion, se me queda parado en vez de seguir moviendose en la direccion del principio, me explico con un ejemplo:
si pulso [derecha, arriba] se mueve en diagonal superior derecha
si pulso [izquierda, abajo] se mueve en diagonal inferior izquierda
si pulso [izquierda, abajo, suelto abajo] deberia moverse en diagonal inferior izquierda y luego seguir moviendose a la izquierda no??? pues no, se queda parado.
si pulso [izquierda, abajo, suelto izquierda] se mueve en diagonal inferior izquierda y luego sigue hacia abajo con normalidad, atendiendo a la orden que he dado.
no se si se ha entendido bien, el caso general es que si presiono una tecla y luego otra, se mueve en diagonal, pero al soltar la segunda que aprete para seguir con mi movimiento, se detiene. esto no pasa si presiono una tecla, luego otra y luego suelto la primera que presione...que se mueve correctamente en la direccion de la segunda.
aqui os pego mi codigo a ver si encontrais el fallo:
- Código: Seleccionar todo
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
#include <SDL_image.h>
#define SCREEN_HEIGHT 600
#define SCREEN_WIDTH 800
#define COLOR_DEPTH 24
#define VELOCIDAD 4
int main(int argc, char *argv[]) {
SDL_Surface *image, *screen;
SDL_Rect dest, anterior;
SDL_Event evento;
int done = 0;
Uint8 *keys;
atexit(SDL_Quit);
// Iniciar SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
exit(1);
}
// Activamos modo de video
screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, COLOR_DEPTH, SDL_HWSURFACE);
if (screen == NULL) {
printf("No se puede inicializar el modo gráfico: \n",SDL_GetError());
exit(1);
}
// Cargamos gráfico
image = IMG_Load("images\\avion.bmp");
if ( image == NULL ) {
printf("No pude cargar gráfico: %s\n", SDL_GetError());
exit(1);
}
//Permitimos el uso de teclas presionadas
SDL_EnableKeyRepeat(10, 10);
//Quitamos el color de trasparencia
SDL_SetColorKey(image, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(image->format,255,0,0));
// Definimos donde dibujaremos el gráfico y lo copiamos a la pantalla.
dest.x = (SCREEN_WIDTH / 2) - (image->w / 2);
dest.y = (SCREEN_HEIGHT / 2) - (image->h / 2);
dest.w = image->w;
dest.h = image->h;
//Copiamos la imagen a la pantalla oculta en el doble buffer
SDL_BlitSurface(image, NULL, screen, &dest);
// Mostramos la pantalla
SDL_Flip(screen);
//bucle de espera activo
while(done == 0) {
//Bucle de espera inactivo
while ( SDL_PollEvent(&evento) ) {
if ( evento.type == SDL_KEYDOWN ) {//|| evento.type == SDL_KEYUP) {
SDL_FillRect(screen,&dest,SDL_MapRGB(screen->format,0,0,0));
keys=SDL_GetKeyState(NULL);
//aqui esta el conflicto. la impresion de 1 y 0 lo hace bien
printf("arriba:%i\nabajo:%i\nderecha:%i\nizquierda:%i\n",keys[SDLK_UP],keys[SDLK_DOWN],keys[SDLK_RIGHT],keys[SDLK_LEFT]);
if (keys[SDLK_UP] == 1) {dest.y -= VELOCIDAD;}
if (keys[SDLK_DOWN] == 1) {dest.y += VELOCIDAD;}
if (keys[SDLK_LEFT] == 1) {dest.x -= VELOCIDAD;}
if (keys[SDLK_RIGHT] == 1) {dest.x += VELOCIDAD;}
switch (evento.key.keysym.sym) {
case SDLK_ESCAPE:
done = 1;
break;
}
}
}
//Copiamos la imagen a la pantalla oculta en el doble buffer
SDL_BlitSurface(image, NULL, screen, &dest);
//Intercambiamos las pantallas, la dibujada y la obsoleta
SDL_Flip(screen);
}
// liberar superficie
SDL_FreeSurface(image);
return 1;
}
**NOTA: de momento solo estoy usando C a pelo
para que este codigo funcione teneis que agregar las librerias, la dll y al carpeta include de SDL (no hace falta incluir la SDL_image porque todavia no cargo mas que un bmp aunque aparezca incluida en mi codigo). tambien debeis tener una carpeta en el directorio de vuestro proyecto llamada image que contenga avion.bmp
muchas gracias de antemano
atentamente
maije