Muy bien, ya conocemos el sistema para cargar fondos, es el turno de los sprites. Un sprite es un gráfico que puede representar miles de cosas: el protagonista del juego, las opciones de un menú, proyectiles... y así hasta infinitas cosas. Sin duda es la parte más entretenida de aprender de PAlib, puesto que los sprites se pueden animar, desplazar en pantalla, hacer que salten (usando gravedad)... Seguro que os lo pasaréis pipa siguiendo este tutorial :).
Una vez más, deberemos repasar y ampliar anteriores conceptos, así como aprender unos nuevos. La mayoría seguro que os sonarán, pero mejor asegurarnos:
Enseguida veréis que fondos (día 3) y sprites son tremendamente similares. Las diferencias, realmente, son mínimas. Eso no quita que los explique en detalle ;).
Ah, y por cierto, no es difícil deducir que para practicar con sprites necesitaremos sprites, ¿no? A continuación una lista con las características de los sprites que usaremos en este tutorial:
Muy bien, ahora toca transformar nuestros sprites a lenguaje binario. Usaremos el mismo programa que con los fondos: el PAGfx (más información en el día 3, Paso 1: Obtener los fondos)
Antes de nada, pondremos una imagen con forma de sprite. Un sprite no es como un fondo EasyBg, debe tener un tamaño determinado. Los aceptados por PAlib para su compilación, son:
En definitiva, cualquiera de esos tamaños. Las únicas excepciones son 8x64, 16x64 y 64x8, 64x16. Recordad que el tamaño se indica anchoxlargo. Si el sprite es más pequeño, lo encuadráis y punto. Recordad que los espacios que no queramos que se vean se tienen que colorear con el color que seleccionemos como transparente en el PAGfx.ini. Una vez hecho esto, guardamos la imagen en formato *.PNG.
Preparamos el PAGfx en la carpeta source tal y como se explica con los fondos en el día 3. Hecho esto, abrimos el PAGfx.ini. Una vez más, veremos su contenido:
#TranspColor Magenta #Sprites : #Backgrounds : #Textures:
Si antes usamos el apartado #Backgrounds, ahora el que nos interesa es el apartado #Sprites (seguro que ya lo habíais adivinado xD). Recordad que #TranspColour es el color transparente, tanto de nuestros sprites como de nuestros fondos, fijaos bien cuál escogéis (Negro, Blanco, Verde y Magenta).
Procedamos a convertir los sprites. Lo primero de todo es indicar la carpeta en la que está, en forma de directorio de toda la vida. Por ejemplo, C:\este\es_un\ejemplo\de_directorio_de\sprite.PNG. Recordad que si el sprite está en la misma carpeta que el convertidor, basta con que abreviéis a sprite.PNG.
Seguidamente, irá la paleta de colores en la que está nuestro querido sprite. Las posibilidades son:
La paleta se escribe tal y como he puesto, no separéis el número de la palabra o habrá error.
Y, por último, el nombre de la paleta en la que se guardará la información básica del sprite. Poned de nombre lo que os venga en gana (sin espacios), teniendo en cuenta que sprites con el mismo nombre de paleta se guardarán en un solo archivo de paleta.
En definitiva, en el apartado de #Sprites debería quedar algo como esto:
sprite.PNG 256colour paleta
Con esto, deberían estar estos archivos junto al compilador (aparte de los fondos y demás):
Y con esto ya tenemos todos los archivos necesarios. Y ahora: ¡Rápido, al batmov... esteem código!
Antes de nada, tenemos que recordar cómo añadir los gráficos a nuestro proyecto:
#include <PA9.h> //Include de las PAlib #include "gfx/all_gfx.c" #include "gfx/all_gfx.h"
¿Refrescada ya la memoria? xD. Simplemente hay que añadir los archivos all_gfx.c y all_gfx.h al proyecto para tener los sprites listos para usarse.
Cargar sprites no es mucho más difícil que cargar un fondo cualquiera. Únicamente hay que conocer estas funciones:
PA_LoadSpritePal(pantalla,prioridadpaleta,(void*)nombrepaleta_Pal); //Cargamos la paleta con el sprite que queramos cargar. //Únicamente será necesario si no estaba cargada con anterioridad. //Recuerda que una sola paleta sirve para varios sprites. PA_CreateSprite(pantalla,prioridadsprite,(void*)nombresprite_Sprite,tamañoxy,paletacolores,paleta,posicionx,posiciony); //Creamos el sprite en pantalla. //Para el tamaño, usaremos OBJ_SIZE_xXy. siendo x (minúscula) el ancho e y el largo.
La única dificultad añadida, es tener que cargar la paleta. Y aún así no tiene nada de complicado...
¡Veamos ahora estas funciones en un ejemplo práctico!:
#include <PA9.h> #include "gfx/all_gfx.c" //Includes con info de gráficos #include "gfx/all_gfx.h" //(en este ejemplo sprites) int main(void) { // init PA_Lib PA_Init(); PA_InitVBL(); PA_LoadSpritePal(0,0,(void*)sonic_Pal); //Cargaremos la paleta con el(los) sprite(s) que queramos crear ahora. PA_CreateSprite(0,0,(void*)TutorialPAlibDia4EjemploSpriteEstatico_Sprite, OBJ_SIZE_32X64,1,0,10,10); //Creamos el sprite (lo sé, un nombre un poco largo :P while(1) { PA_WaitForVBL(); } return 0; }
¡Con esto tendremos un precioso sprite en pantalla! He aquí el resultado final:
Si aún os suena vagamente la idea de los DualBackGrounds, he llegado a tiempo...
Un sprite Dual tiene la característica de poder pasearse por las 2 pantallas como si fuese una sola. Este efecto es muy usado por las tropas Nintenderas, así que no os resultará desconocido.
Ahora bien, ¿qué código debo conocer para usar sprites Dual?
PA_DualLoadSpritePal(nºpaleta,(void*)nombrepaleta_Pal); // EXACTAMENTE igual que los sprites normales, sólo que no se indica pantalla (lógico). PA_DualCreateSprite(nºsprite,(void*)nombresprite_Sprite,tamañoxy,nºpaletacolor,nºpaleta,posicionx,posiciony); //Creamos el sprite Dual. Ten en cuenta que la posición y ahora va de 0 a 383. PA_SetScreenSpace(espacio); //Con esto puedes indicar el espacio (en píxels) que hay entre pantallas. //0 para pantallas juntas.
Y ya está. Ahora vuestro sprite tiene el doble de espacio para pasear ;).
NOTA: Si no vais a mover el sprite verticalmente, es una estupidez usar esto...
Ahora pensaréis... "Esto no es más que una estatua. Aún si pudiese animarlo y darle vida..."
¿Y quién dijo que no se puede? De eso va precisamente la siguiente parte del tutorial ;)
AHORA llega lo divertido de verdad :D.
Para realizar esta parte es necesario tener claros los comandos (tanto de botones como de Stylus), y la "táctica" usada para mover los fondos en el día 3 (Paso 3).
Éste es el código que se necesita conocer para mover un sprite:
PA_SetSpriteX(pantalla,nºsprite,posicionx); //Actualiza la posición x del sprite. PA_SetSpriteY(pantalla,nºsprite,posiciony); //Actualiza la posición y del sprite. PA_SetSpriteXY(pantalla,nºsprite,posicionx,posiciony); //Combinación de las anteriores.
¡Y ahora, el ejemplo!:
#include <PA9.h> #include "gfx/all_gfx.c" //Includes con #include "gfx/all_gfx.h" //info de sprites s32 x; //¡No nos olvidemos de declarar nuestras variables antes! int main(void) { // init PA_Lib PA_Init(); PA_InitVBL(); PA_LoadSpritePal(0,0,(void*)ash_Pal); //Cargamos la paleta del sprite PA_CreateSprite(0,0,(void*)TutorialPAlibDia4EjemploSpriteAnimado_Sprite, OBJ_SIZE_32X64,1,0,10,10); //Creamos el sprite while(1) { x+=Pad.Held.Right-Pad.Held.Left; //Comprobación para x PA_SetSpriteX(0,1,x); //Movemos el sprite PA_WaitForVBL(); } return 0; }
Y con esto, el sprite se moverá en pantalla dependiendo de si pulsamos izquierda o derecha. ¡Exactamente igual que en un juego de plataformas! :D
Lo sé, lo sé, queda muy raro que un sprite se mueva sin moverse no queda muy p'allá... Pero eso es porque aún no hemos acabado ;)
¿Alguna vez se te ha ocurrido jugar con tu reflejo en un espejo? Si levantas la mano izquierda, el espejo levanta su derecha, y viceversa. Y, si miras a tu derecha, ¡tu reflejo mirará a su izquierda!
¿Qué quiero decir con esto? Pues que si aplicamos el volteo a un sprite, se verá lo que sería su reflejo. Lo que estaba a su derecha, se coloca a su izquierda, y viceversa... Entre otras cosas, esto nos sirve, en primer lugar, ahorrarnos el espacio que nos ocupa algunos frames (Si es una persona andando, nos quedamos con los frames que miran a la derecha y no necesitaremos los que miran a la izquierda), y en segundo, para darle más realismo al sprite, si hacemos que mire hacia donde pulsemos.
Éste es el código a saber:
PA_SetSpriteHflip(pantalla,sprite,volteo); //El sprite se voltea horizontalmente (la izquierda a la derecha y viceversa). //Si en volteo ponemos 0, el sprite tendrá su posición original, con 1 se voltea. PA_SetSpriteVflip(pantalla,sprite,volteo); //El sprite se voltea verticalmente (lo de arriba abajo y viceversa). //Si volteo vale 0, posición original, con 1 se voltea.
Adaptando el ejemplo anterior, obtendremos esto:
#include <PA9.h> #include "gfx/all_gfx.c" //Includes con #include "gfx/all_gfx.h" //info de sprites s32 x; //¡No nos olvidemos de declarar nuestras variables antes! int main(void) { // init PA_Lib PA_Init(); PA_InitVBL(); PA_LoadSpritePal(0,0,(void*)sonic_Pal); //Cargamos la paleta del sprite PA_CreateSprite(0,0,(void*)TutorialPAlibDia4EjemploSpriteEstatico_Sprite, OBJ_SIZE_32X64,1,0,10,10); //Creamos el sprite while(1) { if(Pad.Newpress.Left) //Si pulsamos izquierda... { PA_SetSpriteHflip(0,1,1); //El sprite mira a la izquierda (se voltea) } if(Pad.Newpress.Right) //Si pulsamos derecha... { PA_SetSpriteHflip(0,1,0); //El sprite mira a la derecha (posición original) } x+=Pad.Held.Right-Pad.Held.Left; //Comprobación para x PA_SetSpriteX(0,1,x); //Movemos el sprite PA_WaitForVBL(); } return 0; }
¡Ahora el sprite mira hacia donde se mueve! ¿A que cada vez nos está quedando más realista? ;)
¡Pero la cosa aún no ha acabado! ¿No os resulta raro ver una moverse sin caminar, ni correr, ni nada? ¡Aún nos queda darle vida a nuestro sprite!
¡Ahora viene lo bueno! Un sprite se anima cuando va cambiando de frames constantemente, representando movimiento, reacciones... Por ejemplo, si animamos un sprite desde un frame con la pierna derecha levantada, y vamos pasando por otros que representan cómo baja la pierna y levanta la otra, hasta otra en la que la pierna levantada es la izquierda, estamos animando al sprite. El efecto conseguido, es que el sprite mueve las piernas.
PD: Recordad que estos tutoriales van destinados a que aprendáis, si no entendéis algo hacédmelo saber para que mejore las explicaciones. Nadie ha nacido ni aprendido ni enseñando ;)
Ahora, técnicamente hablando, un sprite se puede animar de mil formas: infinitamente, una vez, dos, tres... con movimiento lineal (del 1º al último frame, y vuelta al primero para seguir) o de balanceo (del 1º al último y del último al 1º)... Nos bastará con aprender un tipo de animación de momento, pero recomiendo saber todos para poder exprimir al máximo el poder de los sprites ;).
Antes de hacer nada de código, hay que preparar el sprite con sus frames. Es IMPORTANTE que hagáis como os digo: Preparad el 1er frame como haríais con un sprite normal. Muy bien, ahora, el siguiente frame va justo debajo. Id poniendo los frames por orden (esto es vital, puesto que no podremos ir saltando de un frame a otro por las buenas). Al final, debéis tener cada frame como un sprite con su tamaño correspondiente. Si el sprite es de 64x64, ponemos 1 frame de 64x64 (centrad si es necesario), abajo otro frame de 64x64, y así con todos. Aseguraos al final que el tamaño total de todo es correcto. Ejemplo de como debe quedar. Compilad el PAGfx y pasemos al código.
Por el momento os enseñaré las 2 animaciones más básicas, pero que darán bastante juego:
PA_SetSpriteAnim(pantalla,nºsprite,nºframe); //Con esta función, actualizaremos el sprite a un frame concreto. PA_StartSpriteAnim(pantalla,nºsprite,1er frame,ultimo frame,nºframesporsegundo); //La función por excelencia. //El sprite se animará desde el 1er frame al último pasando por los intermedios, a la velocidad indicada. PA_StopSpriteAnim(pantalla,nºsprite); //Detiene la animación del sprite. //Ten en cuenta que el sprite quedará en el frame en el que estaba en ese momento.
Antes de darles un uso determinado, os recomiendo acostumbraros al funcionamiento de estas funciones. Mirad este mini-ejemplo:
#include <PA9.h> #include "gfx/all_gfx.c" //Includes con #include "gfx/all_gfx.h" //info de sprites int main(void) { // init PA_Lib PA_Init(); PA_InitVBL(); PA_LoadSpritePal(0,1,(void*)ash_Pal); PA_CreateSprite(0,1,(void*)TutorialPAlibDia4EjemploSpriteAnimado_Sprite, OBJ_SIZE_64X64,1,1,10,10); while(1) { if(Pad.Newpress.Start) //Si pulsamos start... { PA_SetSpriteAnim(0,1,0); //El sprite mira al frente y queda quieto } if(Pad.Newpress.Right) //Si pulsamos derecha... { PA_StartSpriteAnim(0,1,1,6,6); //El sprite empieza a correr } if(Pad.Released.Right || Pad.Released.Left) //Si no se pulsa nada... { PA_StopSpriteAnim(0,1); //La animación se congela } PA_WaitForVBL(); } return 0; }
Poned este código en algún proyecto y usad este sprite. Jugad un rato con él, vereis como las funciones os quedan más claras.
¡Muy bien, ahora apliquemos lo que aprendimos ahora en el ejemplo de antes!:
#include <PA9.h> #include "gfx/all_gfx.c" //Includes con #include "gfx/all_gfx.h" //info de sprites s32 x; //¡No nos olvidemos de declarar nuestras variables antes! int main(void) { // init PA_Lib PA_Init(); PA_InitVBL(); //Estas líneas ya no las comento, doy por supuesto que a estas alturas las tenéis más que claras. PA_LoadSpritePal(0,1,(void*)ash_Pal); PA_CreateSprite(0,1,(void*)TutorialPAlibDia4EjemploSpriteAnimado_Sprite, OBJ_SIZE_64X64,1,1,10,100); PA_SetSpriteHflip(0,1,1); while(1) { if(Pad.Newpress.Left) //Si se pulsa izquierda... { PA_SetSpriteHflip(0,1,0); //El sprite mira a la izquierda (posición original) PA_StartSpriteAnim(0,1,1,6,6); //Se anima (se pone a correr) } if(Pad.Newpress.Right) //Si se pulsa derecha... { PA_SetSpriteHflip(0,1,1); //El sprite mira a la derecha (se voltea) PA_StartSpriteAnim(0,1,1,6,6); //Se anima (se pone a correr) } if(Pad.Released.Right || Pad.Released.Left) //Si no se pulsa nada... { PA_StopSpriteAnim(0,1); //El sprite se para (deja de correr) PA_SetSpriteAnim(0,1,0); //Y mira al frente } x+=Pad.Held.Right-Pad.Held.Left; //Comprobación para x PA_SetSpriteX(0,1,x); //Se actualiza la posición del sprite PA_WaitForVBL(); } return 0; }
¡Y con esto, tenemos ya todo más que aprendido! Los sprites ya no suponen ningún secreto para vosotros, mi enhorabuena ;).
¡Pero alto! No vamos a estar acumulando sprites en pantalla infinitamente , ¿no?
En algún determinado momento del juego, los sprites que hay nos pueden molestar debido a que ya no pintan nada en pantalla (enemigos liquidados, proyectiles, etc). Se hace necesario borrarlos.
¿Cómo? Fácil:
PA_DeleteSprite(pantalla,nºsprite); //Borra el sprite de pantalla
Y sprite liquidado :D. Pero tened en cuenta un detalle: el sprite está eliminado, pero la paleta sigue cargada. Así que, si queremos volver a crear el sprite, no hará falta volver a cargar la paleta (salvo que la paleta se cargara cuando los dinosaurios gobernaban la Tierra).
Esto os supone la ventaja de no llenar rápidamente la memoria VRAM, cosa que es de agradecer, especialmente si usáis fondos pesaditos, ya sabéis (*ejem* 8 y 16bit, *ejem*).
Muy bien, ahora la cosa se está poniendo interesante ahora que empezamos a saber lo básico. De deberes, pues intentad encontrar un buen sprite por internet y animadlo como más rabia os dé. Yo me despido aquí, y hasta el próximo tutorial ;).
Comentarios
A este tuto
Le falta a la hora de poner el sprite en la función PA_LoadSprite, además de poner el nombre del sprite, debes poner _Sprite igual que _Pal en la paleta.
Consolas: DS, WII, 3DS.
Juegos 3DS: Super mario 3D Land, Mario Kart 7, One Piece Unlimited Cruise SP y Sonic Generations
Eshop: Pullblox, Mario vs Donkey Kong ¡Los minis marchan de nuevo!, Birds Mania 3D, Fun! Fun! Minigolf touch!, Colors 3D, Kid icarus (GC) Super Mario land 2:6 golden coins(GB), Calculadora Mario, Pyoro, Inchworm Animation y Photo dojo.
Consolas pirateadas: WII, DS.
Consolas en espera para piratearlas: 3DS.
Más de un sprite a la vez
Y si... por ejemplo quisiera animar dos sprites a la vez (porque entre los dos forman el mismo botón), como sería?
No se me ve bien
pues eso que no se me ve bien el sprite de pokemon en la pantalla;
y en el codigo no me da error;
me podeis ayudar?
Imagino que será la paleta de colores
Cambiale la paleta para que se vea bien, que imagino que será por eso. Esto es lo que tienes que cambiar:
PA_CreateSprite(pantalla,prioridad, (void*) nombre_Sprite, tamaño, paletadecolor, x, y);
Súmale uno e imagino que se verá bien...
Espero que sea eso, si te surge algún problema más, dilo.
Salu2
¿Quieres estar totalmente informado sobre el universo 3DS? Visita Magic3DS.
También puedes estar al tanto de toda la actualidad de 3DS en Twitter: @Magic3DS
No es eso
No es por el color, sino que se me ve el sprite "divido" y en dos;
pero gracias de todas formas;
aunque si sabes por que se me divide dímelo;
gracias
Si la parte de arriba
del sprite está abajo y la de abajo arriba, es porque los frames están mal hechos. Asegúrate de que no hay un espacio raro arriba del sprite. Si mal no recuerdo, el tamaño total era de 64x448.
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
En realidad me sale la parte
En realidad me sale la parte derecha del sprite en la izquierda y viceversa,
¿tengo que hacer lo mismo?
¿?
Bastante raro. Asegúrate de que el sprite tiene las medidas correctas y está bien posicionado, aunque lo más probable en ese caso es que hayas indicado mal las medidas del OBJ_SIZE al crear el sprite.
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
Gracias; pero ahora se me ve
Gracias; pero ahora se me ve bien solo el primer frame, los demás se me ven igual que antes;
¿que hago?
Asegurarte de que
no metes frames de más a la animación.
Salu2
Ya lo he solucionado
Ya he descubierto el error. he colocado un cero en lugar de un uno; aunque os doy las gracias a todos por vuestra ayuda.
por que me sale esto?
porque me da ahora este error?
main.c
c:/ProjectesDevkitpro/Prova/source/main.c: In function 'main':
c:/ProjectesDevkitpro/Prova/source/main.c:13: error: 'sprite1_Pal' undeclared (first use in this function)
c:/ProjectesDevkitpro/Prova/source/main.c:13: error: (Each undeclared identifier is reported only once
c:/ProjectesDevkitpro/Prova/source/main.c:13: error: for each function it appears in.)
make[1]: *** [main.o] Error 1
make: *** [build] Error 2
ayuda por favor
ya lo he solucionado
ya lo he solucionado
Que estoy haciendo mal ?
no se por que, pero me da este error:
make[1]: *** No rule to make target `c:/ProjectesDevkitpro/Prova/source/gfx/fondo1.c', needed by `main.o'. Stop.
make: *** [build] Error 2
Me podeis decir por que?
gracias
Es por la imagen....
mira que se transfome bien, que se llame asi cuando la trasformas y que luego usas el nombre correctamente en el proyecto. Si haces todo eso, no deberías tener ningún problema.
PD: El fallo es con el "fondo1", mira todo lo referente a ese fondo ;)
Salu2
¿Quieres estar totalmente informado sobre el universo 3DS? Visita Magic3DS.
También puedes estar al tanto de toda la actualidad de 3DS en Twitter: @Magic3DS
Borra
la carpeta build del proyecto, o límpialo (ejecutando clean).
El problema se debe a que antes usabas el archivo fondo1.c pero dejaste de usarlo, por eso la compilación "pide" el archivo.
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
Gracias
Gracias
opino
que el siguiente tuto sea de sonido porque solo se un poco de el
Que chido que ya van poniendo mas y mas tutos
la verdad es que ya los extrañaba, aunque ya se la mayoria de las cosas que ponen aun asi creo que es perfecto que vayan poniendo palib desde cero para los novatos
felicidades por los tutoriales se estan volando la barda
Buen tuto
Pues eso, buen tuto.
Gracias ;)
Salu2
PD: ¿Conectado a estas horas? xD
UAU
Ultimamente has estádo travajando de lo lindo, 2 tutoriales en menos de un mes... ...gracias por los tutos, aora mismo me pongo a empollar.
PD: GRacias, por fin un tuto que trata los sprites!!
I like:
Tres
si contamos la actualización del entorno de programación (aunque no sirvió de mucho xD)
Salu2, y disfrútalo.
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
bravo. Vaya curro os estais
bravo. Vaya curro os estais metiendo en el body.
Saludos!
Jeje
Gracias hombre, se hace lo que se puede :D.
A sarutoby: Al principio os doy los sprites que uso yo, y por el tuto tienes el código. No sé qué mejoraría que lo subiese todo junto...
Salu2 a los 2 xD
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
es que a uno
le da perreza empezar a abrir un programa, copiar el codigo, crear las carpetas, copiar las imagenes, ect. Y esa pereza hace que uno diga cosas, como que nos dejes un ejemplo de descarga. Por cierto, en elproximo tuto, puedes esplicar a fondo los Boleanos?
I like:
En realidad
yo sooy muy perezoso, aun que no estoy orgulloso de ellos, pero... ...pero a la hora de programar, me pongo en serio, en un dia hago 100lineas, pero asi, al dia siguiente no hago nada, ¿por que? puessimple, por que el dia anterior hici 100 lineas. Ves un buen metodo, hago muchas lineas en un dia, al dia siguiente no hago nada...
PD: Los boleanos, ya se que solo tienen dos valores, pero a la hora de aplicar los boleanos, pos no me sale nada bien. Es que intenté seguir unos tutoriales de como crearun menú con boleanos, pero no entendia una mierda, y si no tenia ejemplos para descargar, aun pero... ...Por cierto, aparte des este:
alguien conoce un tuto para usar los boleanos?
Y los boleanos, si que me salen bien, si los aplico en las funciones API, pero como PAlib ya no las tiene... ...pos ya no puedo usar bool, por que yo solo savia ponerlos en las funciones API...
I like:
Dime
qué no entiendes de los booleanos exactamente...
Un booleano es una variable que sólo puede tener dos valores. Puede decirse que es como una lámpara: o está encendida, o está apagada, no puede tener más posibilidades.
A un booleano se le puede dar valor de 2 maneras:
En definitiva, un booleano es una variable como cualquier otra, pero que sólo tiene 2 valores posibles. La ventaja frente a usar u8 o similares, es que si a esa variable sólo le vas a dar 2 valores posibles, usa booleanos porque ocupan 1 bit de memoria, si usas u8 gastas tontamente un byte (aunque no es mucho lo que se pierde xD).
Salu2
Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderás trucos para resolver tus dudas antes.
Un u8, u16, u32, s8, s16,
Un u8, u16, u32, s8, s16, s32 o bool ocupan lo mismo. Esto pasa porque el compilador tiene que alinear las direcciones de memoria a 4 bytes. Se puede forzar a usar la memoria justa, pero digamos... que se acuerda de tu familia mientras compila. Eso sin contar que forzandolo lo único que consigues es ganar un poquito de espacio, pero pierdes velocidad. Y aun así, forzando al compilador, bool ocupa lo mismo que u8 o s8, asi que sería mejor usar esos.
Yo personalmente siempre uso int (s32) por si a parte de 1 o 0 luego necesito añadir mas valores, y para ganar en velocidad, salvo que necesite por narices usar otro tipo.
Bueno si es cierto
pero como el tutorial no llo escriviste tu, si no que lo actualizaste, pos... ...entonces que te parece 2 y medio 5/2 esta seria la faccion, o esta: 3/2, o... ...poderia hacer miles, asi que conformaté con esas...
PD: Poderias poner ejemplos para descargar, no compilados en NDS, si no ejemplos con el codigo, las imagenes y todo listo para compilar? Por favor, ¿lo puedes poner?
I like: