Hoy he me he embarcado en un interesante proyecto donde tendré que volver a mi plataforma favorita: Flash, y además con bastante libertad creativa, ya que tengo que desarrollar un microsite de minijuegos basados en dibujos animados con estética futurista, lo cual hace que mi cabeza gire a miles de revoluciones pensando en efectos de luz, movimiento, físicas , etc… las típicas cosas que te encanta hacer y jugar con ellas, trasteas y te empollas cientos de páginas sobre experimentos, pero que luego nunca vas a usar en un proyecto real… o sí!

Hoy he empezado por recordar todo lo referente a partículas, bitmapdata y este tipo de cosas con las que hacía meses…o años… que no lidiaba.
El primer experimento ha sido crear una transición de imágenes en las que estas explotan en píxeles. No voy a colgar la demo aún ya que aunque la explosión va fluidísima (incluso con imágenes grandes) la implosión ya no va tan bien, por lo que tengo que darle más vueltas.
De todas formas lo que me importaba era generar una clase de explosión de enemigos para un shoot’em up….

Y el segundo ha sido un efecto de partículas de luz para la esfera de energía de la homepage.
Sinceramente no tengo demasiado tiempo, pero tampoco me gusta utilizar código de otros si lo que quiero hacer entra dentro de mis posibilidades, por lo que este ha sido el resultado rápido y resultón:

This movie requires Flash Player 9

El código de la class es el siguiente, hecho bastante rápido, pero con un rendimiento bastante bueno, al menos en mi máquina.
Si la cosa se ralentiza siempre se pueden modificar el número de partículas (he puesto 5000, a lo bravo) o reducir el desenfoque del BlutFilter.


package xcx{
import flash.display.*;
import flash.events.*;
import flash.utils.*;
import flash.filters.GlowFilter;
import flash.filters.BlurFilter;
public class BMPEnergy extends MovieClip {
var bmp:Bitmap;
var bmpdata:BitmapData;
var main:MovieClip;
var particulas:Array=[];
var numparts:Number=5000;
var velocidad:Number=.6;
var maxvida:int=50;
var r:uint;
var g:uint;
var b:uint;
var a:uint;
var c:uint;
var glow:GlowFilter;
var blur:BlurFilter;
var limiteanillo:Array=[100,90];


function randomNumber(low:Number=0, high:Number=1):Number {
return Math.floor(Math.random() * (1+high-low)) + low;
}


function anima() {
for (var p:int=0; p
if (particulas[p].vida
particulas[p].x+=Math.sin(particulas[p].rot)+particulas[p].velx;
particulas[p].y+=Math.cos(particulas[p].rot)+particulas[p].vely;
particulas[p].vida++;
} else {
particulas[p].x=particulas[p].x0;
particulas[p].y=particulas[p].y0;
particulas[p].vida=0;
particulas[p].rot+=randomNumber(-1,1)
}
}
dibuja();
}


function dibuja() {
bmpdata.lock();
bmpdata.fillRect(bmpdata.rect, 0);
for (var i:int=0; i
bmpdata.setPixel32(particulas[i].x, particulas[i].y, particulas[i].color);
}
bmpdata.unlock();
}


public function init() {
bmpdata=new BitmapData(500,500,true);
bmpdata.fillRect(bmpdata.rect, 0);
for (var i:int=0; i
//color: 83d547
r=0x83;
g=0xD5;
b=0x47;
a=(Math.random())*0xFF;
c=((a << 24) | (r << 16) | (g << 8 ) | b); var p:Object={color:c,x:(Math.sin(i)*limiteanillo[0]/2)+limiteanillo[0],y:(Math.cos(i)*limiteanillo[1]/2)+limiteanillo[1],x0:(Math.sin(i)*limiteanillo[0]/2)+limiteanillo[0],y0:(Math.cos(i)*limiteanillo[1]/2)+limiteanillo[1],rot:i,muerte:randomNumber(maxvida)+5,vida:0}; if (Math.cos(i)>0) {
p.vely=randomNumber(1,velocidad);
} else {
p.vely=randomNumber(- velocidad,-1);
}
if (Math.sin(i)>0) {
p.velx=randomNumber(1,velocidad);
} else {
p.velx=randomNumber(- velocidad,-1);
}
particulas.push(p);
}
dibuja();
bmp=new Bitmap(bmpdata);
addChild(bmp);
setInterval(anima,40);
}


public function BMPEnergy() {
init();
glow=new GlowFilter(0x65af2f,2,6,6,2)
blur=new BlurFilter(1.6,1.6,2)
this.filters=[blur,glow]
}
}
}

Tags: , ,

Posted by Cesar - 07/02/11 - 2 comments