Puntos de control

Consulte acerca de programas, técnicas, algoritmos etc.

Puntos de control

Notapor blito83 » Sab Ago 25, 2007 3:45 pm

Hola a todos! tengo una duda general sobre los puntos de control.
Cuando usaba DIV para mis juegos recuerdo que habia un editor que te dejaba poner los puntos de control donde querias... Pero ahora que pretendo deshacerme de DIV/Fenix me entra la duda de como organizar los puntos de control...
Estos puntos no se almacenarian en un archivo grafico normal no ? (jpeg, png etc), entoces tengo que asociar un nuevo fichero a cada grafico jpg?

Hay algun programa de dibujo de sprites que te ayude en esto??

estoy del todo equivocado?
Un saludo y gracias
blito83
 
Mensajes: 6
Registrado: Mié Abr 04, 2007 11:33 pm
Ubicación: Madrid

Notapor hugoruscitti » Dom Ago 26, 2007 3:32 am

Saludos, hace unos años atrás yo también utilizaba DIV Games Studio y
el tema de los puntos de control resultaba de mucha utilidad.

Lamentablemente no tenemos algo similar ni en SDL ni en Pygame. Los
formatos de imagenes como PNG o JPEG tampoco almacenan información como
puntos de control.

Pero espera, puedes lograr exactamente el mismo efecto alterando un
poco tus funciones para imprimir gráficos, solo necesitarás almacenar
la información de los puntos de control en algún sitio.

Por ejemplo, imagina que cuento con una imagen de tamaño 150x150:

Imagen

y quisiera imprimirla en la posición (160, 200) utilizando un punto
de control (también llamado "eje" o "centro") situado enn la posición
(50, 140).

Si escribiera esto en Python utilizando pygame sería algo así:

Código: Seleccionar todo
punto_de_control_x = 50
punto_de_control_y = 140
x_destino = 160
y_destino = 200

x = x_destino - punto_de_control_x
y = y_destino - punto_de_control_y
screen.blit(imagen, (x, y))


es decir, deberías desplazar el punto de impresión final en base a la
coordenada de control que quieras asignar.

Nota que tienes toda la libertad de representar ese punto de control
como quieras. Podrías guardar esto en el mismo código del juego, en otro
archivo, en el mismo nombre del archivo [1], calcular el valor en base a
alguna cuenta o directamente utilizar el mismo punto de control para
todos los personajes del juego.

En lenguaje C podemos hacer algo similar, solo que el "desplazamiento"
de la coordenada final lo haríamos sobre una variable de tipo SDL_Rect:

Código: Seleccionar todo
SDL_Rect dst = {160, 200, 0, 0};
SDL_Surface * image = SDL_LoadBMP("shaolin.bmp");
int punto_de_control_x = 50;
int punto_de_control_y = 140;

/* desplazamiento del punto de control */
dst.x = dst.x - punto_de_control_x;
dst.y = dst.y - punto_de_control_y;

SDL_BlitSurface(imagen, NULL, screen, &dst);


No probé si este último programa funciona, pero la idea es similar a la
del programa anterior. Para utilizar puntos de control solo tienes que
"desplazar" la coordenada destino de impresión.

Bueno amigo, luego comentanos si te ha resultado.

Mucha suerte.

[1] - por ejemplo "shaolin_50_140.png" indica que la imagen tiene asignado
el punto de control (50, 140).
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: Puntos de control

Notapor rcaf » Dom Ago 26, 2007 3:39 am

blito83 escribió:Hola a todos! tengo una duda general sobre los puntos de control.
Cuando usaba DIV para mis juegos recuerdo que habia un editor que te dejaba poner los puntos de control donde querias... Pero ahora que pretendo deshacerme de DIV/Fenix me entra la duda de como organizar los puntos de control...
Estos puntos no se almacenarian en un archivo grafico normal no ? (jpeg, png etc), entoces tengo que asociar un nuevo fichero a cada grafico jpg?


Esa información no se almacena en los archivos de imágenes tradicionales como jpg, png, etc.

Una posibilidad es crear un archivo por separado, que contendrá la información necesaria para dibujar el sprite. Por ejemplo la imagen asociada (la ruta para encontrar el archivo de imagen), posición inicial, velocidad inicial, punto de control, etc., etc.

Por defecto digamos que el punto de control es la esquina superior izquierda, ya que normalmente las APIs Gráficas toman este punto como referencia para calcular donde se debe dibujar la imagen, y si no es así, como en el caso de OpenGL, se puede cambiar. Por lo tanto sea cual sea el punto de referencia que definas, al momento de renderizar o dibujar la imagen en pantalla deberás trasladar dicho punto de control a la esquina superior izquierda.

La posición del punto de control la puedes almacenar en un campo adicional de tu estructura o clase que maneje sprites, y al momento de dibujarla, tendrás que calcular la posición de la esquina superior izquierda de tu sprite, que simplemente consiste en un par de restas para cada componente (x e y).

Por ejemplo supongamos que (x,y) hace referencia al esquina superior izquierda del sprite, y (cx, cy) es un punto definido que hace referencia al centro del sprite (nuestro punto de control).

Ahora supongamos que cuando cambies la posición del sprite, solo harás referencia al punto de control (cx, cy), por lo tanto es a este punto que tendrás que sumarle o restarle unos cuantos pixeles para lograr mover el sprite.

Código: Seleccionar todo
// Mueve el sprite en diagonal hacia abajo de la pantalla, 2 pixeles
cx = cx + 2;
cy = cy + 2;


Cuando tengas que dibujar el sprite en pantalla deberás calcular la posición de la esquina superior, con una sencilla operación:

Código: Seleccionar todo
// w, h son las dimensiones del sprite. w:ancho, h:alto
x = cx - w/2;
y = cy - h /2;

// función ficticia que dibujaría el sprite en pantalla
dibujar_sprite(x, y);


blito83 escribió:Hay algun programa de dibujo de sprites que te ayude en esto??

estoy del todo equivocado?
Un saludo y gracias


Normalmente estas son herramientas que crea el programador para generar los archivos de configuración del sprite. Ahora no podría decirte cual puedes usar, porque no conozco ninguna. Pero no es complicado construirla. De hecho, es más sencillo generar manualmente un archivo de texto plano con estos datos y luego desde el videojuego cargarlo, leerlo y asignarle los valores correspondientes leídos, a los campos de tu estructura o clase que maneje sprites.

Los puntos de controles típicos hacen referencia a le esquina superior izquierda o el centro de la imagen. Aunque dependiendo de lo que deseas realizar podrían estar en las otras esquinas.

Espero que te haya quedado mas claro este asunto.

Saludos!
Roberto Albornoz Figueroa
Mi Blog
Wiki
Avatar de Usuario
rcaf
 
Mensajes: 71
Registrado: Jue Ago 10, 2006 4:35 am
Ubicación: Concepción, Octava Región. Chile

Notapor rcaf » Dom Ago 26, 2007 4:07 am

Bueno mientras escribía una respuesta, Hugo al parecer también xD... hubo un desfase de algunos minutos :lol:

Bueno, viendo la solucion de Hugo me parece bien, pero normalmente yo prefiero asignar como punto de control alguna de las esquinas o simplemente el centro, es decir:

- TOP_LEFT
- TOP_RIGHT
- BOTTOM_LEFT
- BOTTOM_RIGHT
- CENTER

Y por ejemplo en un posible archivo de configuración, nombrar uno de estos posibles estados para el punto de control.

Luego desde el código para hacer los cálculos, solo necesitamos conocer las dimensiones de la imagen (w y h) y realizar las restas correspondientes.

Ahora bien, asignar un punto de control que no sea alguno de los nombrados, no encuentro que sea adecuado, ya que solo es un punto de referencia para dibujar la imagen, nada más.

Pero ojo!, no confundir con los puntos llamados hot spot, que harán referencia a ciertos puntos de la imagen que son sensibles a colisiones. Es decir, si queremos manejar colisiones, el asunto de los puntos de control no cae aquí.

Normalmente en un archivo de configuración para el sprite definiremos ciertas áreas (boxes) que son sensibles a colisiones con otros objetos, y dependiendo de la complejidad del juego, pueden ser varias.

Una claro ejemplo, es un juego de pelea, no todo el objeto o imagen (del personaje) puede recibir una colisión, sino que solo ciertas partes, los brazos o los puños del personaje, las piernas o los pies, la cabeza, etc. Frecuentemente para estos casos es mejor construir un sencillo editor de zonas de colisión para una imagen y guardarlas en un archivo de texto, ya sea plano o con un formato propio. Después desde el código del juego, almacenaríamos en una lista o vector todas las collision boxes, para luego en caso de colisión con algún objeto, ver cual de ella realmente colisionó y realizar la acción que corresponda.

En fin, creo que el asunto de las colisiones no era el tema, pero quise tocarlo ya que a veces la gente confunde estos conceptos.

Saludos!
Roberto Albornoz Figueroa
Mi Blog
Wiki
Avatar de Usuario
rcaf
 
Mensajes: 71
Registrado: Jue Ago 10, 2006 4:35 am
Ubicación: Concepción, Octava Región. Chile

Notapor blito83 » Dom Ago 26, 2007 8:11 am

Clarisimo, me ha quedado clarisimo, gracias.
Lo que mas me conviene es crearme una herramienta.
Hugo, los resultados van para largo, pero cuando llegue el momento lo comentare.
Saludos!
blito83
 
Mensajes: 6
Registrado: Mié Abr 04, 2007 11:33 pm
Ubicación: Madrid


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron