Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dudas Sdl

Iniciado por hylian, 27 de Septiembre de 2005, 10:36:51 AM

« anterior - próximo »

hylian

 Hola!

Bueno ya he empezado con el primer proyecto, y como recomendais, estoy usando algo light ( SDL ) y estoy haciendo un clon de un juego clasico ( Asteroids :D )

Pense en usar un motor como CRM32Pro, pero como quiero que esto sea solo el inicio me meti de lleno con SDL para intentar aprender mejor las cosas :)

Sin embargo que surgen unas cuantas dudas que, aunq estoy buscando por inet me gustaria que me dierais vuestros consejos. Empezamos :D

- ¿Cómo roto un Sprite?, hasta ahora con SDL_image o con SDL normal cargo un sprite en un surface, pero me gustaria saber como roto esa surface para orientar la nave principal.

- ¿Cómo implemento un limitador de tiempo?, bueno realmente no se si se llama asi, la idea es tener algo que llame al metodo de dibujar 30 o 60 veces por segundo, y ademas si fuera capaz de calcular los FPS que estoy teniendo seria genial. Hasta ahora consulto si hay eventos y si no hay llamo al render, lo cual no es q sea muy bueno.

- ¿Cómo hago para que la pulsacion continuada de una tecla produzca movimiento?, uso SDL_GetKeyState y con "ifs" compruebo si la posicion del array correspondiente a la tecla esta activada, sin embargo solo con eso si dejas pulsada la tecla no se detecta. Viendo la API he visto SDL_EnableKeyRepetat () que activa la repeticion de teclas, en principio funciona, pero no se si es el camino a seguir :)

Supongo que son dudas tipicas, prometo que he intentado buscar por el foro, pero como SDL tiene menos de 4 letras no me deja hacer la busqueda y cuando pongo "añadidos" no encuentro nada que me solucione esto.  :D

Saludos!

sés

 Buenaaaasss..

Cita de: "hylian"- ¿Cómo roto un Sprite?
Hay un módulo apra SDL que creo que se llama SDL_gfx (anteriormente SDL_rotozoom) o algo así

Cita de: "hylian"- ¿Cómo implemento un limitador de tiempo?
Tienes que usar el "timer" (SDL_GetTickCount()). Básicamente consiste en obtener el timer antes de procesar un fotograma y al terminar. Ver cuanto tiempo ha transcurrido y esperar hasta que pase el tiempo que queramos que dure un fotrograma.
Hay muchos ejemplos por ahí (prueba en google con palabras como "game" "sdl" y "mainloop").
Aquí tienes un ejemplo al azar que encontré: http://www.devolution.com/pipermail/sdl/19...ber/021808.html

Cita de: "hylian"- ¿Cómo hago para que la pulsacion continuada de una tecla produzca movimiento?
SDL_GetKeyState() debería darte lo que quieres, pero me huelo que no la usas como deberías.
Esta función te devuelve el estado del teclado O sea, te dice que teclas están pulsadas en el momento de la llamada. Y me da que tú las estás usando dentro del evento de "tecla pulsada".


A ver si te he aclarado algo.
Soy indeciso... ¿o no?

hylian

 
Cita de: "sés"
Cita de: "hylian"- ¿Cómo hago para que la pulsacion continuada de una tecla produzca movimiento?
SDL_GetKeyState() debería darte lo que quieres, pero me huelo que no la usas como deberías.
Esta función te devuelve el estado del teclado O sea, te dice que teclas están pulsadas en el momento de la llamada. Y me da que tú las estás usando dentro del evento de "tecla pulsada".


A ver si te he aclarado algo.
De momento solo he mirado esto, y llevabas razon, tenia el GetKeyState dentro del "if" del PollEvent, entonces claro solo se llamaba cuando habia un evento.

Ahora ya funciona, voy a ver si miro las otras dos cosas, aunque el tema de los ticks y esas cosas parece complejo  :wacko:  

TheAzazel

 Pero bueno hombre, si CRM32Pro = SDL  :D

es completamente posible utilizar solo SDL mientras estan con CRM32Pro(éste incluye a SDL) y cuando quieras o lo necesites... puedes usar las facilidades de CRM32Pro...

pero bueno, como quieres aprender un poco mas los entresijos no te dijo nada :P

pregunta lo que sea,  que te responderemos, ses se me ha adelantado.
Puedo anadir que para el teclado yo suelo utilizar este codigo:

// Control de eventos
SDL_PumpEvents();
keystate=SDL_GetKeyState(NULL);
if(keystate[SDLK_ESCAPE]) done=1;    
if(keystate[SDLK_F2]) SDL_SaveBMP(screen,"pong.bmp");


Esta sacado del codigo del SpacePong

pues nada, espero que te sea util, taluegorrr

hylian

 TheAzael, he visto en el codigo la llamada a Update() del ITimeSystem

¿Como haces tu en el engine el control de tiempos?

A todo esto, ¿es GPL tu libreria?, se puede obtener el código fuente?

Saludos!

fiero

Cita de: "hylian"- ¿Cómo implemento un limitador de tiempo?, bueno realmente no se si se llama asi, la idea es tener algo que llame al metodo de dibujar 30 o 60 veces por segundo, y ademas si fuera capaz de calcular los FPS que estoy teniendo seria genial. Hasta ahora consulto si hay eventos y si no hay llamo al render, lo cual no es q sea muy bueno.
Puedes hacer algo facil y efectivo. Al principio del programa dibujas algo, por ejemplo un sprite negro, que no se vea, un numero determinado de veces y mides el tiempo que le cuesta esa operación. Luego metes ese tiempo multiplicado por una costante en un número flotante. Más tarde puedes usar ese número para todas tus operaciones de desplazamientos.

Un ejemplo. Llamemos a ese numero "velocidad", utilizarias un código similar a este para mover la nave:

if(techaArriba)
{
     nave.y=nave.y + 100 * velocidad;
}

Si en tu ordenador la variable "velocidad" era 0.5, la nave se moverá 50 pixeles hacia arriba. En un ordenador el doble de rápido que el tuyo, la variable velocidad valdrá 0.25 (ya que los sprites en negro del principio se habrán dibujado el doble de rápido) y con el mismo código se moverá 25 pixeles hacia arriba. Pero como se repetirá el bucle el doble de veces, la nave se moverá 2 veces, total 50 pixeles, lo mismo que en tu ordenador.

un saludo
www.videopanoramas.com Videopanoramas 3D player

TheAzazel

Cita de: "hylian"TheAzael, he visto en el codigo la llamada a Update() del ITimeSystem

¿Como haces tu en el engine el control de tiempos?

A todo esto, ¿es GPL tu libreria?, se puede obtener el código fuente?

Saludos!
Por ahora no hay codigo fuente.... quizas algun dia lo cuelge todo...

Como ya he dicho a varias personas, no tengo ningun problema en para algo especifico enviar el codigo (no es ningun secreto industrial o bajo patente jeje).

El miembro Update() de ITimeSystem permite que los sprites se animen a velocidad adecuada, actualiza los frames transcurridos, los FPS en tiempo real y la media final de estos, ademas, lleva la cuenta en segundos desde que se inicio y estas cosillas.
De ITimeSystem puedes utilizar tambien un SetFPS(fps) que hara que tu aplicacion vaya siempre a esos fps constantes aunque este sistema no es el mas indicado para algunos juegos, suele valer para la gran mayoria (el problema con este sistema es que si tu pc no te da como minimo esos fps...todo ira muy lento...).
El otro sistema que te han dicho(fiero) no tiene este problema... pero veras los graficos a saltos... asi que.. ha gusto del consumidor.

Y bueno, para sincronizar por tiempo, puedes buscar por el google, el link que te dieron esta bien.. yo te anado uno por si te sirve de algo:
http://msdn.microsoft.com/archive/default....sdn_dos2win.asp

saludos

hylian

 Bueno siguiendo con este tema de los temporizadores... que aun no lo tengo muy claro ( que torpe q soy :D )

Por lo que veo hay dos maneras:

- Usar una variable float que se calcule en funcion del ordenador y se use como factor de los movimientos, en este sistema ¿no hace falta usar temporizadores ni ticks una vez establecida la variable de velocidad?

- Calcular cada cuanto se llama al metodo de dibujar y en funcion de este tiempo limitar la ejecucion de dicho metodo, lo cual me crea una duda:

Supongamos que tenemos el siguiente codigo (sacado del enlace que me dio sés )

while ( ! gameover ) {
 ticks = SDL_GetTicks();
 delta_ticks = ticks - lastticks;
 lastticks = ticks;

 if ( delta_ticks < 25 ) {
   SDL_Delay(25-delta_ticks)
   ticks = SDL_GetTicks();
   delta_ticks = delta_ticks + ticks - lastticks;
   lastticks = ticks;
 }
}


Lo que estamos haciendo es limitar las veces en que se llama la funcion, entonces, ¿como medimos los fps? mas que nada por q si limitamos a 40fps, siempre tendremos 40fps, y ordenadores mas rapidos estarian mas tiempo en el Delay pero seguirian dando 40fps.

Ademas otra duda que me asalta es, 300fps no significa que la animacion vaya mas rapida, significa que todo vaya mas "suave", segun la idea que tengo ahora 300 fps seria que se ejecuta 300 el mainloop del juego, con lo que iria bastante rapido como para poder manejar el juego.

Toy un poco liado con este tema  (nooo)  (nooo)

A ver si me podeis hechar una manita :D

Saludos!

hylian

 Bueno planteo aqui mas dudas :D

Estoy usando SDL_gfx para rotar sprites con SDL, pero la verdad es q en vez de rotar me deforma totalmente el sprite, estoy usando rotozoomSurface(...).

La superficie la cargo con SDL_LoadBMP(), sospecho que el problema viene por ahi.

Algunas sugerencia? :D

TheAzazel

 Como que te deforma la imagen? puedes poner aqui algun resultado?

no deberia importar de donde cargues la imagen, si de SDL_LoadBMP(), IMG_Load() o tu propia rutina. El caso es que la surface este bien... y si la bliteas(sin rotado) y se ve bien...entonces es valida.

Pon tambien el codigo que utilizas para rotar...quizas haya algo mal.
Saludos

hylian

 
Aqui la nave sin rotar




Aqui rotada apenas 2º, luego se deforma mucho mas.

El sprite es un BMP de 24bits de unos 10x30, con el fondo negro y en blanco la silueta de la "nave".

El codigo que uso para rotarlo es:


SDL_Surface *temp = rotozoomSurface(this->sprite, angulo, 1, 0);
SDL_FreeSurface(this->sprite);
this->sprite = temp;

dest.x = x; dest.y = y;
dest.w = sprite->w; dest.h = sprite->h;
SDL_BlitSurface(sprite, NULL, screen, &dest);
SDL_UpdateRects(screen, 1, &dest);


Siendo angulo una variable q cambia con el teclado.

Una cosa que puede provocar error es que dibujo el sprite en la misma posicion ( misma x y misma y ) que la del sprite sin rotar.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.