Ir al contenido

publicidad

Foto

Movimiento contínuo con libSDL


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
3 respuestas en este tema

  • wiyarmir

  • Elder

  • vida restante: 100%
  • Registrado: 27 mar 2009
  • Mensajes: 108
#1

Escrito 06 abril 2009 - 15:51

Buenas, resulta que tengo un problemilla con mi código en C++ y es que al mover el objeto, se mueve solo cuando pulso la tecla y no mientras está pulsada... He tocado un poco el flujo del programa pero no consigo arreglarlo, os dejo unos trazos y a ver que se os ocurre:

[code:1]
while (true) {
if (SDL_GetTicks() - tiempo_gr >= 30) {//siLimiteGraficos ~30ms

controlador.pincel->dibujar(fondo);
controlador.pincel->dibujar(jugador);

SDL_Flip(pantalla);//refresca pantalla
tiempo_gr = SDL_GetTicks();
}
if (SDL_GetTicks() - tiempo_ev >= 5) {//temporizacion//siLimiteEventos ~5ms

while (SDL_PollEvent(&evento)) {
switch (evento.type) {
case SDL_MOUSEBUTTONDOWN:
break;
case SDL_MOUSEBUTTONUP:
break;
case SDL_MOUSEMOTION:
break;
case SDL_KEYDOWN:
if (evento.key.keysym.sym == SDLK_ESCAPE) {
.
.
.

} else {
controlador.teclas(evento.key.keysym.sym);
}
break;
case
.
.
.

break;
}
}
tiempo_ev = SDL_GetTicks();
}
}
[/code]

Y luego el método teclas del controlador es el siguiente:

[code:1]
void Control::teclas(SDLKey tecla) {
switch (tecla) {
case SDLK_UP:
//supongamos movimiento
if (!jugador->colision(enemigo) && jugador->dentro_tabl(ARR)) {
jugador->ve_arr();
}
break;
case SDLK_DOWN:
if (!jugador->colision(enemigo) && jugador->dentro_tabl(ABA)) {
jugador->ve_aba();
}
break;
case SDLK_RIGHT:
if (!jugador->colision(enemigo) && jugador->dentro_tabl(DER)) {
jugador->ve_der();
}
break;
case SDLK_LEFT:
if (!jugador->colision(enemigo) && jugador->dentro_tabl(IZQ)) {
jugador->ve_izq();
}
break;
}
}
[/code]

Lo que yo supongo que falla es que la manera en la que yo miro si ha cambiado la tecla solo considera la pulsación, pero no se me ocurre ninguna manera diferente.

Gracias!

  • gothmog_es

  • Entrenador guay

  • vida restante: 100%
  • Registrado: 01 nov 2002
  • Mensajes: 33.086
#2

Escrito 06 abril 2009 - 17:54

Uhm... juraría que mantener pulsada una tecla también genera eventos KEYDOWN, no tendrá que ver la limitación que pones con los ticks? Has probado a no usar esa parte y ver si funciona igual?

A mí lo que sí me daba problemas era al pulsar varias teclas. Por ejemplo, pulsas ARRIBA, la dejas presionada, a continuación pulsas DERECHA, levantas DERECHA y se piede que ARRIBA estaba pulsada. Para ello, lo que puedes hacer es guardar en un array el estado del teclado. En un evento KEYDOWN, activas la tecla correspondiente; en un KEYUP, la desactivas. Y en lugar de comprobar directamente el estado en vivo, lo haces contra el array.

EDITO: wooops, una cosa importante, tienes en tu código de inicialización la siguiente instrucción?

[code:1] SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
[/code]

  • wiyarmir

  • Elder

  • vida restante: 100%
  • Registrado: 27 mar 2009
  • Mensajes: 108
#3

Escrito 06 abril 2009 - 18:55

Pues no, y no sabía de su existencia. Ahora parece que si funciona, aunque creo que tu propuesta de antes es más interesante porque con esta a veces hace cosas raras XD

Mil gracias! :D

  • wiyarmir

  • Elder

  • vida restante: 100%
  • Registrado: 27 mar 2009
  • Mensajes: 108
#4

Escrito 18 abril 2009 - 10:37

Revivo un poco (un poquito, no es tan viejo no? XD) este hilo para decirte que al final lo he hecho por el array booleano ese, y va de maravilla, mucho mejor que repitiendo eventos de tecla (quedaba a tirones)

Gracias :)


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
publicidad