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