Después que leer el capitulo 1 y el capitulo 2, ya debes tener tu entorno de desarrollo completamente funcional, y has compilado tu primer programa basico para la PSP. Es hora de avanzar a mejores cosas y mas grandes. El "hola mundo" es una aplicacion perfecta, una gran experiencia para aprender, pero no hace nada. Eso es lo que este tutorial va a pretender enmendar. Como hacer que nuestros programas hagan las cosas.
En este capitulo no lo vamos a cubrir todo, ni podremos crear el programa completamente funcional que tengamos ideado hacer funcionar en nuestra PSP. Nos lo tomaremos como los primeros pasos. Aprenderemos los componentes basicos de programacion de la PSP. (en C) Volveremos a abrir nuestra primera aplicacion con el editor, en la cual editaremos algunas lineas y añadiremos otras para lograr que nuestro homebrew haga algo.
Lee el capitulo 2, si no tienes nociones de como establecer un programa basico es un requisito previo para este tutorial.
El producto final de este tutorial sera un programa que cuenta hacia arriba hasta que el usuario apriete un boton o hasta que el contador llegue a un lÃmite predefinido. Una aplicacion perfecta para dar los primeros pasos; combina varios elementos de core de programas C, para crear un resultado util y sencillo sin requerir muchas funciones de programa especificas. Cubriremos en este capitulo las variables, las declaraciones de if/then, los loops, el texto que formatear, e interactuar con los botones.
Antes de nada, necesitaremos agregar dos encabezamientos mas include. El primero debera darnos un poco mas de control sobre la pantalla (imprescindible para uno de las funciones que usaremos posteriormente). El segundo archiva la pulsacion de los botones de la PSP. Hay que agregar estos dos archivos, pspdisplay.H y pspctrl.H. Debajo de las 2 lineas #include que ya teniamos, incluiremos las declaraciones:
#include <pspdisplay.h> #include <pspctrl.h>
Y ese es todo el arreglo extra que necesitamos. Ahora procederemos a hacer nuestro codigo mas funcional. A partir de aqui todo el codigo que vamos a añadir sera dentro de la funcion main , reemplazando la declaracion de printf de el capitulo 2. Lo primero que haremos es declar las variables que utilizaremos en nuestro programa de la siguiente forma.
//EJAMPLO (Psuedo Codigo) //NO AÑADIR AL PROGRAMA type name=value;
El tipo indica el de tipo datos de la variable. Cada dato que escribe el tipo puede contener solo los datos del tipo que se indique. Por ejemplo, si escribimos int puede contener cualquier numero no decimal desde -32767 a 32767. Un float es como un int, pero puede tener decimales. El char puede contener una letra. Para nuestro programa, solo usaremos el int y un tipo especifico de PSP llamado SceCtrlData que contiene el estado de los botones de los controles de la PSP.
Declamos las dos variables que utilizaremos, metemos las dos lineas de codigo siguientes codigo en nuestro programa (éstos deben ir en lugar de la linea printf("Hola Mundo"); que escribimos en el capitulo 2; después de la linea SetupCallbacks();.
int counter = 0; int i = 0; SceCtrlData pad;
Asi que ahora tenemos tres variables que podemos utilizar. Dos del tipo int, nombrados como counter e i conteniendo un valor de cero como inicio. Y uno de tipo SceCtrlData, nombrado como pad, que es llenado las pulsaciones de los botones. Esto es algo a tener presente al escribir tus propios programas. Si declaras una variable sin inicializarla (como nuestra variable pad), no estara vacio. Contendra la informacion que estava previamente en ese trozo de la memoria. Declarar la variable asigna una cierta cantidad del espacio de la memoria para la variable para ser almacenada. La inicializacion es lo que lo vacia y nos permite utilizarlo. La razon que nosotros no hemos inicializado pad al mismo tiempo que declaramos que es porque no tendria realmente sentido. Desde que tiene el boton la entrada, no lo puede inicializar escribiendo a maquina un valor. Nosotros lo inicializaremos mas tarde, antes de que vayamos a utilizar para algo.
Ahora nosotros le daremos al usuario algunas instrucciones. La forma de hacerlo es utilizando printf les mostramos un mensaje. Asi agregamos el siguiente codigo después de declarar la variables:
printf("Pulsa [X] para iniciar el contador");
¿Te parece familiar? Bueno. Es la misma funcion que utilizamos para producir nuestro "Hola Mundo" enel capitulo 2. Si se te ha ocurrido compilar y ejecutar la aplicacion en tu PSP. Ahora verias Pulsa [X] para iniciar el contador, en vez del antiguo Hola Mundo.
Ahora necesitamos decirle al programa que espere hasta que el usuario apriete el boton X. Puede parecer quee sto podria ser una cosa muy dificil de hacer. Afortunadamente, tenemos algo que funciona a la perfeccion para este problema. Se llama un loop. Basicamente lo que hace es correr por un bloque de codigo muchas veces. Hay los tipos diferentes de loop disponibles.(for, while, do while, etc), pero en este tutorial solo introduce dos de esos loops, el loop while y el loop for. Es un concepto simple, cuando nuestro programa esta trabajando, hacemos una declaracion informando al usuario, seguido de un loop que funcionara mientras se cumpla esa declaracion. Por ejemplo, si tuvieramos un bloque de codigo que incremente una variable (empezando con un valor de cero) en uno cada vez el loop corra, y la declaracion que pusieramos al loop fuera i<10 ejecutaria el codigo del loop diez veces, porque en el undécimo tiempo cuando se verifica el valor de la variable, sera 10, que no es menos de 10, asi que la declaracion seria falsa. Otro concepto importante que necesitaremos aprender es que verdadero y falso son sinonimo de 1 y 0 respectivamente.
Nuestro loop no sera de la forma clasica. Podria serlo facilmente, pero he examinado un puñado de codigo de proyectos de PSP, y siempre lo hacen esta forma, asi que sera bueno acostumbrarnos en las formas que posteriormente iremos viendo en los homebrews de la gente. De todos modos, lo que estaremos haciendo no es mas que un loop infinito. No es realmente infinito aunque, porque (como tan convenientemente no mencioné antes), hay otra forma de salir de un loop aparte de la declaracion del control que se vuelve falsa. Eso es la declaracion de interrupcion.(Break) Introduciremos el principio de nuestro lopp.
while(1) {
Cuando veamos esta declaracion del control siempre evaluara a verdadero, porque 1 es igual que verdadero. Asi que el codigo siguiente (las lineas entre el paréntesis de apertura y el paréntesis de conclusion) ejecutara repetidas veces hasta que encuentre una declaracion de interrupcion.
La proxima linea es donde ponemos el valor de pad. Utiliza una funcion que se define en el archivo pspctrl.H que incluimos al principio. Esto es una llamada de la funcion. Ante todo, nosotros le pasamos dos valores a la funcion.No modifiques nada de aqui, Solo necesitamos separar los valores con una coma. La segunda cosa que es un poco diferente es que pasaremos una variable. Ponemos el nombre de la variable en vez de un numero. La tercera cosa que es caprichosa es que necesitamos pasarlo con el operador & delante de la variable. Indica realmente la direccion del operador, y cuando tengamos mas conocimientos nos familizaremos con ello. Basicamente lo que hace es en vez de pasar el valor de la variable, pasa la direccion de la memoria. Por ahora, no sabemos lo suficiente para ser capaces de cambiar el valor de una variable que necesite utilizar el operador &. Asi que aqui esta como pondremos pad para contener la posicion actual de los controles de la PSP:
sceCtrlReadBufferPositive(&pad, 1);
Si te preguntas para que es el 1 , no te preocupes por ello. Pone el numero de buferes a leer, pero siempre he visto usar 1. Honestamente, yo no sé por qué querria modificar nada de la variable pad (si hay una razon, alguien por favor me lo aclara, y yo lo puedo agregar aqui).
La proxima linea contiene una la declaracion if. Nos sirve para poder programar la logica en nuestras aplicaciones. Lo qué hace es ejecutar un bloque de codigo si una declaracion evalua a verdadero. Aqui, lo que queremos hacer es un break fuera del loop si se pulsa el boton X. El cuál, pause efectivamente nuestro programa y pasa a la proxima seccion. Si la declaracion evalua a falso, acaba de saltar el codigo, y si hay una declaracion else, ejecuta ese bloque de codigo. Nosotros no tenemos ninguna declaracion mas, asi que volvera al loop otra vez, verificando continuamente la posicion de los botones, y viendo si se ha apretado el boton X. Mientras estamos en ello, nosotros cerraremos nuestro loop terminando un paréntesis de la conclusion.
if(pad.Buttons & PSP_CTRL_CROSS) { break; } }
La declaracion en el if() se traduce como Si se pulsa el boton X.... Si ese boton se pulsa, hara el break, si no, continuara con el loop.
Cuando el usuario pulsa el boton X, nosotros queremos empezar un contador que funcionara hasta que el usuario pulse el boton O. ¿Asi que qué hacemos nosotros? ¡Acertaste, otro loop! Asi que empezaremos este loop, y agregaremos en el codigo de la salida (Sustituyendo por PSP_CTRL_CIRCLE en lugar de PSP_CTRL_CROSS).
while(1) { sceCtrlReadBufferPositive(&pad, 1); if(pad.Buttons & PSP_CTRL_CIRCLE) { break; }
Ahora, necesitamos utilizar una funcion nueva. Para limpiar la pantalla. Recordad que tenemos Pulsa X para iniciar el contador en la pantalla, necesitamos borrar eso.
pspDebugScreenClear ();
Con esta linea se limpiara la pantalla, asi que ahora estamos listos para imprimir de nuevo(y decir al usuario como ellos pueden parar el contador y salir el programa).
La primera linea te tiene que parecer familiar. Es una declaracion sencilla printf. Un detalle que puede parecerte extraño es el \n al final de la linea. \N es un caracter especial que significa una linea nueva. Asi que el caracter nuevo de la linea es el equivalente de apretar ENTER en su teclado. La segunda declaracion de printf es un poco diferente. Nosotros necesitamos imprimir nuestra variable counter. Para hacer esto, nosotros utilizaremos el operador %. Basicamente esto significa que queremos mostrar una variable, y el caracter que sigue dice al programa que tipo de variable es. Para un entero, nosotros hacemos el uso i (i ntegrar) El segundo parametro que pondremos es que variable queremos que imprima. En nuestro caso queremos imprimir la variable counter. Asi que agregamos dos lineas mas en el programa.
Ahora necesitamos aumentar nuestro contador en uno para que la proxima vez que haga el loop, el numero mostrado sea uno mas alto. ¿No seria realmente un contador si no hicieramos esto. Podriamos hacer esto en uno de dos formas. La primera, menos comun seria poniendo counter = counter+1; funciona perfectamente bien, pero hay una forma mas facil. Para incrementar una variable por uno, utilizaremos el operador + +.
counter++;
Es exactamente lo mismo que counter = counter+1;. Pero queda mas elegante, ¿no creeis?
Ahora necesitamos meter una pausa corta para incluir el trabajo del boton Home. Aqui estaremos utilizando otro loop for. Este loop es ligeramente distinto del lopp while. Toma tres parametros. El primero es la inicializacion; pondra la variable para el principio del loop. El segundo es la declaracion del control, que hace la misma funcion que la declaracion de control en el loop while. Y el tercero es lo nosotros queremos que le suceda a nuestra variable al final de cada loop.
for(i=0; i<5; i++) { sceDisplayWaitVblankStart(); }
Esto ejecutara nuestra linea de codigo 5 veces (cuando sea i = 0, 1, 2, 3, y 4).
Y finalmente, necesitamos terminar el bloque de codigo por el que el loop corre por con un paréntesis sencillo de conclusion
}
Ahora acabar. Esto es el codigo que correra después que se ejecute la declaracion break . Queremos mostrar un mensaje sencillo, y el conde final de nuestro contador. Asi que vaciaremos la pantalla y utilizaremos declaraciones mas de printf como hicimos en el loop, pero con un texto diferente.
¡Y tenemos nuestro nuevo codigo listo! Ahora con un par de cambios esteticos del capitulo 2.
Recordad que necesitaremos cambiar los valores basicos del Makefile para reflejar nuestro programa nuevo. Editalo y cambia el titulo a uno que creas conveniente para el programa nuevo. Llamare al mio Contador. Y cambia también el objetivo. Ahora experimenta un poco y construye un simple programa. Empiezas a tener las habilidades basicas que necesitas para crear sus propios programas (los basados en texto por lo menos).
¡Buena suerte, y diviertete!
Comentarios
Aclarame algo abis, porque
Aclarame algo abis, porque cuando sumas el contador con counter++ pones el ";" y en el for con i++ no lo pones, otra cosa más los loop's van dentro de la int o no?, esque el compilador me marca varios errores con los } y no puedo resolverlo, os pongo mi code:
Como puedes ver he cambiado el code, y esque con tantos errores por los } tuve que modificarlo, bien, el compilador me marca errores en las lineas:
71:2, otro que dice: main.cpp: In function' int main()':, en la 62, al parecer algo de que no defini la funcion de el for y el que me ha marcado en todos mis errores al compilar: make: ***[main.o] Error 1.
Mis conclusiones, en el primer error, pienso ha de ser por los }, pero pues ya modifique totalmente el code y nada, en el segundo, pues ni idea, segun yo la int esta perfecta, en el tercero igual, no se.
Otra duda, como copeo el texto que me da el compilador?, el del error como lo copeo?, para ponertelo bien
EDITO: Volvi a hacer el code como el del tuto:
Y exactamente los mismos errores
EDITO2: Usando el code que te deje arriba(el segundo), el error estaba en el for, en el sceDisplayWaitVblanStart(); lo escribi mal(el start sin mayuscula), gracias por el tuto :D. Aunque el resultado final es 1 y presiono X o Circulo y nada D:, deja lo checo bien.
Veamos...
Cuando se usa variable++, va ; porque así debe terminar cada sentencia en C. En el for no se pone, porque así va su sintaxis:
Sobre el error de tu línea 62, es porque la función está mal escrita, ni más ni menos. Tienes sceDisplayWaitVblankstart(); cuando debería ser sceDisplayWaitVblankStart();
PD. Tu firma incumple... está enorme ¬¬
Si ya está solucionado,
Si ya está solucionado, exctamente era eso, de todos modos gracias y me aclaraste eso :D.
PD: Lo siento, ahora la edito.
Solo una cosa.
Muy buen tuto, pero aquí hay un "problemita".
En la parte del código que dice:
Nos muestra Contador Finalizado.Resultado final: 55 (por decir un número), a lo que voy es que se ve algo mal que este todojunto XD.
Creo que lo ideal sería ponerlo así:
Para dar un salto de línea entre ambos printfs
Salu2
SceneBeta.com
puedes subir el main.c ya
puedes subir el main.c ya hecho? o alguien que si le salio lo puede subir? nadamas no entiendo nada esta... todo hecho bolas el tuto...
arieldev.blogspot.mx
duda
¿Que significa: error. expected identifier or '('before 'while' y como se soluciona?
Gracias por adelantado.
revisa la linea
te esta diciendo que en tu expresion esta mal el parantesis antes de while
revisa la linea y corrige el error
lo tengo
Justamente de la misma forma que lo pone en el tutorial y aun asi me sigue diciendo que esta mal y ahora me salen otro error mas: expected expression before 'int' .
Gracias por adelantado
Dos lineas donde me sale el error:
while (1) {
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CROSS) {
break;
}
}
while (1) {
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CIRCLE) {
break;
}
pspDebugScreenClear ();
printf("Pulsa O para para el contador\n")
printf("Contador: %i", counter);
counter++;
Como se nota que no se nada de lenguaje en C
Configurar mi makefile
Buenas estoy programando una tonteria para ir empezando a programar y nose como añadir la libreria power -lpsppower_2 al makefile, ¿donde se pone?. Simplemente es para cambiar la velocidad del CPU
Os pongo mi Makefile:
TARGET = MiPrograma
OBJS = main.o
INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBDIR =
LDFLAGS =
LIBS =
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Mi Programa de PSP
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
Salu2
genial
Qué puedo decir? Simplemente genial, me ha funcionado muy bien e incluso ya he empezado a idear algunas cosas :) Muchisimas mil gracias (ahora a por el 3 y ultimo paso) pena que ps2dev este caida...
Muerta la rabia, se acabaron los perros.
Podria poner alguien el programa
Sé programar en C y algo de C++, pero me he liado y se queda en "Pulse X para iniciar contador."
No sé en que me habré equivocado, pero no doy con la solucion
Un saludo y gracias por el tutorial, ya llevaba tiempo queriendo hacer algo en psp.
Por cierto, saben donde ver las funciones de las librerias?? gracias.
Edito: Solucionado. Gracias de todas formas
no puedo!!!!
no puedo compilar el programa, me pasa una serie de errores relacionados con las funciones creadas al principio del programa, alguien sabe que puedo hacer??? porfavor una respuesta....
de antemano gracias.
Esta bien el tutorial?
Puede que sea por la hora que es pero e hecho todos los pasos y no me funciona es mas al compilarlo me da un monton de errores, lo e revisado y escrito de nuevo y nada los mismos errores, puede que haya algun fallo en el tutorial??
Lo consegui!!!!!!!!
Fue un fallo tonto...oye alguien sabe cuando se va a publicar el siguiente tutorial...esq tengo bastantes conocimientos de ingles y a kien lo este aciendo le podria ayudar a traducir
Seguramente mañana
Pensava publicar el siguiente capitulo. De todos modos me pondre en contacto contigo via mail.
no es por meter presion!!
No deberia estar ya aki el tutorial??? si necesitas ayuda tu pide y lo siento si te sientes presionado o agoviado
casi ya he termindanado de traducir el 4º tutorial
De todos modos si dices que tu ya lo tienes pues nada, si tienes alguna duda sobre alguna parte no dudes en consultar.Empezare a traducir el nº5.
OK
X mi de acuerdo...te ayudare en lo que kieras y pueda, y muchas gracias po hacer estos tutoriales, gracias a estos estoy empezando a hacer lo que mas me gusta
módulos y programas de PSP
¿De donde se pueden sacar los módulos de la PSP? de la memoria flash? es para saber que hacen las funciones y los procedimientos que usas ahà y ver los otros "más complicados". Gracias ;)
Hay un PDF de documentación
Se que PSPDEV publico hace relativamente poco un PDF con la documentacion intrna y las unciones que comentas. A ver si lo encuentro y os lo publico por aqui. el titulo era algo asi como"another PSP manual" o algo asi.