PDA

Ver la versión completa : Efecto especial en SDL (bpp)!



newage
16/09/2005, 03:33
Bueno ya he avanzado algo en esto de las SDL.. blitting, alpha blending, etc..

Pero ahora quiero programar algunas funciones para hacer efectos especiales como por ejemplo, hacer que la lineas pares vayan desplazandose hacia la izquierda, metiendole uun pixel a la izquierda con alpha 255 cada vez mas a la derecha desde el lado izquierdo y eso mismo pero en dirección contraria para los pixeles de lineas impares.

Mmm tengo entendido que no es lo mismo pintar un pixel en 16 bits que en 24.
¿Cual es la profundidad de color con la que se trabaja en la GP32/GP2X?.
En caso de duda respondanme la de la GP32. :D

Supongo que tengo que cargar un bmp (no uso png) y luego transformarlo en RGBA ¿no?
¿Y luego como puedo hacer los calculos para ir cambiando los pixeles? segun la profunidad de color que me indiques (bpp).


Gracias comandantes :D

D_Skywalk
16/09/2005, 09:32
Para acceder a los pixels de una Surface en 8bits (GP32) lo unico que tienes que hacer es bloquearla (lock) y desde la variable pixels accedes a ellos.

Lo que dices de como pintar segun el modo se llama pitch, que es el avance que necesita para acceder al siguente pixel, pero no te compliques con eso, en 8 bits te vale esto sin problema:



void * pt;

pt = MiSurface->pixels;

pt++ = 255;


Una vez hayas terminado de pintar, devuelve la surface al sistema desbloqueandola.

Un Saludo :)

newage
16/09/2005, 09:51
Muchas gracias :)

Eskema
16/09/2005, 19:34
¿Podrias poner un ejemplillo de como haces el alpha-blending?, pq me gustaria hacer a los personajes invisibles y no se muy bien como aplicar el alpha de forma progresiva

newage
16/09/2005, 21:45
¿Podrias poner un ejemplillo de como haces el alpha-blending?, pq me gustaria hacer a los personajes invisibles y no se muy bien como aplicar el alpha de forma progresiva
/************************************************** *********************************/
/* HIGO - Hardcore Inmortal Gamers Opera */
/* Resolucionn de GP2X ( 320 x 240 ) */
/************************************************** *********************************/
/* No se puede utilizar sfont con la lista de superficies por el parametro alpha */
/************************************************** *********************************/

#define TITLE_SHORT "HIGO"
#include "imagen.h"

int main( int argc, char *argv[] ){

gestorImagen gImg;
SDL_Event event;

#ifdef PC
SDL_WM_SetCaption( TITLE_SHORT, NULL );
#endif

gImg.loadImgBlit( "logo.png", 255, 0, 255 );
SFont_Font* Font = SFont_InitFont(IMG_Load("font1.png"));


bool salida = false;
int alpha = 0;
enum estado{ bajando, subiendo}; estado x = subiendo;

while( salida == false ){

gImg.getTimeCheckFps();
gImg.setAlpha( ID_SCREEN+1, alpha );
SDL_SetAlpha( Font->Surface, SDL_SRCALPHA, alpha );

if( alpha <= 1 ) x = subiendo;
else if ( alpha >= 254 ) x = bajando;

if ( x == bajando ) alpha = alpha - 2;
else alpha = alpha + 2;

gImg.clear( gImg.getPointer(ID_SCREEN), 255, 255, 255 );
SFont_WriteCenter(gImg.getPointer(ID_SCREEN), Font, 180,"Welcome tux! :)");
gImg.dibujarImagen( gImg.getPointer(ID_SCREEN+1), gImg.getPointer(ID_SCREEN),
(( RES_X - gImg.getPointer(ID_SCREEN+1)->w )/2 ),
(( RES_Y - gImg.getPointer(ID_SCREEN+1)->h )/2 ));
SDL_Flip( gImg.getPointer(ID_SCREEN) );

while ( SDL_PollEvent(&event) ) {
switch ( event.type ) {
#ifdef PC
case SDL_KEYDOWN:
break;
case SDL_QUIT:
salida = true;
break;
#else
#endif
}
}
gImg.checkFps();
}

SFont_FreeFont(Font);
return 0;

} Ten en cuenta que tengo una clase que relaciona a las superficies con una lista, como un array dinámico.
void gestorImagen::setAlpha( int nImg, int alpha ){

SDL_SetAlpha( getPointer( nImg ), SDL_SRCALPHA, alpha );

} Lo importante es esto, así de simple. alpha = 255 = opaco o en su defecto tranparencias del canal alpha de png y alpha=0 es transparente.

Como ves, mi tux parpadea, apareciendo y despareciendo como un fantasma. NO excedas del rango de alpha (0-255) y pon un control de fps (framerate)