Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Tutorial 1: Carga de superficies y blitting

Iniciado por warwolf, 16 de Octubre de 2006, 01:32:53 PM

« anterior - próximo »

warwolf

Introducción sobre los tutoriales:

Esta serie de tutoriales pretenden ser una guía para conocer la librería de CRM32Pro y cómo utilizarla. En ningún caso pretende ser una explicación exhaustiva de todos los parámetros y métodos (funciones), dado que esto es lo que hace la documentación de la librería. Así pues nosotros sólo mostraremos las bases, será tarea del lector profundizar más en las diversas opciones consultando la documentación.

También remarcar que estos tutoriales se centran en el uso de la librería, no del administrador de recursos: EditorDPF.

Tutorial 1: Carga de superficies y blitting

Introducción:

Una superficie (surface) es cómo denomina SDL a las imágenes, de esta manera cada imagen es tratada como una superficie con sus características particulares. "Blitting" simplemente significa aplicar una superficie a otra.

En este tutorial veremos como cargar un fondo y una imagen para después mostrarlos por pantalla.

Tutorial:

Trabajando con CRM32Pro
Primero de todo deberemos incluir las cabeceras de CRM32Pro y antes de poder llamar a cualquier función de CRM32Pro tenemos que inicializarlo.

#include "CRM32Pro.h"

int main( int argc, char* args[] )
{
   if(CRM32Pro.Init(SDL_INIT_VIDEO) < 0)
   {
       printf("No se ha podido iniciar CRM32Pro: %s\n",SDL_GetError());
       return 1;
   }
   CRM32Pro.Quit();

   return 0;
}

Como podéis ver hemos utilizado 3 funciones, primero explicaremos la CRM32Pro.Init(Uint32 flags).
Esta función recibe como parámetro de entrada un Uint32, esto quiere decir un (unsigned) int de 32 bits. De esta manera le decimos al CRM32Pro qué subsistemas queremos iniciar, en nuestro ejemplo solamente iniciamos el de vídeo: SDL_INIT_VIDEO. Los posibles parámetros son:
    SDL_INIT_VIDEO
    SDL_INIT_AUDIO
    SDL_INIT_TIMER
    SDL_INIT_CDROM
    SDL_INIT_JOYSTICK
    SDL_INIT_EVERYTHING
Para poder inicializar más de un subsistema los podemos concatenar con la barra vertical (|), por ejemplo: CRM32Pro.Init(SDL_INIT_VIDEO | SDL_INIT_TIMER)
Por otra parte tenemos la funcion SDL_GetError() que nos devuelve el último error que ha registrado SDL.
Finalmente, al igual que hemos tenido que inicializar la librería, cuando hemos acabado de trabajar necesitamos cerrarla. Esto lo realizaremos con la función CRM32Pro.Quit().

Iniciando el sistema de vídeo

Ahora que ya hemos inicializado CRM32Pro vamos a definir el sistema de vídeo, para ello primero rellenaremos los parámetros de configuración:

   CRM32Pro.Config.Title = "Tutorial 1"; //titulo de la ventana
   CRM32Pro.Config.VideoWidth = 640;   //establecemos la resolución: 640 de ancho
   CRM32Pro.Config.VideoHeight = 480;  //por 480 de alto
   CRM32Pro.Config.VideoBPP = 32;      //y una profundidad de bit de 32

Aquí hemos configurado el titulo de la ventana, la resolución y los bits por píxel. A pesar de que por defecto ya esta configurado para 640x480 hemos querido mostrar como configurar estos parámetros. Otros valores también configurables son: VideoAccel, para determinar el tipo de aceleración; VideoRender para determinar el tipo de render, Icon para establecer un icono de ventana a nuestra aplicación y VideoWindow para establecer la ejecución en modo pantalla completa o no.
Las opciones del VideoAccel y VideoRender son:

    ACCEL_HARDSMOOTH
    ACCEL_HARDSPEED
    ACCEL_SOFTWARE
    RENDER_DEFAULT
    RENDER_DGA
    RENDER_DIRECTX
    RENDER_FBCON
    RENDER_OPENGL
    RENDER_WINDIB
    RENDER_X11

Nota temporal: ¿Creéis necesario explicar cada opción aquí o dejamos esto para consulta del lector en la documentación?.

Una vez tenemos la configuración definida, podemos establecer dicha configuración con la función CRM32Pro.SetVideoMode().

   if(!CRM32Pro.SetVideoMode())
   {
       CRM32Pro.Quit();
       return 1;
   }


Cargando imágenes
Ahora que ya tenemos el modo de vídeo en funcionamiento, llega el momento de cargar las imágenes, para ello necesitaremos definirnos unas superficies que será donde colocaremos nuestras imágenes.

   SDL_Surface *logo = NULL;   //Las superficies que utilizaremos
   SDL_Surface *background = NULL;

   background = IImage->Load("imagenes.dpf","background");
   logo = IImage->Load("imagenes.dpf","logo");

La función para cargar las imágenes es IImage->Load(char *fileDPF, char *imgname, sHeaderIPF *header=NULL). Aquí utilizamos uno de los módulos de CRM32Pro, el IImage. El primer parámetro que tenemos que pasarle es la localización de nuestro paquete de recursos y después el nombre de la imagen que hemos definido dentro del paquete. El último parámetro es una estructura sHeadrIPF para poder definir algunas variables de la imagen, como el valor alpha (transparencia) los bps, colorKey, nombre o tamaño de la imagen.

Nota provisional: no entiendo que sentido tiene definir aquí el nombre y tamaño, puedes aclararme para que sirve esto Azazel?

Ahora vamos a pasar a la tarea del "blitting", para ello utilizaremos la siguiente función:

int CRM32Pro.Blit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface
*dst, SDL_Rect *dstrect);

Esta función copia zonas rectangulares de una superficie a otra. Si observamos los parámetros, se dividen en dos bloques, SDL_Surface del src (origen) o el dst (destino) y
SDL_Rect también del src o el dst. El primer tipo ya lo conocemos, son las superficies de unas imágenes, mientras que el segundo es un rectángulo, tiene la siguiente estructura:
typedef struct{
Sint16 x, y;
Uint16 w, h;
} SDL_Rect;
De esta forma podemos definir dos rectángulos, el del origen para definir que parte copiar y el de destino para definir en dónde copiar la imagen. Veamos entonces como copiamos el logo en la posición 100x100 del fondo:

   SDL_Rect dest;

   dest.x = 100;
   dest.y = 100;
   dest.w = logo->w;
   dest.h = logo->h;

   CRM32Pro.Blit(background,NULL,CRM32Pro.screen,NULL);
   CRM32Pro.Blit (logo,NULL,CRM32Pro.screen,&dest);

En el código podemos observar como la superficie de destino en los dos casos es CRM32Pro.screen, esta es la superficie de la pantalla que hemos definido con CRM32Pro.SetVideoMode().

Tenemos que tener en cuenta que una vez utilizadas las superficies tenemos que liberarlas de memoria para que no nos sigan ocupando espacio innecesario:

   CRM32Pro.FreeSurface(background);
   CRM32Pro.FreeSurface(logo);


Ahora que ya tenemos todo montado llega el turno de mostrarlo por pantalla, esto lo haremos con la función SDL_Flip(SDL_Surface *screen)

   SDL_Flip(CRM32Pro.screen);


Para acabar crearemos un pequeño loop para que la imagen no aparezca y desaparezca sin más, de esta forma nos esperaremos a que el usuario presione una tecla.

   SDL_Event event;

   while(done == 0) {
       while ( CRM32Pro.Update(&event) ) {
           if ( event.type == SDL_KEYDOWN )
               done = 1;
       }
   }


Descargar archivos del tutorial

warwolf

Bueno esta es la primera versión del tutorial, ahora espero comentarios sobre cosas que se necesite mejorar o aclarar o si por ejemplo creéis necesario la inclusión del código entero al final del tutorial (a parte del link de descarga)

Buen provecho ;)

TheAzazel

Well done!! :)

creo que eso va a servir a mucho gente que empiece con el desarrollo de juegos 2D.

Bien, paso a comentar un par de cosas que podrias añadir:

- Con respecto a CRM32Pro.Init() y CRM32Pro.Quit(), puedes mencionar que ambas llaman a SDL_Init() y SDL_Quit() entre otras muchas cosas, por eso los flags que se pasan a CRM32Pro.Init() son los mismos que aceptaria un SDL_Init() normal y corriente.

- Sobre las opciones del VideoAccel y VideoRender, podrias poner un descripcion muy resumida, con eso ya seria mas que suficiente.

- Otra parametro interesante del Config inicial es bMTFriendly que indica el delay opcional en ms que como minimo se esperara entre cada update logico. En sistemas viejos es mas recomendable dejarlo a 0, pero en sistemas mas nuevos, se puede probar el valor mas comun: 5. De este modo, liberara la CPU siempre y cuando no se vea afectado el rate logico.

- Sobre el parametro HeaderIPF de Image->Load(), me he dado cuenta que en la doc es un poco ambiguo(lo he corregido ahora). Quiere decir que si no pasas parametro o es NULL, no hara nada, pero si le pasas un puntero a una estructura headerIPF, en caso de cargar correctamente la imagen, devolvera rellenada la estructura. En realidad, esto dejo de tener sentido hace tiempo, por eso puse el parametro por defecto NULL(quise mantener la compatibilidad con versiones anteriores), pero vamos, puedes poner que no es parametro esta en desuso y que ya no sirve para nada. Si alguien quiere saber las propiedades de la imagen cargada...lo puede hacer directamente sobre la surface de SDL... pero cuando hice todo eso, aun no usaba SDL :P

- Muy bien por usar CRM32Pro.Blit() :), agrega si eso un comentario a que es equivalente a SDL_BlitSurface() salvo que esta respeta el sistema de cursores de CRM32Pro  :D

- Quizas alguien se pregunte porque no se libera CRM32Pro.screen.. pues bien, esa superficie especial es creada con CRM32Pro.SetVideoMode() como indicas y liberada automaticamente cuando se cierra la libreria (mas concretamente, cuando se cierra el subsistema de video de SDL)

- Meecckkk: Error de Windows jeje digo, error en el tuto :). Para volcar a pantalla, si, se puede usar SDL_Flip(CRM32Pro.screen) pero eso puede provocar errores y cosas extrañas... la forma mas correcta de hacerlo es...
->> while(CRM32Pro.Update()) { do whatever you want } sin eventos
o
->> while(CRM32Pro.Update(&event) { do loquesea } con eventos
Es decir, tal y como tienes el codigo, sobraria el SDL_Flip() ya que despues cumples con el bucle while(CRM32Pro.Update(&event))..
Esto es de lo que queria mas info Sipox y estoy en ello, el metodo de actualizar con Update(), SetRates() y SetRenderCallback() pero como esto es un tuto basico, olvida todo eso y simplemente comenta que el .Update() vuelca a video entre otras muchas cosas.

bueno bueno y yo creo que esto es todo :)
El tuto me ha gustado mucho y bueno, en cuanto lo tengas colgado en algun sitio...link que te hago :P o ya sabes, si lo haces en algun otro formato, te lo puedo subir a mi web, por descontado que tu nombre ira junto con ello jejeje

Saludos

Harko

La verdad es que el SDL_Flip no sobra. Fijate en lo que ocurre si lo quitas, la pantalla sale en negro hasta que le pones algo encima con lo que le obligas a redibujarla.

Una pregunta, si quiseramos trabajar con un tileset donde habria que cargarlo para poder usar el blit correctamente? Me parece que no reconoce los CSprites.

Y ya puestos, como se puede crear una animacion directamente en el editor DPF como la tienes en el del spacepong, he estado probando algunas cosas y no consigo que funcione. Al final termino haciendolas en codigo.

Harko.

PD: No hace falta definir W y H en el rectangulo dest, da igual lo que pongas que blit cogera toda la imagen. Sin embargo si defines eso en el rectangulo de origen solo cogeras el trozo de imagen que tu quieres.

Una muestra, cambia el codigo por esto y veras a que me refiero (he añadido otro SDL_Rect de nombre orig):
   //Cargamos los graficos
   background = IImage->Load(IMG_RESOURCE,"background");
   logo = IImage->Load(IMG_RESOURCE,"logo");

   //copiamos las imagenes a la pantalla
   SDL_BlitSurface(background,NULL,CRM32Pro.screen,NULL);

   //Definimos donde dibujaremos el logo
   dest.x = 100;
   dest.y = 100;

   orig.x = 0;
   orig.y = 0;
   orig.w = (logo->w)/2;
   orig.h = (logo->h)/2;

   SDL_BlitSurface(logo,&orig,CRM32Pro.screen,&dest);

   dest.x = 170;
   dest.y = 100;

   orig.x = (logo->w)/2;
   orig.y = 0;
   orig.w = (logo->w)/2;
   orig.h = (logo->h)/2;
   SDL_BlitSurface(logo,&orig,CRM32Pro.screen,&dest);

   dest.x = 100;
   dest.y = 140;

   orig.x = 0;
   orig.y = (logo->h)/2;
   orig.w = (logo->w)/2;
   orig.h = (logo->h)/2;
   SDL_BlitSurface(logo,&orig,CRM32Pro.screen,&dest);

   dest.x = 170;
   dest.y = 140;

   orig.x = (logo->w)/2;
   orig.y = (logo->h)/2;
   orig.w = (logo->w)/2;
   orig.h = (logo->h)/2;
   SDL_BlitSurface(logo,&orig,CRM32Pro.screen,&dest);

   // Mostramos la pantalla
   SDL_Flip(CRM32Pro.screen);
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

warwolf

Cita de: "TheAzazel"- Con respecto a CRM32Pro.Init() y CRM32Pro.Quit(), puedes mencionar que ambas llaman a SDL_Init() y SDL_Quit() entre otras muchas cosas, por eso los flags que se pasan a CRM32Pro.Init() son los mismos que aceptaria un SDL_Init() normal y corriente.
A ver, estoy intentado hacer el tutorial lo más minimalista posible para no bombardear a los nuevos como yo :roll: y creo que detalles como ese no son necesario, dado de que el perfil típico de lector será alguien que no tiene ni idea de SDL ni CRM32Pro. En el caso de que sepa SDL, no le costará mucho darse cuenta; y en el caso de que lo desconozca pero más tarde se pase al SDL pues verá que funciona igual ;)
Cita de: "TheAzazel"- Sobre las opciones del VideoAccel y VideoRender, podrias poner un descripcion muy resumida, con eso ya seria mas que suficiente.
oki, are una breve descripción
Cita de: "TheAzazel"- Otra parametro interesante del Config inicial es bMTFriendly que indica el delay opcional en ms que como minimo se esperara entre cada update logico. En sistemas viejos es mas recomendable dejarlo a 0, pero en sistemas mas nuevos, se puede probar el valor mas comun: 5. De este modo, liberara la CPU siempre y cuando no se vea afectado el rate logico.
Uuuuu tenemos rate lógico y delay lógico, esto no lo acabo de pillar, ¿no es lo mismo? bueno, supongo que si esta así no, pero no entiendo la relación entre las dos opciones :?
Cita de: "TheAzazel"- Sobre el parametro HeaderIPF de Image->Load(), me he dado cuenta que en la doc es un poco ambiguo(lo he corregido ahora). Quiere decir que si no pasas parametro o es NULL, no hara nada, pero si le pasas un puntero a una estructura headerIPF, en caso de cargar correctamente la imagen, devolvera rellenada la estructura. En realidad, esto dejo de tener sentido hace tiempo, por eso puse el parametro por defecto NULL(quise mantener la compatibilidad con versiones anteriores), pero vamos, puedes poner que no es parametro esta en desuso y que ya no sirve para nada. Si alguien quiere saber las propiedades de la imagen cargada...lo puede hacer directamente sobre la surface de SDL... pero cuando hice todo eso, aun no usaba SDL :P
Mmmm siguiendo la idea de no meter demasiada info, elimino todo el tema del HeaderIPF al estar obsoleto ;)
Cita de: "TheAzazel"- Muy bien por usar CRM32Pro.Blit() :), agrega si eso un comentario a que es equivalente a SDL_BlitSurface() salvo que esta respeta el sistema de cursores de CRM32Pro  :D
Igual que antes, comentarios que a mi parecer sobran... sencillez y claridad, ese es mi objetivo :D
Cita de: "TheAzazel"- Quizas alguien se pregunte porque no se libera CRM32Pro.screen.. pues bien, esa superficie especial es creada con CRM32Pro.SetVideoMode() como indicas y liberada automaticamente cuando se cierra la libreria (mas concretamente, cuando se cierra el subsistema de video de SDL)
Ves esto si que puedo hacer una pequeña reseña
Cita de: "TheAzazel"- Meecckkk: Error de Windows jeje digo, error en el tuto :). Para volcar a pantalla, si, se puede usar SDL_Flip(CRM32Pro.screen) pero eso puede provocar errores y cosas extrañas... la forma mas correcta de hacerlo es...
->> while(CRM32Pro.Update()) { do whatever you want } sin eventos
o
->> while(CRM32Pro.Update(&event) { do loquesea } con eventos
Es decir, tal y como tienes el codigo, sobraria el SDL_Flip() ya que despues cumples con el bucle while(CRM32Pro.Update(&event))..
Esto es de lo que queria mas info Sipox y estoy en ello, el metodo de actualizar con Update(), SetRates() y SetRenderCallback() pero como esto es un tuto basico, olvida todo eso y simplemente comenta que el .Update() vuelca a video entre otras muchas cosas.
Como ha comentado Harko más adelante si lo quitas no funciona, esto es debido a que en el tutorial ni siquiera inicializo un render (solo pongo imagenes y punto), por eso si lo quitas no pinta nada, ya que el pintado inicial nunca se llega a hacer (solo repinta si se ve obligado por factores externos como minimizar ventana o pasar otra ventana por encima). También es verdad que esto no tiene mucho sentido ya que en todas las aplicaciones se definira un render, mmmm esto lo podria cambiar...

PD los cambios que comento que realizaré, los cambiaré más tarde que ahora se me ha acabado el tiempo xD

warwolf

Cita de: "Harko"PD: No hace falta definir W y H en el rectangulo dest, da igual lo que pongas que blit cogera toda la imagen. Sin embargo si defines eso en el rectangulo de origen solo cogeras el trozo de imagen que tu quieres.
Sips, pero es lo que comentaba antes, en el tutorial explico como crear rectangulos y los parámetros que tiene, después un usuario avispado hará sus investigaciones ;)

PD. Yo también he tenido mis problemas en el tema de las animaciones, al final me he aclarado, pero sigo teniendo mis dudas... ya explicaré/preguntaré más en detalle cuando realize el pertinente tutorial ;)

TheAzazel

Buenas!

Respecto a que quieres que el tuto sea lo mas simple posible, ok, no habia caido en ello, luego entonces como bien dices, no te enrolles contando cosas mas avanzadas :)

Y respecto al polemico SDL_Flip()... me reitero, no es necesario, con el CRM32Pro.Update() es suficiente pero direis..si lo quitamos no se ven las surfaces..bien, amigos, habeis descubierto un bug, absurdo como el solo pero un bug, eso pasa porque el testing lo hago yo que se lo que se puede hacer y lo que no, y no puedo probar todas las combinaciones posibles :)

Ya lo he corregido, asi que para la proxima version funcionara correctamente, por ahora y para que funcione, podeis añadir ITimeSystem->Init(); despues de iniciar con CRM32Pro.Init(). Tambien debeis añadir el flag de SDL_INIT_TIMER en el CRM32Pro.Init(). El problema es con los timer, si no se inicia, CRM32Pro.Update() no actualiza la pantalla de forma correcta, es una tonteria pero esta ahi y hace que falle. Quizas podreis indicarlo como que en la version 4.95 es necesario inicializar el timer, cosa que en la 5 no sera obligatorio para algo tan basico como blitear dos superfices...

Otra opcion es que os pase la version de esta libreria... una v4.96 digamos que ya tiene algunas mejoras de la futura v5...como vosotros querais :)

Respecto al tema tiles y sprites, mañana por la mañana antes de irme de vacas, pondre un post nuevo como lo basico de ello para que podais ir tirando con ello.

Saludos y me voy a dormir que me caigo de sueño!!

Pescado

Muy buena iniciativa, creo que me viene bien. Acabo de descargar todos los archivos necesarios para usar la libreria y encuanto termine mis examenes voy a fijarme detalladamente en el tuto y en la libreria :)
The Toonminator!
http://www.toonminator.com

warwolf

Hombre, pues si puedes pasar la versión 4.96 mejor que mejor, y si además ya tienes implementado el "HotX" y "HotY" de los sprites, mejor que mejor.

Por cierto, tengo un problemilla en conreto, que no sé si ya se puede hacer o se tendría que implementar alguna función (a ver si antes de irte de vacaciones me sacas de dudas).

Tengo algunas animaciones que empiezan pero a la hora de repetirse tienen que hacerlo a partir de un cierto frame (no desde el 0); por ejemplo: personaje empieza a carse al vacío, cae, cae, cae, cae .... ahora mismo la animación haría: empieza a carse al vacío, cae, empieza a carse al vacío, cae, empieza a carse al vacío, cae, ...

Por eso pregunto si hay alguna manera de decir que a la hora de hacer el loop empieze desde un cierto frame.

PD. También podría hacer 2 animaciones separadas, pero encuentro que es más engorroso :P

TheAzazel

Estoy a punto de largarme pero como soy un todo un geek no puedo sin antes contestaros.

Cambio de planes :), sacare una 4.96 en forma de beta (vamos, que no estara tan testeada como cuando saco otras releases) e incorporara las siguientes mejoras:

-Nueva version de CFont. Soporte de kerning.
-Corregidos un par de bugs y muestra avisos de cosas no muy correctas en ITimeSystem y CRM32Pro.Update(). Y otro en los botones tipo slider.
-ScreenFX tendra flip,mirror,rotacion y escalado
-Nueva version de sprites con soporte a hotx,hoty, rotacion, escalado y una posible funcion para selecionar el frame inicio y el frame final dentro de una animacion.

Si, eso de las animaciones podrias hacerlo con varias pero no es muy dificil implementar y cambiar en tiempo de ejeucion el frame inicial y final dentro de la animacion, ahora, el grafista tendra que tener cuidado en respetar ese orden... pero vamos, la posiblidad de hacerlo la doy que le veo utilidad.

Y para cuando? pues espero que para antes que termine este mes, todo depende del tiempo libre que consiga, de todos modos, si me das tu mail te puedo ir pasando las versiones para que lo adjuntes con el tuto y sea correcto.

Saludos

Harko

Al final consegui que el editor dpf me cargara un sprite con animacion. Solo habia que modificar el offset para que lo hiciera.

Lo que me he fijado es que si pones la animacion como "ping pong" (ida y vuelta) sufre una pausa en el ultimo frame, parece que lo repite.

He estado mirando la forma de arreglarlo por codigo, pero al parecer no lo puedo hacer con todos los sprites juntos. El comando Create hace basicamente lo mismo que el dpf.

Tambien he estado mirando otra cosa, ¿como podemos hacer que la imagen tenga su punto cero en otro sitio que no sea la esquina superior izquierda? Queria usar los offsets o anclajes, que es como llaman a eso, para no tener que ir calculando continuamente la posicion desde la esquina sino desde los pies del personaje, por ejemplo. En SDL creo que bastaba con mover ligeramente las coordenadas x,y del rectangulo de destino o algo asi, pero no estoy muy seguro de como hacerlo aqui.

Otra cosa, parece que el editor dpf no trabaja muy bien con tilesets con margen. Habia pensado usar algo asi para tener informacion directa del ColorKey y de los offsets de las imagenes, pero tendre que hacerlo de otra forma.

Ale, ya tienes cosas que mirar cuando vuelvas ;). Buen viajee.

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

TheAzazel

ya si que si que... me ultimo post jejeje

voy a mirar eso del ping pong...podria ser que se repita la ultima imagen..dos veces y de ahi el retraso, no hagas nada con tu codigo(ahorra tu tiempo jeje) porque sera algo de eso :).

sobre como variar el punto 0...si te refieres a sprites, eso lo estoy implementando ahora, es el hotx y el hoty, asi que tampoco hagas tu ningun calculo extra, en la v4.96 ya lo tendras disponible ejeje

CitarOtra cosa, parece que el editor dpf no trabaja muy bien con tilesets con margen. Habia pensado usar algo asi para tener informacion directa del ColorKey y de los offsets de las imagenes, pero tendre que hacerlo de otra forma.
Eso si que no lo entiendo  :roll: , explicamelo de otro modo a ver...

Harko

Cita de: "TheAzazel"ya si que si que... me ultimo post jejeje

voy a mirar eso del ping pong...podria ser que se repita la ultima imagen..dos veces y de ahi el retraso, no hagas nada con tu codigo(ahorra tu tiempo jeje) porque sera algo de eso :).

sobre como variar el punto 0...si te refieres a sprites, eso lo estoy implementando ahora, es el hotx y el hoty, asi que tampoco hagas tu ningun calculo extra, en la v4.96 ya lo tendras disponible ejeje

Pues estupendo, asi dejo de comerme el coco con eso. De todas formas lo habia solucionado de forma un pelin chapucera dejandolo en "Loop" y colocando un frame mas con la posicion central de las tres que tenia la animacion. Ahora ya camina bien jeje.

Cita de: "TheAzazel"
CitarOtra cosa, parece que el editor dpf no trabaja muy bien con tilesets con margen. Habia pensado usar algo asi para tener informacion directa del ColorKey y de los offsets de las imagenes, pero tendre que hacerlo de otra forma.
Eso si que no lo entiendo  :roll: , explicamelo de otro modo a ver...

Me refiero a que si le cargas algo como esto:


(cortesia del tutorial numero 7 de programacion grafica isometri en sdl de sante)

Y le dices que el offset para los tiles es de 64, por ejemplo, al no salirle las cuentas por culpa del margen te da error. Estaria bien poder incluirle en otro lugar el tamaño del margen y que lo calculara automaticamente.

Esto es util para hacer cosas como estas, el punto 0,0 (y en cada encrucijada) del tileset es del mismo color que el valor que tiene que tener ColorKey y los puntos azules (que casi no se nota el color) que hay en los margenes indicaria la posicion que deberia de tener hotx y hoty. Asi no hay que tenerlo apuntado aparte :lol:

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

TheAzazel

jejeje, debo estar espeso pero sigo sin pillarlo...

algun ejecutable donde apreciar eso?

:P

Harko

Ejecutables no tengo, pero puedes mirarte el tuturial de sante en el que esta bien explicadito, de ahi es de donde saque la idea :P.

Por cierto, no sabras como se puede tratar con un mapa de durezas satisfactoriamente por casualidad? (de paso aprobecho jeje)

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity






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.