[psp] como poner imagen de fondo a un homebrew???

Hola a todos, os cuento lo que pasa:

quiero ponerle una imagen de fondo a mi helloworld particular

he estado leyendo por ahi que tiene que estar en convertida a codigo c

la cosa es... como convierto la imagen a codigo???? luego como la represento????

si eso decirme las funciones y yo ya me busco la vida xD


salu2 y gracias


EDITO:

he conseguido en parte lo que queria

he pasado la imagen a codigo c con un programilla de otro hilo

luego en pspain he encontrado una libreria con funciones primitivas (segun ellos) para representar imagenes en codigo c

he conseguido utilizar la funcion y representar la imagen pero...

1º la imagen sale como en negativo

2º sale repetida


a ver si alguien me hecha una manilla en esto


me voy a dormir que mañana hay carrera de f1 tempranillo xD
por cierto, si es para algo importante no te aconsejo el uso de imágenes c, ya que si no me equivoco ( y son de las que pienso ) hacen que el ejecutable ocupe más, te aconsejo cargarlas en tiempo de ejecución el formato bmp es muy bueno para eso.


un saludo

pd: comprarme argo en mi tienda payo.
cmo se cargan en tiempo de ejecucion????

salu2
Lo que estaría bien es que dejaran codigo, así se aprende más rápido XD
Darkangelus escribió:Lo que estaría bien es que dejaran codigo, así se aprende más rápido XD



pues si [toctoc]


alguien tiene codigo de esto??? yo aun no he sacado nada en claro [+furioso] xD


salu2
A mi tambien me interesa, he llegado a poner una imagen con graphics.h en un programita que me estoy haciendo pero claro si pongo la imagen me desaparece el texto del programa que pongo utilizando pspdebug.h

Alguien sabe algo por farvor ¿?
hace tiempo que no programo a ese nivel, pero asegurate cargar la imágen antes del texto, aun así creo que no funcionaría ya que si no me equivoco se pone una capa por encima las imágenes...
kYp escribió:A mi tambien me interesa, he llegado a poner una imagen con graphics.h en un programita que me estoy haciendo pero claro si pongo la imagen me desaparece el texto del programa que pongo utilizando pspdebug.h

Alguien sabe algo por farvor ¿?


No tiene porque desaparecer. Supongo que estarás borrando pantalla, o quizás intercambiando buffers en un orden equivocado.

Por ejemplo, usando graphics.h, el siguiente codigo carga un png como fondo, y justo encima, pinta el texto que se quiera:
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspgu.h>
#include <png.h>
#include <stdio.h>
#include "graphics.h"


PSP_MODULE_INFO("Ejemplo", 0, 1, 1);


int fin = 0;


int exit_callback(int arg1, int arg2, void *common) {
          fin = 1;
          return 0;
}

int CallbackThread(SceSize args, void *argp) {
          int cbid;

          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);

          sceKernelSleepThreadCB();

          return 0;
}

int SetupCallbacks(void) {
          int thid = 0;

          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }

          return thid;
}

int main()
{
   Image* fondo = NULL;

   pspDebugScreenInit();
   SetupCallbacks();
   initGraphics();

   if((fondo = loadImage("./fondo.png")) == NULL) sceKernelExitGame();


   // Mientras no se pulse el boton Home:
   while(!fin){
      // Se pinta la imagen de fondo cargada antes.
      blitImageToScreen(0, 0, 480, 272, fondo, 0, 0);

      printTextScreen(30, 30, "Este texto aparece sobre el fondo", (u32)0xff000000);

      // Se intercambian los buffers.
      flipScreen();
      // Se espera al retrazo vertical.
      sceDisplayWaitVblankStart();
   }

   sceKernelExitGame();
   return 0;
}
Gusvo me referia que si uso la graphics no puedo usar la pspdebug para imprimir texto


puedes explicar flipScreen(); ¿? esque me esta dando problemas de que me aparecezca el texto al pulsar alguna opcion del menu que hice ya que alomejor selecciono la Opcion1 y no sale el texto q tendria que salir y en el menu se me selecciona la de antes y me sala el texto que tendria que salir cada dos pulsaciones en la cruzeta para moverme por el menu . Ya que para que aparezca el texto necesito poner flipScreen(); no ¿?

y no doy borrado la pantalla por que no doy usado: clearScreen(Color color); no se en que se pone el valor ya que en u32 no tira
kYp escribió:Gusvo me referia que si uso la graphics no puedo usar la pspdebug para imprimir texto

Es que es el problema de usar las funciones de pspDebugScreen***. Seguro que hay gente por EOL que te lo podría explicar mil veces mejor e incluso corregirme si me equivoco, pero creo que el problema viene de que, cuando se inicializa la pantalla mediante pspDebugScreenInit, la propia librería toma un valor por defecto de comienzo de la memoria de video, así como de tamaño de buffers, y como graphics.h también hace su inicialización por defecto, si toman distintos valores, saldran cosas raras por pantalla, de ahí que la propia graphics.h dea susu propias funciones para imprimir por pantalla. Yo no uso graphics.h demasiado, suelo hacer librerías propias, aunque basicamente son parecidas a esta, y en todas he tenido que usar mis propias funciones para imprimir texto.
kYp escribió:puedes explicar flipScreen(); ¿? esque me esta dando problemas de que me aparecezca el texto al pulsar alguna opcion del menu que hice ya que alomejor selecciono la Opcion1 y no sale el texto q tendria que salir y en el menu se me selecciona la de antes y me sala el texto que tendria que salir cada dos pulsaciones en la cruzeta para moverme por el menu . Ya que para que aparezca el texto necesito poner flipScreen(); no ¿?

Pues sí, tienes que ponerlo si quieres doble buffer, casi seguro ese es el fallo. Basicamente, flipScreen intercambia dos buffers, el de pintado y el que se muestra. Cuando quieres pintar algo en pantalla, se hace en el buffer de pintado. Para mostrarlo, se intercambia el de pintado con el que se muestra, y así sucesivamente. Aún así, si te hace eso, más que por no usarlo, parece más bien que lo usas en un mal lugar del codigo, es algo así como que intercambias el buffer 2 veces seguidas, aunque sin ver el codigo es dificil saberlo.
kYp escribió:y no doy borrado la pantalla por que no doy usado: clearScreen(Color color); no se en que se pone el valor ya que en u32 no tira

Pues debería tirar, pues como pone en graphics.h Color es una redefinición del tipo u32.

Aún así, hay una cosa, y es que no se si yo tengo un graphics.c defectuoso y el resto lo tiene bien o es que el código tiene este bug en todos los lados, porque si miras la función clearScreen en graphics.c es:
void clearScreen(Color color)
{
   if (!initialized) return;
   guStart();
   sceGuClearDepth(0);
   sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT);
   sceGuFinish();
   sceGuSync(0, 0);
}

Como se ve, nunca usa el color que se le pasa. Si el código de graphics.c es así, debes corregirlo para poder borrar con el color que le pasas. La función quedaría así:
void clearScreen(Color color)
{
   if (!initialized) return;
   guStart();
        // Indicamos el color con el que queremos borrar:
   sceGuClearColor(color);
   sceGuClearDepth(0);
   sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT);
   sceGuFinish();
   sceGuSync(0, 0);
}

Así, si por ejemplo, en el código que puse antes, quieres borrar el fondo antes de pintar algo, el bucle quedaría:
while(!fin){
   // Borrado del fondo en color blanco:
   clearScreen(0xffffffff);

   // Se pinta la imagen de fondo cargada antes.
   blitImageToScreen(0, 0, 480, 272, fondo, 0, 0);

   printTextScreen(30, 30, "Este texto aparece sobre el fondo", (u32)0xff000000);

   // Se intercambian los bufferes.
   flipScreen();
   // Se espera al retrazo vertical.
   sceDisplayWaitVblankStart();
}


Saludos y siento el rollazo que he soltado ;)
Gusvo Gracias por lo de clearScreen();

Pero sobre flipScreen si lo que hace es intercambiar el buffer de texto y imagen para que se vean las dos cosas al mismo tiempo texto e imagen ( eso es lo que entendi ) , por que cada vez que escribo algo tengo que pasarle flipScreen(); para que se muestre en pantalla ¿?

Si quieres ver el codigo te mando un enlace por mp con el codigo ( no es extenso , es sencillito )
kYp escribió:Pero sobre flipScreen si lo que hace es intercambiar el buffer de texto y imagen para que se vean las dos cosas al mismo tiempo texto e imagen ( eso es lo que entendi ) , por que cada vez que escribo algo tengo que pasarle flipScreen(); para que se muestre en pantalla ¿?

No hace eso exactamente, no me expliqué bien.

Para empezar, aquello que se muestra en pantalla es el contenido de una porción de memoria. Cuando tu "pintas" algo (texto, imagen o cualquier otra cosa) lo que haces es copiar el contenido de la imagen, de las fuentes que forman el texto, etc, en esa memoria. Tu estás usando graphics.h, que de por sí usa doble buffer. Esto quiere decir que no sólo hay una región de memoria para la pantalla, sino que son 2.

Explicándolo chapucerillamente :), una de las porciones está oculta, y es donde se pinta lo que vas a enseñar. La otra es aquello que ya estaba pintado de antes y que se está mostrando en ese momento en la pantalla. Cuando "pintas" algo, como por ejemplo la imagen, estás copiando el contenido de la imagen sobre la porcíon de memoria que en ese momento está oculta. Cuando terminas de "pintar" la imagen, usas flipScreen para cambiar la porción de memoria que se enseña. Es decir, ahora lo que aparece en pantalla sería la imagen, y la porción de memoria donde ahora toca pintar es la que antes estabas viendo en la pantalla.

Como decía, estoy seguro de que hay gente por aquí que te lo puede explicar un millón de veces mejor, pero viene siendo algo así.

Sobre el código, pues si ves que no te sale envíalo, no hay problema en echarle un ojo, pero si lo das arreglado tú, mejor que mejor.

Saludos.
11 respuestas