Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





SDL y putpixel

Iniciado por Altair, 15 de Abril de 2011, 08:22:22 AM

« anterior - próximo »

Altair

Muy buenas,

ando trasteando con el ejemplo de putpixel que trae la documentacion de SDL. Por lo que se, es recomendable bloquear la SDL_Surface con SDL_LockSurface antes de proceder con el pintado del pixel en si mismo y despues desbloquear con SDL_UnlockSurface.

La pregunta es: ¿esta funcion es arriesgada en algun sentido?. Porque estoy haciendo pruebas con el ejemplo, y a veces salta por los aires. Me sale hasta backtrace (o como se escriba) y todo.

fjfnaranjo

No es peligrosa. Sólo tienes que acordarte de bloquear antes de escribir directamente a la Surface y de desbloquear después.

Si aun así no te funciona pega un trozo del código para echarte una mano.
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)

Altair

Posiblemente el problema de intentar reproducir un error que no tienes npi (ni puñetera idea, mal pensados :P) del porque se produce es.... sacarle "la foto".

funcion de llamada:
Citar
unsigned char
ngl_put_pixel(ngl_entity *entity_id, unsigned int x, unsigned int y, unsigned char r, unsigned char g, unsigned char b)
{
   Uint32 color;

   color=SDL_MapRGB(ngl_screen.graph->format, r, g, b);
   putpixel(entity_id->graph, x, y, color);

   return 0;
}

funcion en si misma:
Citar
void
putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
   int bpp = surface->format->BytesPerPixel;
   int tmp;

   Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
   
   tmp=SDL_LockSurface(surface);
   if (tmp<0) {
      //return 1; // Error, entidad no bloqueada
      printf("\nngl error - putpixel - entidad no bloqueada");
   }

   switch (bpp) {
      case 1:
         *p = pixel;
      break;

      case 2:
         *(Uint16 *)p = pixel;
      break;

      case 3:
         if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
            p[0] = (pixel >> 16) & 0xff;
            p[1] = (pixel >> 8) & 0xff;
            p[2] = pixel & 0xff;
         } else {
            p[0] = pixel & 0xff;
            p[1] = (pixel >> 8) & 0xff;
            p[2] = (pixel >> 16) & 0xff;
              }
      break;
      case 4:
         *(Uint32 *)p = pixel;
      break;
   }

   SDL_UnlockSurface(surface);
}

Explicaciones:

- ngl_entity es un objeto. Dentro de el esta "graph" que es una SDL_Surface (la imagen en si misma)
- putpixel es una funcion que tiene la propia documentacion de SDL, no se bien porque se ha hecho asi pero siendo la oficial de SDL, la pongo tal cual. Mi unico cambio ha sido el bloqueo y desbloqueo de la SDL_Surface, ya que la info de SDL recomienda usarlo.

El codigo completo es:

Citar
#include "Nautilus.h"

int
main(int argc, char* args[] )
{
   unsigned char Salir;
   unsigned char Tecla;
   unsigned char tmp;

   ngl_create_screen(m320x240);
   ngl_screen.set_main_text("Nautilus Game Library - Tut 8 - Pathfinding", "");
   
   ngl_entity tapiz;
   tapiz.load("tapiz.png");
   tapiz.x=320/2;
   tapiz.y=240/2;
   ngl_paint(&tapiz);
   ngl_rand_seed();
   ngl_frame();

   Salir=0;
   while (Salir==0) {
      Tecla=0;
      Tecla=ngl_key(_q);
      if (Tecla>0) {
         Salir=1;
      }
      
      Tecla=0;
      Tecla=ngl_key(_a);
      if (Tecla>0) {
         ngl_put_pixel(&tapiz, ngl_rand(0,320), ngl_rand(0,240), ngl_rand(0,255), ngl_rand(0,255), ngl_rand(0,255));
         ngl_paint(&tapiz);
         ngl_frame();
      }

   }
   tapiz.unload();

   ngl_quit();
   printf("\n");

   return 0;


Creo que el codigo es intuitivo. Se crea una ventana de 320x240, se crea y carga la entidad tapiz. Creamos un valor semilla para rand. Cuando pulsamos la tecla "A" se pinta un pixel de color aleatorio en unas coordenadas aleatorias del tapiz. A veces falla, no caigo en porque, posiblemente sea algun fallo tonto que no veo aun.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.