[Tutorial] Efectos Fade In/Out y otros

Buenas, pues voy a ir poniendo algunas funciones que utilizo en el juego Anime Quiz DS, que pueden servir como tutoriales. Aquí dejo unas para hacer un efecto fadeIn o fadeOut, y para hacer una pausa de X segundos en la ejecución.

Primero los efectos:
/* Declaración de funciones */
void fadeIn(u8 screen, u8 segundos); //Max 255 segundos
void fadeOut(u8 screen, u8 segundos); //Max 255 segundos

/* Función para hacer un fadein, pone la pantalla en negro y poco a poco pasa a brillo normal.
** Le paso el número de la pantalla y en cuántos segundos quiero que haga el fade
*/
void fadeIn(u8 screen, u8 segundos) {
    u8 cc = 0;
    s8 brillo = -32;
    u8 paso = (segundos*60)/30;
    for (cc=0; cc<(segundos*60); cc++) {
        if ((cc % paso)==0) {
            brillo++; //Aumento el brillo
            PA_SetBrightness(screen,brillo);
        }      
      PA_WaitForVBL();
    }
    PA_SetBrightness(screen,0); //restauro el brillo normal
   PA_WaitForVBL();
}

/* Función opuesta a la anterior, pasa de la pantalla normal a una pantalla en negro poco a poco */
void fadeOut(u8 screen, u8 segundos) {
    u8 cc = 0;
    s8 brillo = 0;
    u8 paso = (segundos*60)/30;
    for (cc=0; cc<(segundos*60); cc++) {
        if ((cc % paso)==0) {
            brillo--; //Disminuyo el brillo
            PA_SetBrightness(screen,brillo);
        }      
      PA_WaitForVBL();
    }
    PA_SetBrightness(screen,-32); //restauro el brillo normal
   PA_WaitForVBL();
}



Y ahora la función de esperar:
/* Declaración de la función */
void esperar(u8 segundos); //Max 255 segundos

/* Función que hace una pausa en el juego */
void esperar(u8 segundos) {
    u16 cuenta = 1;
    while (cuenta<(segundos*60)) { cuenta++; PA_WaitForVBL();}   
}


Luego pondré alguna más :)

Edit: Venga ahora una función para reemplazar un caracter por otro en una cadena.

/* Función para reemplazar todas las apariciones del caracter 'origen' por 'sustituto' en la cadena src */
char* replaceChar(char const* src, char origen, char sustituto) {
   char c;
   char *output = (char *) malloc(1000);
   do {
      c = *src++;
      if (c!=origen) *output++ = c;
      else *output++ = sustituto;
   } while(c);
   return output;
}
Gracias por tu aporte, seguro que vienen bien a mucha gente ;).

Analizando un poco el código del fadein/fadeout veo que la comprobación del resto de "cc" entre "paso" lo que hace es disminuir la velocidad a la que el brillo es cambiado, está bien pensado, pero no crees que ganarías rendimiento si la cantidad de segundos la multiplicas por 60 en vez de hacerlo en cada comprobación? (No se si me he explicado bien)
Quiero decir, asignar como valor a la variable: segundos *= 60;
y ya en el for lo compruebas directamente, sin tener que hacer la operación cada vez ( ...; cc < segundos;... )
Quizás no se note mucho pero ganar seguro que gana ;).

Por otra parte, decirte que esto:
u8 paso = (segundos*60)/30;
sería lo mismo que ésto
u8 paso = segundos*2;
con lo cual te ahorras esas 2 operaciones "grandes" (a la DS eso... buf) a cambio de esa mas simple.

Y bueno, solo mostrarte la función que me hice yo en su día para el fadein/fadeout:
(fadeout)
void apaga(s8 pantalla)
{
   s8 i;
   for(i=0; i > -32; i--)
   {
      if(pantalla == 2)
      {
         PA_SetBrightness(1,i);
         PA_SetBrightness(0,i);
      } 
      else
         PA_SetBrightness(pantalla, i);
      
      PA_WaitForVBL();
   }
}
(fade in)
void enciende(s8 pantalla)
{
   s8 i;
   for(i=-31; i <= 0; i++)
   {
      if(pantalla == 2)
      {
         PA_SetBrightness(1,i);
         PA_SetBrightness(0,i);
      } 
      else
         PA_SetBrightness(pantalla, i);
      
      PA_WaitForVBL();
   } 
}



Como puedes ver no tiene opción de poner el tiempo que desees; esto es debido a que las hice para uso personal con la idea ya de hacer un "encendido/apagado" rápido.
Quería que vieras como enviándo como parámetro pantalla el valor 2 hace el cambio en ambas pantallas a la vez, quizá te interese ;).

Y nada más, que me enrollo xD salu2!
JOE! [flipa] me vienen de PM tios ^^ la verdad, que muchas gracias por el aporte :D

salu2!

PD: Seguiré este hilo con atención. Podríais poner algo así como [Hilo Oficial] Funciones/efectos Palib, ya que son cosas MUY Curiosas ^^ o algo por el estilo.
Un consejo: Mejor que escribas las funciones en inglés, te va a salir mucho más profesional ;)
Alber_h escribió:Gracias por tu aporte, seguro que vienen bien a mucha gente ;).

Analizando un poco el código del fadein/fadeout veo que la comprobación del resto de "cc" entre "paso" lo que hace es disminuir la velocidad a la que el brillo es cambiado, está bien pensado, pero no crees que ganarías rendimiento si la cantidad de segundos la multiplicas por 60 en vez de hacerlo en cada comprobación? (No se si me he explicado bien)
Quiero decir, asignar como valor a la variable: segundos *= 60;
y ya en el for lo compruebas directamente, sin tener que hacer la operación cada vez ( ...; cc < segundos;... )
Quizás no se note mucho pero ganar seguro que gana ;).

Por otra parte, decirte que esto:
u8 paso = (segundos*60)/30;
sería lo mismo que ésto
u8 paso = segundos*2;
con lo cual te ahorras esas 2 operaciones "grandes" (a la DS eso... buf) a cambio de esa mas simple.


Sí, tienes razón :) este código ni lo depuré ya que mi juego no tira mucho de los recursos de la DS y no me hizo falta, pero si se puede mejorar mucho mejor claro.


Un consejo: Mejor que escribas las funciones en inglés, te va a salir mucho más profesional


Paso, llevo demasiado tiempo programando y ahora me ha dao la venada de poner las cosas en español. :P además ya hay más de 45 millones de hispano-parlantes en EEUU dijeron el otro día. Una España entera allí metida.
alexpowerup escribió:Un consejo: Mejor que escribas las funciones en inglés, te va a salir mucho más profesional ;)


Así quedaría mucho más "internacional", pero no creo que aporte profesionalidad al código :p.
Además para cosas así que vas a ver tu y 3 más, que más dá.

Salu2!
Alber_h escribió:
alexpowerup escribió:Un consejo: Mejor que escribas las funciones en inglés, te va a salir mucho más profesional ;)


Así quedaría mucho más "internacional", pero no creo que aporte profesionalidad al código :p.
Además para cosas así que vas a ver tu y 3 más, que más dá.

Salu2!

Yo sufro cuando tengo que documentar algo en inglés... [+risas] pero a veces no queda mas remedio, sobre todo si pretendes liberar el source y pretendes que le sirva a toda la gente posible.
Pues yo no sufro, disfruto XD
alexpowerup escribió:Pues yo no sufro, disfruto XD

Échate un vistazo al Nitro Engine, sólo un vistazo a los archivos *.h. Luego me dices si es divertido hacer eso. [+risas] Y ya si te apetece... pues mírate los comentarios de los ejemplos, etc...
8 respuestas