image Pues poco más que decir; descarga el siguiente ejemplo, descomprímelo en C:\s2dsdk\example\, ejecuta el fichero vs.bat creado anteriormente en la instalación de las SDK y desde Visual Studio 2008 abre la solución que acompaña a este ejemplo.

Compílala y ejecuta el ejemplo (no hace falta que lo hagas en la Dingoo lo puedes evaluar en el IDE).

Puntos de interés:

Voy a intentar explicar en detalle el ejemplo ya que puede ser un poco enredado si es la primera vez que te enfrentas a uno como este.

Hello world pixel [330.3 KB] – zip

Lo primero es entender que este primer ejemplo utiliza un puntero a la VRAM para realizar la escritura en pantalla. De tal forma que escribimos punto a punto todo lo que en ella deseemos pintar. Podemos entenderla como una simple matriz, cada una de las coordenadas de la matriz corresponde a un punto de la pantalla, es decir, un píxel.

A la hora de pintar sobre una pantalla lo primero es inicializarla:

/// init all resources
result    GameEngine::Init( void )
{
    InitDLRes();
    // 16 FPS
    SetFPS( 24 );

    return S2D_OK;
}

Al inicializarla se inicializa de un cierto modo. Por defecto en nuestro ejemplo el modo de pantalla es el RGB565, es decir, cada elemento de la matriz es un RGB565, que es un elemento de dos bytes. (RGB565 un total de 16 bits, de 2 bytes cada uno)

Por lo tanto, escribir un punto en la pantalla en esencia es escribir dos bytes en la matriz de bytes.

Para obtener el puntero a la VRAM (el área de dibujo) hemos de invocar al método GetVRAMPtr() del objeto m_pDraw2D de la s2d, para ello valdrá con algo tan simple como:

Pixel* ptr = m_pDraw2D->GetVRAMPtr();

Con esta breve explicación ya has comprender cómo obtener la primera dirección del puntero de la matriz, pero nos tenemos que hacer las siguientes dos preguntas:

Si quiero utilizar (x, y) como las coordenadas de un punto, ¿cómo puedo acceder a la matriz para facilitar el acceso a cada punto?.

offset = (x * ancho) + y

s32 ofs = (x*A320_SCREEN_WIDTH) + y;

Nota: Este desplazamiento es de 2 bytes.

Si quiero una pantalla de color pintada mediante valores RGB, ¿Como se convierte el valor RGB en un dato de 2-byte?

En primer lugar hay que entender que significa RGB; rgb corresponde con la forma más natural de crear un punto formado por tres colores (rojo, verde y azul).

Para definir un pixel y su valor rgb puede utilizar cualquiera de las siguientes expresiones del SDK s2d asociado a un tipo Pixel:

/ / Pix1 por un punto rojo
Pixel pix1 (255, 0, 0);

/ / Pix2 por un punto verde
Pixel pix2;
pix2.r (0);
pix2.g (255);
pix2.b (0);

/ / Pix3 por un punto azul
Pixel pix3;
pix3.rgb (0, 0, 255);

Vale, la teoría esta pasable, pero ¿como implementamos esto en c++?;

/// render
void    GameEngine::Render( void )
{
    //Pixel by pixel
    int r = 0;
    int g = 0;
    int b = 0;
    for(int i = 0; i < A320_SCREEN_HEIGHT;i++)
    {
        for (int j=0; j < A320_SCREEN_WIDTH; j++)
        {
            r+=1;
            PutPixel(i,j,r,g,b);
        }
        int r = 0;
        int g = 0;
        int b = 0;
    }
}

…………………………
void GameEngine::PutPixel(int x, int y, u8 r,u8 g, u8 b )
{
    Pixel* ptr = m_pDraw2D->GetVRAMPtr();
    Pixel color1(r,g,b);
    s32 ofs = (x*A320_SCREEN_WIDTH) + (y);

    ptr[ofs] = color1;
}

17 Comments

  1. Hi I don’t speak Spanish, sorry for that 🙁 Very nice articles on the a320!

     s32 ofs = (x*A320_SCREEN_WIDTH) + (y);   

    shouldn’t this be the following?

    s32 ofs = (y*A320_SCREEN_WIDTH) + (x);   

    1. Si:
      ///LINEAS
      color.rgb( 255,255,255 );
      m_pDraw2D->FillRect( rect,color, OBM_NONE );

      /// CIRCUNFERENCIAS
      p.x = 100;
      p.y = 100;
      color.rgb( 255,0,0 );
      m_pDraw2D->FillCircle( p, 50, color,OBM_SRC75 );

      /// TRIANGULOS
      Point tp[3];
      tp[0].x = 50;
      tp[0].y = 50;
      tp[1].x = 100;
      tp[1].y = 70;
      tp[2].x = 0;
      tp[2].y = 90;

      color.rgb( 255,255,0 );
      m_pDraw2D->FillTriangle( (Point*)tp, color,OBM_SRC25 );
      rect.left = 20;
      rect.right = 300;
      rect.top = 100;
      rect.bottom = 150;

      /// CADENAS DE TEXTO
      color.rgb( 0x0,0xff,0xff );
      m_StrMgr.DrawString( 2, color, 0, rect );

      /// CADENAS DE TEXTO
      VisString vistr( _LS(«110»));
      p.x = 300;
      p.y = 200;
      color.rgb(0xff,0x0,0x0 );
      m_StrMgr.DrawString( &vistr, color,ANCHOR_RIGHT|ANCHOR_TOP,p);

  2. Hola,
    yo aún estoy intentando conseguir algo que funcione en mi dingoo… uso linux y la parte de la compilación parece que la tengo (no da errores y me genera el elf, el bin y los archivos que se supone utiliza dlmake), pero al ejecutar dlmake (con wine) no me genera ningún .app. ¿puedes poner un ejemplo de salida por pantalla correcta de dlmake? así podría saber más o menos por donde tirar. La salida que me da a mi no es legible, está llena de caracteres extraños.
    Muchas Gracias.

  3. Hola,
    El programa de ejemplo ‘Hola Mundo’ aqui descrito lo compilo y ejecuto sin problemas pero solo cuando la solución está en modo ‘debug’. Cuando cambio a modo ‘release’ y vuelvo a regenerar la solución me indica estos dos errores:
    1>Loader.cpp
    1>..\source\src\Loader.cpp(172) : fatal error C1010: final de archivo inesperado al buscar la directiva de encabezado precompilado. Compruebe si olvidó agregar ‘#include «stdafx.h»‘ al código fuente?
    1>GameEngine.cpp
    1>..\source\src\GameEngine.cpp(242) : fatal error C1010: final de archivo inesperado al buscar la directiva de encabezado precompilado. Compruebe si olvidó agregar ‘#include «stdafx.h»‘ al código fuente?
    Alguien sabe como solucionar esto,…
    Gracias y un saludo,…

  4. Jorge, por lo que me dices, he entrado en el subdirectorio ‘ccpmp’ dentro de ‘helloworldpixel’ y he ejecutado el archivo ‘rls.bat’ que entiendo se refiere a ‘release’. Efectivamente tras una serie de mensajes que acaban con «make:  *** [interface.o] Error 1» , etc. he comprobado que el archivo ‘target.app’ se crea, luego entiendo que sí se ha realizado la ‘release’ correctamente.
    ¡Aún no he podido probarlo en la Dingoo A320, hasta mañana viernes no la tengo,…!
    Gracias, un saludo…

  5. Para que compile correctamente has de haber configurado correctamente el SDK

    ————–
    @echo off
    SET MIPSLIB=c:/cygwin/mipseltools/lib
    SET MIPSTOOLS=c:/cygwin/mipseltools/include
    SET S2DINC=c:/s2dsdk/inc
    SET S2DLIB=c:/s2dsdk/lib

    PATH=c:\cygwin\mipseltools\bin;c:\cygwin\bin;C:\WINDOWS\SYSTEM32;
    cmd
    @echo on

    ————–

    posteriormente ejecutal el fichero build.bat

  6. Can you expand on the use of StringManager. You seem to be the only person I found who knows how to use it properly. I able to compile some code, but it appears «m_pImgS2d->m_pPalette» to point to NULL when I debug the crash. Can you produce a main.cpp or MSVS C++  2008 project file or a full scale example. I’d really appreciate it. I’m trying to create a few tutorials with S2D to spur on more Native Coders. Thanks.
    I’m sorry I can’t speak/write in Spanish, so I’ll use Google’s Translator to help. It is the best I got.

    ¿Se puede ampliar el uso de StringManager. Usted parece ser la única persona que he encontrado que sabe cómo usarlo correctamente. Soy capaz de elaborar un código, pero parece «m_pImgS2d-> m_pPalette» para que apunte a NULL cuando puedo depurar el accidente. ¿Se puede producir un main.cpp msvs o C + + 2008 archivo de proyecto o un ejemplo a gran escala. Realmente me aprecian. Estoy tratando de crear algunos tutoriales con S2D para estimular codificadores más nativos. Gracias.
    Lo siento, no puedo hablar / escribir en español, así que usé Traductor de Google para ayudarle. Es el mejor que tengo.

  7. Buenas, despues de varios intentos ya he podido compilar el ejemplo. Lo que ocurre es que lo genero perfectamente en VS2008 y tambien para la dingoo, peroo la dingoo no lo ejecuta!! Que ficheros se deben poner en la dingoo ? He puesto el target.app, GameEngine.o y interface.o y sigue sin entrar en la aplicación. Grácias

  8. Lo se, pero Dingoo no lo abre, igual falta algun fichero que debe estar o la compilación no funciona… Por favor si puedo te envio el que compile y lo pruebas en tu Dingoo a ver. Grácias.

  9. Afinal no es problema de mi compilación, lo que ocurre es que daba error al compilar para Dingoo, y como siempre genera el target.app te engaña. Si te fijas el que tienes en tu zip tampoco funciona, por el tamaño se nota que no tiene nada. Si lo puedes compilar correctamente para Dingoo te agradecia que lo comentarás y pusieras la solución. Grácias

  10. Pero tu ejemplo incluido en el hola mundo tambien viene vacio, has probado tu target.app en la dingoo ? Tampoco lo tienes bien compilado. He compilado un juego con el mismo SDK y si que ha compilado sin errores y me ha funcionado … Por favor sólo te pido que lo compruebes.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *