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.
}
}
#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.
}
}