PDA

Ver la versión completa : Problema con un código



Miki-chan
28/12/2003, 20:27
Bueno, cuando he sacado algo de tiempo y he reunido humor suficiente, he probado a añadir a un programa que ya tenía hecho (pintaba la pantalla de un color según la tecla direccional pulsada), un trozo de código que me puso agustig sobre el FLIP de la pantalla (para evitar parpadeos). El caso es que lo estuve probando, le hice cambios, pero sigo igual: Me da error en el Geepee32 y me lo cierra. A ver si encontráis el fallo:

#include<gpdef.h>
#include<gpstdio.h>
#include<gpstdlib.h>
#include<gpgraphic.h>

void GpMain( void * arg) //siempre lleva lo del parentesis, sin ello NO compila
{
/* Aqui definimos dos buffers de pantalla, y un indice. */
GPDRAWSURFACE gpDraw[2];
int nbuffer,i;
int tecla, tecla_cam; //Almacena el valor de la tecla pulsada
unsigned char color=1;
unsigned int ticks;

/* Inicializamos los dos buffers */

nbuffer= 0;
for(i=0; i < 2; i++)
{
gpDraw[i].buf_w = GPC_LCD_WIDTH;
gpDraw[i].buf_h = GPC_LCD_HEIGHT;
gpDraw[i].ox = gpDraw[i].oy = 0;
GpLcdSurfaceGet(&gpDraw[i],i);
GpRectFill(NULL, &gpDraw[i], gpDraw[i].ox, gpDraw[i].oy, gpDraw[i].buf_w, gpDraw[i].buf_h, 0x0); /* Ponemos los dos buffers a negro */
}

GpSurfaceSet(&gpDraw[nbuffer]); /* Con esta funcion muestras el buffer que quieres */
GpLcdEnable();

//GpLcdSurfaceGet(&gpDraw,0); //Toma el estado de la pantalla LCD, en este caso, el tamaño

//GpSurfaceSet(&gpDraw); //Establece gpDraw como la superficie sobre la que podremos dibujar o colocar objetos
//GpLcdEnable(); //Activa la pantalla LCD ¿Es realmente necesario?

GpRectFill(NULL,&gpDraw[nbuffer],0,0,gpDraw[nbuffer].buf_w,gpDraw[nbuffer].buf_h,0x00); //Pinta la superficie gpDraw de negro

while(1) //Bucle infinito que mantiene el programa siempre en ejecución
{
GpKeyInit(); //Inicializa las teclas
tecla=GpKeyGet(); //Asigna a tecla el valor de la tecla pulsada
tecla_cam=GpKeyChanged(); //Indica cuál es la nueva tecla pulsada
tecla=tecla_cam; //Asigna a telca el valor de la tecla cambiada
nbuffer++;
nbuffer%2;

if(tecla & GPC_VK_UP) //Si la tecla es el stick arriba...
{
GpRectFill(NULL,&gpDraw[nbuffer],0,0,gpDraw[nbuffer].buf_w,gpDraw[nbuffer].buf_h,0xe0);
//Pinta la pantalla de rojo
}

if(tecla & GPC_VK_DOWN)//Si la tecla es el stick abajo...
{
GpRectFill(NULL,&gpDraw[nbuffer],0,0,gpDraw[nbuffer].buf_w,gpDraw[nbuffer].buf_h,0xA1);
//Pinta la pantalla de Rosado
}

if(tecla & GPC_VK_LEFT) //Si la tecla es el stick izquierda...
{
GpRectFill(NULL,&gpDraw[nbuffer],0,0,gpDraw[nbuffer].buf_w,gpDraw[nbuffer].buf_h,0x11);
//Pinta la pantalla de Azul
}

if(tecla & GPC_VK_RIGHT) //Si la tecla es el stick derecha...
{
GpRectFill(NULL,&gpDraw[nbuffer],0,0,gpDraw[nbuffer].buf_w,gpDraw[nbuffer].buf_h,0x05);
//Pinta la pantalla de Verde
}

else //Si no...
{
GpRectFill(NULL,&gpDraw[nbuffer],0,0,gpDraw[nbuffer].buf_w,gpDraw[nbuffer].buf_h,0x00);
//Pinta la pantalla de negro
}
GpSurfaceSet(&gpDraw[nbuffer]);
ticks = GpTickCountGet();
while ((GpTickCountGet() - ticks) < 10)
if (GpTickCountGet() < ticks) ticks = GpTickCountGet();

//Es muy importante tener en cuenta que la tecla se considera pulsada hasta que la soltamos.
}
}

mortimor
28/12/2003, 22:25
Perdona chica, pero eso esta muy mal en general. Yo te recomendaria que mirases los ejemplos del SDK en los que viene muy clarito cuando se hace cada cosa.

Por otro lado te dire que el ELSE ese que pones al final del bucle principal lo que hace es que si no tienes pulsado el mando hacia la derecha pinta la pantalla de negro.

Creo que deberias ir mas poco a poco. Mira bien los ejemplos, copia, pega y modificalos para hacer lo que quieres.

Se original, utiliza estados a la hora de pintar la pantalla, si el estado es rojo se pinta de rojo y si es verde se pinta de verde; asi cambias de estado/color cuando se pulsa una tecla. En un sitio determinas el estado y en otro pintas en funcion del mismo.

No pintes en las superficies nada mas crearlas, cada cosa a su tiempo. En el bucle principal ya se pintara en la superficie que se vaya a usar (segun el intercambio de buffer).

mortimor
28/12/2003, 22:27
Solo intento aconsejar, lo siento si parezco un poco ... no sabria como decirlo.

Wave
28/12/2003, 22:37
Yo tb haria otra cosa, quitar el GpKeyInit(); del bulce while y ponerlo antes.

Miki-chan
28/12/2003, 23:42
Cierto, el Else del final está mal puesto, supongo que estaría mejor utilizando if-else encadenados. Lo del GPKeyInit(); también lo cambiaré de sitio (me lié con el ejemplo que vi).

En cuanto a lo del SDK... Los pocos ejemplos que he mirado me han dejado casi igual que estaba, no me solucionan casi nada.

Lo de los estados, no entiendo cómo se supone que se definen y se usan (de programación de juegos no tengo ni idea).

En fin, me temo que soy demasiado impaciente, que el ir totalmente de autodidacta no es lo mío y que haría falta un manual de esos "para tontos" de programación para la GP32.

timofonic
28/12/2003, 23:47
El problema es que programar no es "para tontos" ;)

Una cosa es codigo bien documentado y demas... Pues sí.

No impacientes, ve mirando ejemplos y resuelve tus dudas preguntando, asi es como se aprende realmente...

Miki-chan
29/12/2003, 00:01
No será "para tontos", pero bien explicado, se entienden bien las cosas (llevo tres años aprendiendo a programar en C y el profesor de este año explica "para tontos" y no veas cómo se nota la diferencia).

En fin, me temo que tengo demasiado poco tiempo y que al paso que voy, tardaré cinco años en hacer algún juego medio decente.

Resumiendo, que se me acaban de quitar las ganas de seguir con el tema después de haber estado dos semanas para poner una mierda de imagen en la pantalla y viendo que soy una nulidad sólo para pintar la pantalla "de colorines".

(_=*ZaXeR*=_)
30/12/2003, 02:45
La verdad es que los ejemplos del SDK de mucho no sirven pero te dan una pequeña idea, realmente lo que tienes que hacer es buscarte otros ejemplos con codigos de juegos.
Yo estoy atascado con poner los frames de distintos sprites en el buffer para que luego se dibujen todos a la vez en la pantalla, y tambien con las animaciones (basicamente este era el motivo por el que queria usar GDL por las animaciones) aunque esto es mas sencillo de solucionar echando mano del manual del SDK, por eso no me preocupo, pero de lo de poner todos los sprites en buffer para luego dibujarlos a la vez evitando relentizaciones, pues no soy capaz, lo que consigo es que me salga la pantalla en blanco

agustig
30/12/2003, 15:09
La idea es buena, y puedes aprender mucho más de lo que piensas con este ejemplo.

Una buena cosa seria partir el programa... ya sabes es más fácil solucionar pequeños problemas que uno muy grande.

Yo lo que haria seria montar una estructura en plan:

(lo escribo del tiron, esto no compilará pero a lo mejor te da alguna idea mejor)
-----8<-----------------------------------------
void GpMain ( void *arg)
{
GPDRAWSURFACE gpDraw[2];
int nbuffer = 0;
int tecla = 0;
int color;

inicializa_buffers( *gpDraw );
inicializa_teclas();

while(1)
{
tecla = leer_tecla(tecla); //Se la paso para que sepa que se a pulsado anteriormente.
color = determina_color(tecla);
nbuffer = pintar_pantalla(color, *gpDraw, nbuffer);
}
}
-----8<-----------------------------------------

En pintar_pantalla, harias todo el tema de cambiar el buffer, pintar el cuadro, mostrarlo por pantalla intercambiar el indice y esperar. De todas formas, en lugar de esperar N_ticks, es mejor esperar al sincronismo... ( en el thread sale como hacerlo ;) )

Bueno el resto de funciones, cortas y pegas de tu propio codigo, y si tienes alguna duda con alguna en particular (o con todas!!) . Ya diras, y me extiendo...

No desesperes.... Y pensa que lo facil siempre es criticar, crear es lo dificil....

Miki-chan
01/01/2004, 15:28
Bueno, agustig, haré caso del tema de dividir el programa en funciones (así de paso las puedo reutilizar en otros programas con pocos o ningún cambio). Y miraré lo del sincronismo.

El problema que tengo es que tengo poco tiempo para dedicarle (las horas de uso del PC las tengo limitadas y casi siempre es para programar cosas para clase o hacer trabajos :() y eso me agobia mucho porque tengo muchas ganas de hacer cosas y no me veo capaz por ahora.

También me tengo que mirar algunas webs que hablan sobre el desarrollo de juegos en general, a ver si puedo sacar alguna idea y lo del SDK, me seguiré pegando con ello a ratos (menos mal que ya van saliendo cosillas como el KOF para hacer juegos).

(_=*ZaXeR*=_), ¿porqué dejaste lo del GDL?