Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dudas diversas CFont y CSprite

Iniciado por warwolf, 23 de Octubre de 2006, 05:49:43 PM

« anterior - próximo »

warwolf

CFont
¿Porqué cuando "dibujo" en la superficie CRM32Pro.screen en el siguiente refresco se queda guardado lo que he bliteado?
Ejemplo, si imprimo un texto con el módulo CFont en CRM32Pro.screen y en otro refresco cambio el texto, el texto antiguo se queda en pantalla.

CSprite
¿Porqué tengo que llamar en cada refresco a la función CSprite::MoveTo()?
Es decir, en el caso de que la posición del sprite no varie, si no llamo al MoveTo el Sprite "tiembla"

¿Se pueden definir más animaciones? Por ejemplo, si el prota tiene animaciones como "pegar puñetazo" o "pegar patada" a parte de las de movimiento, como hago para definirlas y/o llamarlas? ya que solo tengo opción de definir las animaciones con movimientos (8 direcciones) y estado normal...

Ale, de momento eso es todo, pero seguro que poco a poco van surgiendo más cosas :P

TheAzazel

Como te dije, alla voy...

CitarCFont
¿Porqué cuando "dibujo" en la superficie CRM32Pro.screen en el siguiente refresco se queda guardado lo que he bliteado?
Ejemplo, si imprimo un texto con el módulo CFont en CRM32Pro.screen y en otro refresco cambio el texto, el texto antiguo se queda en pantalla.
Sencillo, cuando dibujas la fuente estas modificando fisicamente la superficie CRM32Pro.screen y CFont (como CTile) no soporta AutoRestores automaticos (asi como IButton y CSprite si lo hacen).
Vamos, que cuando escribas texto tienes dos opciones:

-te ocupas de copiar y restaurar el fondo antes de escribir texto (via optima pero quizas, un pelin mas engorrosa).

-volcar y actualizar todos los graficos y asi problema resuelto, esta seria la via facil, nada engorrosa y que dadas las maquinas actuales no es tan inviable como antiguamente, todo depende de lo que busques.

CitarCSprite
¿Porqué tengo que llamar en cada refresco a la función CSprite::MoveTo()?
Es decir, en el caso de que la posición del sprite no varie, si no llamo al MoveTo el Sprite "tiembla"

¿Se pueden definir más animaciones? Por ejemplo, si el prota tiene animaciones como "pegar puñetazo" o "pegar patada" a parte de las de movimiento, como hago para definirlas y/o llamarlas? ya que solo tengo opción de definir las animaciones con movimientos (8 direcciones) y estado normal...
Ese temblor me suena a que estas en modo doublebuffer y estas usando MoveTo() sin utilizar un CRM32Pro.SetRenderCallback()... confirmame estos hipoteticos casos y...si me pasas codigo por email el cual poder probar mucho mejor.

Respecto a las animaciones... sip, puedes crear muchas mas animaciones. La clasificacion SPRSTATE_NORMAL y luego direcciones es porque todo sprite tendra como minimo alguna de ellas(pues no es generico ni nada el normal jeje) o todas pero luego, dentro de cada uno de esos tipos, puede haber 256 animaciones. El modus operandi es el siguiente:
cuando creas una animacion, por ejemplo SPRSTATE_NORMAL, sera la animacion normal 0, la siguiente animacion SPRSTATE_NORMAL automaticamente sera la 1 y para referenciarla tendras que usar SPRSTATE_NORMAL+1. Da igual si en la imagen pones salteadas SPRSTATE_NORMAL con SPRSTATE_UP o demas... el primer SPRSTATE_NORMAL en aparecer sera el 0 y asi sucesivamente, me explico?.
Por ejemplo, en el juego RTS que tengo a medias, los sprites de los peones tienen todos los estados generales de SPRSTATE_NORMAL, SPRSTATE_UP y demas.. para cuando esta vacio, con madera defino por ejemplo WITH_WOOD 1 y para referenciar la animacion derecha con madera utilizo SPRSTATE_RIGHT + WITH_WOOD y asunto arreglado.
Creo que es un sistema simple y permite ser bastante extensible.
La verdad que es normal que preguntes esto porque no lo pone en ningun lado(capon para mi por la mala docs de los sprites!).

Bueno, pues espero haber resuelto tus dudas.
Espero respuesta para esos sprites tembladores jejee

Saludos!

Harko

A mi tambien me interesa que expliques eso de las animaciones mas detalladamente, que no lo he pillao :D

Sobre lo del CFont, yo suelo acabar quitando todos los autorrestores y limpiando toda la pantalla, es menos lioso la verdad. Puede que algun dia me haga una funcion para hacer todo eso por cada sprite, ya veremos.

Por cierto, no se si es el autorrestore o que pero si os fijais al chocar dos sprites a veces dejan una mancha en el fondo, tambien ocurre en el space pong, debe ser algun fallo tonto de esos que te tienen ocupado tres dias :P.

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

warwolf

Cita de: "TheAzazel"Ese temblor me suena a que estas en modo doublebuffer y estas usando MoveTo() sin utilizar un CRM32Pro.SetRenderCallback()... confirmame estos hipoteticos casos y...si me pasas codigo por email el cual poder probar mucho mejor.
Siento no poder confirmarte tus hipotesis, estoy utilizando la ACCEL por defecto (SOFT) y llamo al CRM32Pro.SetRenderCallback(), ahora te envio un mail con el código.

Sobre las animaciones de los CSprite, muchas gracias :D la verdad es que no esta documentado todo esto y para "adivinarlo" iba listo :P

TheAzazel

Cita de: "Harko"A mi tambien me interesa que expliques eso de las animaciones mas detalladamente, que no lo he pillao :D

Sobre lo del CFont, yo suelo acabar quitando todos los autorrestores y limpiando toda la pantalla, es menos lioso la verdad. Puede que algun dia me haga una funcion para hacer todo eso por cada sprite, ya veremos.

Por cierto, no se si es el autorrestore o que pero si os fijais al chocar dos sprites a veces dejan una mancha en el fondo, tambien ocurre en el space pong, debe ser algun fallo tonto de esos que te tienen ocupado tres dias :P.

Harko.

Sobre las animacion de los sprites... a ver como te lo puedo explicar... digamos que hay 9 estados generales que definen las animaciones posibles que son:

SPRSTATE_NORMAL
SPRSTATE_UP
SPRSTATE_DOWN
SPRSTATE_LEFT
SPRSTATE_RIGHT
SPRSTATE_UPLEFT
SPRSTATE_UPRIGHT
SPRSTATE_DOWNLEFT
SPRSTATE_DOWNRIGHT

que ocupan 8bits de la parte alta de los 16bits del entero que define el estado de la animacion (desde codigo puedes cambiar el estado de la animacion con SelectAnim()).
Y los 8bits bajos restantes, puedes utilizarlos a tu antojo.
Por eso, cada estado de animacion puede tener a su vez, 256 subestados definidos por el desarrollador.
Y como? pues en la imagen tu coloca todas tus animaciones(por defecto, son todas de estado SPRSTATE_NORMAL) y luego ve clasificando si quieres una a una a que estado pertenece...si SPRSTATE_UP o SPRSTATE_UPLEFT, lo que quieras.

Despues, la libreria clasificara automaticamente los subestados en orden de aparicion, es decir, el primer SPRSTATE_NORMAL que encuentre le dara el subestado 0, el segundo SPRSTATE_NORMAL sera el 1 y asi sucesivamente.

Desde codigo, para seleccionar por ejemplo el SPRSTATE_NORMAL con subestado 2, solo tienes que indicar:

mySprite->SelectAnim(SPRSTATE_NORMAL + 2)

Es decir, que el grafista tiene que colocar las animaciones siguiendo un orden preestablecido para facilitar la vida del desarrollador.
Volviendo al caso del peon, imagina que tenemos al peon vacio(subestado 0), llevando madera(subestado 1) o llevando comida(subestado 2), pues podriamos definir:

WITH_NOTHING 0
WITH_WOOD     1
WITH_FOOD      2

y para ponerle a andar hacia la derecha de vacio, podriamos usar:

mySprite->SelectAnim(SPRSTATE_RIGHT + WITH_NOTHING)

pero si fuera cargado, pues le ponemos con un WITH_FOOD o WITH_WOOD.

Eso el caso sencillo, pero luego puedes utilizar estos defines para simplificar mucho el codigo en acciones que por ejemplo haran varios sprites como puede ser atacar, y bueno, los limites son bastante amplios...


Por otro lado, los autorestores los tienes implementados en CSprites y en ICursor por lo que no hace falta que inviertas tiempo en emular lo mismo desde tu codigo.

Ahora bien, ICursor funciona de maravilla y en todos los casos pero como bien indicas, los sprites tienen un problema cuando dos de ellos se superponen, y no es un bug tonto precisamente jeje, es algo que conozco desde hace tiempo y que tras mucho pensar llegue a la conclusion que la unica forma de evitarlo es con listas ordenadas de restores y luego dibujas todos los sprites que has ordenado dibujar en ese frame. Despues, hable con EX3 y el me dijo que habia hecho lo mismo para su lib asi que no me quedara otra que implementar esas listas si quiero evitar que a veces, un restore de un sprite restaure como fondo bueno a otro sprite que esta superpuesto. Por el momento, en el spacepong he pasado de ese error ya que lo tendre que solucionar pero si, esta ahi :S

Bueno, pues espero haberte resuelto tus dudas :)

ya me diras! Saludos

TheAzazel

Cita de: "warwolf"
Cita de: "TheAzazel"Ese temblor me suena a que estas en modo doublebuffer y estas usando MoveTo() sin utilizar un CRM32Pro.SetRenderCallback()... confirmame estos hipoteticos casos y...si me pasas codigo por email el cual poder probar mucho mejor.
Siento no poder confirmarte tus hipotesis, estoy utilizando la ACCEL por defecto (SOFT) y llamo al CRM32Pro.SetRenderCallback(), ahora te envio un mail con el código.

Sobre las animaciones de los CSprite, muchas gracias :D la verdad es que no esta documentado todo esto y para "adivinarlo" iba listo :P

Esta noche compilo y pruebo, de momento asi muy por encima, he visto que creas un tile para los muros, otro para el suelo y otro para algo mas, 3 en total... eso es asi por algo? porque bien podrias definir uno solo y usarlo como si fuera un tileset donde el 1 fuera el suelo, el 2 fuera los muros y el 3 pues el otro que no recuerdo jeje, ademas, de ese modo puedes cargar directamente los mapas que te has puesto, es decir, defines en cada casilla del mapa el numero del tile dentro del tileset que corresponda... vamos, no se si lo has hecho teniendo otra cosa en mente pero yo lo haria asi :P

Cuando quieras, te puedo pasar el TitanBomber y asi lo ves aunque en graficos esta bastante fatal jeje, necesitaria un grafista!

pues luego te cuento...

warwolf

Bueno, esto es así.... porque los gráficos estaban en imagenes separadas y como no serán los definitivos sino que son para hacer pruebas guarras los programadores pues ya servian así.

Pero tienes toda la razón, lo mejor será hacer un tileset y solo tener que cargar una imagen ;)

*Mejora apuntada para la próxima versión ;)*

En fin, esperando veredicto (y puñaladas) xD

TheAzazel

Ya lo tienes en tu mail!

ya me contaras :P

warwolf

Bueno, gracias por tu respuesta en el mail, sólo comentar por aquí que sobre las fuentes tenía razón Azazel, hay que guardar el fondo para poder recuperarlo luego o "pintar" el fondo antes de escribir para que todo vaya bien.

Sobre el segundo aspecto del sprite "tembolorso", pues sin querelo descubrí un pequeño bug que Azazel ya lo está solventando ;)

Gracias por este magnífico soporte jeje :roll:

TheAzazel

De nada warwolf :)

la verdad que se nota que yo mismo hago de betatester... ya que dejo bastantes bugs por ahi tontos pero que no llego a detectar... sera por que mi subsconsciente no quiere ser perro en las pruebas? jejeje






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.