[NDS][Programación con Palib] 2. Hola mundo

Con todo vien configurado, procedemos a crear nuestro primer programa.

Iremos a C:\devkitPro y crearemos una carpeta (por ejemplo la llamamos programas.

MUY IMPORTANTE: nunca crear carpetas con espacios o no compilara. Sustituir en todo caso espacio por _. Ej: Ejercicio_dos.

Dentro de esa iremos creando carpetas para cada ejercicio.

esta carpeta la llamaremos ej01.

Ahora iremos a la siguiente ruta: C:\devkitPro\PAlib\vham y abriremos VHAM.exe.

Este sera el SDK o compilador que utilizemos.

Cuando lo tengamos abierto vamos a file>new>new project, dalemos un click el el icono de la GBAsp y pondremos en projet name Hola mundo, y en ruta la carpeta que creamos antes (C:\devkitPro\programas\ej01) y le damos a aceptar.
Ya podemos trabajar.

A la izquierda te nemos como un menu, daremos doble click en en archivo que se llama source/main.c

Y en la derecha empezamos a escribir el código:
// Includes
#include // Include de las PAlib

// Funcion main()
int main(int argc, char ** argv)
{
PA_Init(); // Iniciamos PA_Lib
PA_InitVBL(); // Iniciamos VBL
//Iniciamos el texto
PA_InitText(1,// Pantalla de arriba (1= arriba 0= tactil)
2 //Capa 2 (hay 4 capas (0, 1, 2 y 3, lo veremos mas adelante
);
//Escribimos
PA_OutputSimpleText(1,//pantalla
5, //posicion x
5, //posicion y
"¡Hola mundo!" //texto
);

//Para poner apuntes en una linea usamos ("//")

/*Para poner apuntes
en mas de
una linea
usamos esto */

// Bucle para que el programa no se pare
while (1)
{




PA_WaitForVBL();
}

return 0;
} // Fin de main()


Una vez escrito esto, daremos desde el Vham a Project>Target>Build, si compila sin ningun fallo, los archivos estarán en C:\devkitPro\programas\ej01.

Captura:
Imagen

Código Ejercicio01: http://www.megaupload.com/es/?d=RJFYHS8X
-------------------------------Tarea---------------------------------------------

Hacer que el la pantalla de abajo aparezca de texto... por ejemplo... EOL.

Captura:
Imagen

(Solo en ultimas)
Código Ejercicio02: http://www.megaupload.com/es/?d=LDD2WXV2
Buen tutorial , hasta un subnorm....subpersona puede entenderlo XD

Sigue asi platita!!!!

PD: Five Stars XD
muy bueno plata, muy util la 2º parte del tutorial, esperaremos a futuras partes ;-)
salu2
PiratePila está baneado por "crearse clones para trollear"
Gracias por el curro. Si sigue así la cosa me tendré que animar a hacer una "chapucilla" para NDS.
5 estrellas... estare al pendiente de estos tutos (que espero sean muchos xD)

Muchas Gracias!!!
AL ritmo que va, con 4 tutoriales mas, nos hacemos el apaño

Gracias de nuevo!!!!
esto es genial, y lo de las 4 capas, super interesante!

muchas gracias y tiene una pinta [fumeta]

como dicen por aqui un par de tutos mas y nos hacemos
algo casero y persona.
Wow, es de agradecer q hagas este tipo de tutoriales, aunq la programación no es lo mío pero a lo mejor me da por ponerme a intentarlo
main.c
c:/prueba/source/main.c:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
make[1]: *** [main.o] Error 1
make: *** [build] Error 2


joer x.x nunca e podido compilar :S
Estos tutoriales ya estaban en otras páginas, aunque en las que yo visitaba acabaron borrandose... (por ejemplo en Talfi).

Por cierto, sabes de alguna librería (ndslib o palib) en la que creemos un archivo de texto y podamos guardarlo en la tarjeta sd? serviría para hacer "saves" de partidas, lo que pasa es que no estoy muy puesto en DLDI's, y no se si habría que usarlas de alguna manera...

Salu2
Es la ostia!! xD yo tambien me veo haciendo una chapuzilla... xD
elchuchu escribió:main.c
c:/prueba/source/main.c:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
make[1]: *** [main.o] Error 1
make: *** [build] Error 2


joer x.x nunca e podido compilar :S


Ve aqui: C:\devkitPro\PAlibExamples\Text\Normal\HelloWorld y abre el build.bat
si no compila, reinstala todo de nuevo.

PookSD escribió:Estos tutoriales ya estaban en otras páginas, aunque en las que yo visitaba acabaron borrandose... (por ejemplo en Talfi).

Por cierto, sabes de alguna librería (ndslib o palib) en la que creemos un archivo de texto y podamos guardarlo en la tarjeta sd? serviría para hacer "saves" de partidas, lo que pasa es que no estoy muy puesto en DLDI's, y no se si habría que usarlas de alguna manera...

Salu2


Ya se que habia cosas parecidas en talfi, pero yo quiero enseñarlo de una manera mas sencilla y util.

Haber, te explico, eso se hace con PAFS, ("Palib File Sistem"), son las librerias fat de crishm (o como se diga xD) adaptadas a palib.
Ya incorpora DLDI, de todas formas saldrá mas adelante en el curso. La respuesta es si.

salu2
P.D: Empezando tuto3
He estado mirando el codigo Plata pero no has mencionado nada sobre las TABULACIONES que son importantisimas para programar

EDIT: 5 estrellas para tus 2 post

salu2
ya dije que no dejar espacios, pero no cai en mencionar que se puede sustituir un espacio por un ("_") Ej: ejercicio_dos envez de ponerlo junto.
A ver, me he puesto a compilar el primer ejemplo, y me va perfectamente, pero luego intente sacar el segundo por mi cuenta, a partir del primero, y como que no.

En el código del "Hola Mundo", pone bastante claro (lo he puesto en negrita en el código) que para la pantalla superior en 1, y para la inferior 2; guiándome por eso, intente ponerlo en la pantalla inferior, cambiando los 1 por los 2, y no iba.

Primer Ejemplo escribió: //Iniciamos el texto
PA_InitText(1,// Pantalla de arriba (1= arriba 2= tactil)
2 //Capa 2 (hay 4 capas (0, 1, 2 y 3, lo veremos mas adelante
);
//Escribimos
PA_OutputSimpleText(1,//pantalla
5, //posicion x
5, //posicion y
"¡Hola mundo!" //texto
);


Me descargué el ejemplo hecho y resulta que donde antes estaba el 1, estaba el 0 (en vez del 2 como yo pensaba) y me he quedado un poco Oooh

A ver si me lo puedes explicar...
Se ha equivocado, en realidad es asi: 0=pantalla inferior, 1=pantalla superior

Editalo plata

salu2
plata el build.bat no me compila me sale tan solo 1 archivo con extension *.nds. no han de salir mas archivos???
salu2





EDITO: okok ya me compila bien.. no habia seguido los pasos correctamente [agggtt] salu2!
Antunez escribió:A ver, me he puesto a compilar el primer ejemplo, y me va perfectamente, pero luego intente sacar el segundo por mi cuenta, a partir del primero, y como que no.

En el código del "Hola Mundo", pone bastante claro (lo he puesto en negrita en el código) que para la pantalla superior en 1, y para la inferior 2; guiándome por eso, intente ponerlo en la pantalla inferior, cambiando los 1 por los 2, y no iba.

sorry, un despiste, en el ultimo tuto esta bien

Me descargué el ejemplo hecho y resulta que donde antes estaba el 1, estaba el 0 (en vez del 2 como yo pensaba) y me he quedado un poco Oooh

A ver si me lo puedes explicar...
Vale, bueno, pues paso al siguiente tutorial, a ver si salimos todos programando de aquí XD
Duda:

Para que sirve exactamente el "return 0;" al final del código?

Graaacias.

[fies]
yo recomiendo q para hacer cualquier cosa lo mejor es copiar en tu carpeta de programas el palibtemplate cada vez que quieras empezar algo nuevo, luego lo renombras a ej1 x ejemplo y ya modificas lo q viene dentro

abres el project.vhw o el Template.pnproj y ahi modificas el codigo del programa

x lo demas estan muy bien los tutoriales, me hubiesen venido bien hace unos meses cuando empeze a intentar hacer algo, estan mejor explicados q los de talfi, q son los q use
El tuto esta bien correc, ya lo habia hecho hace tiempo pero viene bien
repasar, el problema que tengo ultimamente es que no puedo compilar y no se como se arregla.

Salu2 y five stars!
Bueno, esto aqui no va...pero para reflotar..

Tengo un problema compilando. El caso es que quiero añadir un fondo con este código (Voy a poner en negrita el código del fondo, sin el código del fondo, compila bien, asi que no se que pasa...)

-----------------------------------------------------------------------------------
#include
#include "font/all_gfx.c"
#include "font/all_gfx.h"
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"

int main(int argc, char ** argv)
{
PA_Init();
PA_InitVBL();

PA_InitCustomText(1, 2, font);
PA_InitText(0, 2);

PA_EasyBgLoad(0, 3, bg0);
PA_EasyBgLoad(1, 3, bg0);

PA_OutputSimpleText(1, 2, 4, "Texto1");
PA_OutputSimpleText(1, 2, 6, "Texto2");
PA_OutputSimpleText(1, 2, 8, "Texto3");
PA_OutputSimpleText(1, 2, 10, "Texto4");

PA_OutputSimpleText(1, 2, 20, "Texto5");

PA_SetTextTileCol(0, 6);

PA_OutputSimpleText(0, 0, 2, "--------------------------------");
PA_OutputSimpleText(0, 12, 4, "Made by JuDelCo");
PA_OutputSimpleText(0, 0, 6, "--------------------------------");

while (1)
{
PA_WaitForVBL();
}

return 0;
}

-----------------------------------------------------------------------------------



Y el error que me sale es este:

main.c
In file included from c:/devkitPro/programas/pr01/source/main.c:4:
c:/devkitPro/programas/pr01/source/gfx/all_gfx.c:14: error: 'bg0_Pal' undeclared here (not in a function)
make[1]: *** [main.o] Error 1
make: *** [build] Error 2


Se que tiene que ver con el código de la imagen para el fondo pero no se porqué da error.... lo unico que se es que va bien quitando los include y los PA_EasyBgLoad que van en negrita....

-----------------------------------------

EDIT: He estado mirando ,y en el error menciona que en la linea 14 del all_gfx.c hay un error.... esto es lo que pone en la linea 14:

PAGfx_struct bg0 = {(void*)bg0_Map, 768, (void*)bg0_Tiles, 4608, (void*)bg0_Pal, (int*)bg0_Info };


Pero es que no se que cambiar para arreglarlo...

---------------------------------------------

EDIT2: Vale, YA SE QUE ME PASA. Lo que pasa es que NO se puede poner un fondo y texto con fuente propia porque SON INCOMPATIBLES , al menos a esa conclusion he llegado, porque si quito 2 de los 4 include que hay ( o los 2 del fondo o los 2 de la fuente) funciona! Resumiendo: Pon en el tutorial que quieras que la fuente personalizada y UN FONDO es INCOMPATIBLE

Ala, hay queda eso
----------------------------------------------
Ayuda! [mamaaaaa]
judelco escribió:Bueno, esto aqui no va...pero para reflotar..

Tengo un problema compilando. El caso es que quiero añadir un fondo con este código (Voy a poner en negrita el código del fondo, sin el código del fondo, compila bien, asi que no se que pasa...)

-----------------------------------------------------------------------------------

-----------------------------------------------------------------------------------



Y el error que me sale es este:



Se que tiene que ver con el código de la imagen para el fondo pero no se porqué da error.... lo unico que se es que va bien quitando los include y los PA_EasyBgLoad que van en negrita....

-----------------------------------------

EDIT: He estado mirando ,y en el error menciona que en la linea 14 del all_gfx.c hay un error.... esto es lo que pone en la linea 14:



Pero es que no se que cambiar para arreglarlo...

---------------------------------------------

EDIT2: Vale, YA SE QUE ME PASA. Lo que pasa es que NO se puede poner un fondo y texto con fuente propia porque SON INCOMPATIBLES , al menos a esa conclusion he llegado, porque si quito 2 de los 4 include que hay ( o los 2 del fondo o los 2 de la fuente) funciona! Resumiendo: Pon en el tutorial que quieras que la fuente personalizada y UN FONDO es INCOMPATIBLE

Ala, hay queda eso
----------------------------------------------
Ayuda! [mamaaaaa]


Mentirta, asta ellunes no o puedo demostrar, pero el lunes te subo una demo que demuestra que si se puede. (era un proyeto mio k anda unpoco apartado)

salu2

P.D: el return 0; sive para que valla a la linea 0
mas o meno el bucleentero quiere decir que uando se acaba en programa vuelva a la linea 0 para que no termine.
Plata escribió:
Mentirta, asta ellunes no o puedo demostrar, pero el lunes te subo una demo que demuestra que si se puede. (era un proyeto mio k anda unpoco apartado)

salu2

P.D: el return 0; sive para que valla a la linea 0
mas o meno el bucleentero quiere decir que uando se acaba en programa vuelva a la linea 0 para que no termine.


Vale, vale.... por entonces estoy desconcertado... no se aun que le pasa cuando le "intento" meter un fondo.... lo que si admite es lo del fondo de 1 color.

En fin... :/

Gracias por contestarme, plata

Bye! [bye]
judelco escribió:
Vale, vale.... por entonces estoy desconcertado... no se aun que le pasa cuando le "intento" meter un fondo.... lo que si admite es lo del fondo de 1 color.

En fin... :/

Gracias por contestarme, plata

Bye! [bye]


por casualidad,no convertirias una imagen y despues la aumentarias de tamaño y volverias a transformarla, verdad?

prueva a crear otro ej nuevo, y en la carpeta gfx (donde el fondo) metes solo el fondo y los dos archivos del pagfx y los transformas otra vez.
aces lo mismo con font.

pones el mismo codigo que antes y compilas.
salu2
Plata escribió:
por casualidad,no convertirias una imagen y despues la aumentarias de tamaño y volverias a transformarla, verdad?

prueva a crear otro ej nuevo, y en la carpeta gfx (donde el fondo) metes solo el fondo y los dos archivos del pagfx y los transformas otra vez.
aces lo mismo con font.

pones el mismo codigo que antes y compilas.
salu2


Muchas gracias por contestarme. Ahora voy a comer pero nada mas terminar lo pruebo.

MUCHAS GRACIAS [beer]

PD: No, solo edite el fondo que hiciste tu con el fireworks

Bye!
A ver: Sigo todos los pasos, cuando pones el código, sustituyo el que viene por el que pone aquí. Sigo haciendo y al final, al compilar, me da este error:
Makefile:18: *** "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM.  Stop.

___
¿Qué hago? ¿Por qué siempre me quedo al final de los tutos?
eso es porque no encuentra el devkitarm.
vuelve a descomprimirlo y pegarlo y reinicia.
salu2
En XP he podido, aunque en 98 no. He hecho mi "tarea":
Va adjunta, por si alguien lo quiere ver. Antes de gastar un click, aviso, no es que mole demasié. Dew, al tuto 3 me voy!

P.D: No cabe (el adjunto), pero tampoco demuestra nada
Plata escribió:P.D: el return 0; sive para que valla a la linea 0
mas o meno el bucleentero quiere decir que uando se acaba en programa vuelva a la linea 0 para que no termine.


Sólo un pequeño apunte.
Yo no sé nada de programación para NDS (aunque gracias a los tutoriales igual me animo a cacharrear), pero sé bastante de C/C++ y tengo que decir (sin acritud) que tu afirmación es del todo incorrecta.

Para que el programa no termine se está utilizando un bucle infinito, mediante la sentencia while(1).

La sentencia return sirve para finalizar una función devolviendo un valor. En el caso de la función main, ese valor representa el resultado de la ejecución del programa y se utiliza para señalizar finalizaciones a causa de errores irrecuperables.

No tengo ni idea de si sirve para algo en NDS, dado que (por lo que he podido entender) la consola no espera que el programa termine, sino que la ejecución se mantiene hasta que se apaga la consola.

En los tiempos de MS-DOS se devolvía 0 para indicar que no se había producido ningún error y valores negativos para notificar los errores. Esos valores se podían capturar desde archivos BAT mediante IF ERRORLEVEL... (pero eso es otra historia).

Además, salvo que se fuerce la salida del bucle infinito con una sentencia break (cosa que no se debe hacer), esa línea de código nunca se ejecutará.

Si aparece ahí es porque se ha declarado que la función main tiene que devolver un entero (int) y, si el compilador es medianamente bueno, no compilará (o, al menos, generará un warning) si no aparece una sentencia return, aunque no sirva para nada.

Posiblemente se podría evitar declarando la función main como void en vez de int, pero no sé si eso podría tener algún conflicto con las librerías utilizadas (aunque lo dudo).

De igual forma, no creo que los programas de la NDS puedan recibir parámetros al ejecutarse (aunque vete tú a saber), por lo que los parámetros argc y argv de la función main se podrían omitir también.

Perdón por el rollo, pero sólo quería aclarar la duda del forero que preguntó.
Por lo demás, muchas gracias por los tutoriales, que son francamente interesantes.
garbas escribió:
Sólo un pequeño apunte.
Yo no sé nada de programación para NDS (aunque gracias a los tutoriales igual me animo a cacharrear), pero sé bastante de C/C++ y tengo que decir (sin acritud) que tu afirmación es del todo incorrecta.

Para que el programa no termine se está utilizando un bucle infinito, mediante la sentencia while(1).

La sentencia return sirve para finalizar una función devolviendo un valor. En el caso de la función main, ese valor representa el resultado de la ejecución del programa y se utiliza para señalizar finalizaciones a causa de errores irrecuperables.

No tengo ni idea de si sirve para algo en NDS, dado que (por lo que he podido entender) la consola no espera que el programa termine, sino que la ejecución se mantiene hasta que se apaga la consola.

En los tiempos de MS-DOS se devolvía 0 para indicar que no se había producido ningún error y valores negativos para notificar los errores. Esos valores se podían capturar desde archivos BAT mediante IF ERRORLEVEL... (pero eso es otra historia).

Además, salvo que se fuerce la salida del bucle infinito con una sentencia break (cosa que no se debe hacer), esa línea de código nunca se ejecutará.

Si aparece ahí es porque se ha declarado que la función main tiene que devolver un entero (int) y, si el compilador es medianamente bueno, no compilará (o, al menos, generará un warning) si no aparece una sentencia return, aunque no sirva para nada.

Posiblemente se podría evitar declarando la función main como void en vez de int, pero no sé si eso podría tener algún conflicto con las librerías utilizadas (aunque lo dudo).

De igual forma, no creo que los programas de la NDS puedan recibir parámetros al ejecutarse (aunque vete tú a saber), por lo que los parámetros argc y argv de la función main se podrían omitir también.

Perdón por el rollo, pero sólo quería aclarar la duda del forero que preguntó.
Por lo demás, muchas gracias por los tutoriales, que son francamente interesantes.


Eso ya lo se (Estudie C) pero a alguien que no tiene ni idea de programacion lo considere mas conveniente decirselo asi.
Lo mismo que lo de los niños que se les decia k les traian una cigueña... xD
Plata escribió:
Eso ya lo se (Estudie C) pero a alguien que no tiene ni idea de programacion lo considere mas conveniente decirselo asi.
Lo mismo que lo de los niños que se les decia k les traian una cigueña... xD


Nos está engañando!!! [+furioso]

XD Bueno, al menos se aprende. Y ya se pulirán los errores o los "malentendidos".

En fin.... mi cigueña era de paris... y la tuya? :-|
si quieres le hecho una foto cn el movil al libro de c...
para ver si me cres -.-
Plata escribió:si quieres le hecho una foto cn el movil al libro de c...
para ver si me cres -.-


Tranquilo! Que era una broma,... XD

Bueno, tu sige en tu estela [oki]
Plata escribió:Eso ya lo se (Estudie C) pero a alguien que no tiene ni idea de programacion lo considere mas conveniente decirselo asi.
Lo mismo que lo de los niños que se les decia k les traian una cigueña... xD


Supongo que tenemos diferentes puntos de vista.
No es necesario soltar un rollo como el que he largado yo. Pero entre eso y decir algo que es totalmente falso debe haber un término medio.

Una cosa es no explicar todos los detalles si no son necesarios para comprender los objetivos del tutorial y otra decir cosas que no son en absoluto cuando se trata de que la gente aprenda.

En cualquier caso, no necesitas saber qué significa o para qué sirve exactamente la sentencia return 0 para hacer programas para NDS. Con no borrarla es suficiente.

No te tomes esto como una crítica personal. Me encanta lo que estás haciendo y lo apoyo totalmente. Simplemente creo que es mejor no explicar algo a dar una explicación que puede inducir a errores.
garbas escribió:
Supongo que tenemos diferentes puntos de vista.
No es necesario soltar un rollo como el que he largado yo. Pero entre eso y decir algo que es totalmente falso debe haber un término medio.

Una cosa es no explicar todos los detalles si no son necesarios para comprender los objetivos del tutorial y otra decir cosas que no son en absoluto cuando se trata de que la gente aprenda.

En cualquier caso, no necesitas saber qué significa o para qué sirve exactamente la sentencia return 0 para hacer programas para NDS. Con no borrarla es suficiente.

No te tomes esto como una crítica personal. Me encanta lo que estás haciendo y lo apoyo totalmente. Simplemente creo que es mejor no explicar algo a dar una explicación que puede inducir a errores.


ok... admito que tienes razon. xD
me parece bien que me hagan críticas (constructivas) para poder mejorar.

salu2
Hola, he empezado con los tutoriales y ya, en este segundo me encuentro con problemas:

Plata escribió:Cuando lo tengamos abierto vamos a file>new>new project, dalemos un click el el icono de la GBAsp y pondremos en projet name Hola mundo, y en ruta la carpeta que creamos antes (C:\devkitPro\programas\ej01) y le damos a aceptar.


A mi no me aparece este icono, únicamente me aparecen los iconos PAlibC++Template y PAlibTemplate.

¿Cómo hago para que me aparezca el icono GBAsp?

Gracias.
GBAsp Significa GameBoy Advance SP, que es el dibujo del icono. Es PAlibTemplate.
polo_polo muchas gracias!!!
Muchas gracias por los tutos muy buenos X-D [oki] [oki]
Una duda se tienen que parchear para probarlos en la ds??
si es que si como??
Graciassss
en el R4 no, en los demas supongo q tampoco, si tienen dldi autopatch
41 respuestas