Bom, você vai precisar de uma sprite com 7 frames, na seguinte ordem: centro, esquerda, direita, cima, baixo, horizontal e vertical. Vou explicar mais:
- centro: esse frame vai ser colocado no centro da explosão. Como na imagem do bomberman, ele teria que ser desenhado de forma que criasse quatro "perninhas" para ligar as outras partes.
- esquerda: esse frame vai ser colocado no final da expansão esquerda da explosão, a ponta.
- direita: mesma coisa da esquerda, só que ao contrário.
- cima: ponta de cima
- baixo: ponta de baixo
- horizontal: frame que será colocado entre o centro e a ponta, sendo seamless - isto é, colocando um junto do outro eles se repetem perfeitamente
- vertical: idém ao horizontal, só rotacionado 90 graus
Uma imagem que usei para testes:
Uma strip de 7 frames 32x32. Origem (0, 0).
Depois, com um objeto para explosão, sem sprite mesmo, coloque as seguintes informações:
Object Information: Clique para ver o conteúdo
Information about object: obj_explo
Sprite: <no sprite>
Solid: true
Visible: true
Depth: 0
Persistent: false
Parent: <no parent>
Mask: spr_explosao_mask
Create Event:
execute code:
Other Event: Game Start:
execute code:
Draw Event:
execute code:
Código: Selecionar todos
// Indices de explosão
var exp_centro, exp_esquerda, exp_direita,
exp_cima, exp_baixo,
exp_horizontal, exp_vertical,
gridX, gridY;
exp_centro = 0; exp_esquerda = 1; exp_direita = 2;
exp_cima = 3; exp_baixo = 4;
exp_horizontal = 5; exp_vertical = 6;
gridX = 32; gridY = 32;
draw_sprite(spr_explosao, exp_centro, x, y);
// esquerda
for (i=1;i<raio+1;i+=1) {
var px, py, parte;
// a matemática de px e py forçam o alinhamento a grid
px = floor( (x-(i*gridX))/gridX ) * gridX;
py = floor( y/gridY ) * gridY;
parte = exp_horizontal;
if (i == raio) parte = exp_esquerda;
draw_sprite(spr_explosao, parte, px, py);
}
// direita
for (i=1;i<raio+1;i+=1) {
var px, py, parte;
px = floor( (x+(i*gridX))/gridX ) * gridX;
py = floor( y/gridY ) * gridY;
parte = exp_horizontal;
if (i == raio) parte = exp_direita;
draw_sprite(spr_explosao, parte, px, py);
}
// cima
for (i=1;i<raio+1;i+=1) {
var px, py, parte;
px = floor( x/gridX ) * gridX;
py = floor( (y-(i*gridY))/gridY ) * gridY;
parte = exp_vertical;
if (i == raio) parte = exp_cima;
draw_sprite(spr_explosao, parte, px, py);
}
// baixo
for (i=1;i<raio+1;i+=1) {
var px, py, parte;
px = floor( x/gridX ) * gridX;
py = floor( (y+(i*gridY))/gridY ) * gridY;
parte = exp_vertical;
if (i == raio) parte = exp_baixo;
draw_sprite(spr_explosao, parte, px, py);
}
Para checar por colisões com blocos, cada laço for desse poderia ser incrementado com uma checagem via
place_meeting. Aí que entra aquela mask que eu usei no objeto: é uma sprite de 32x32 totalmente preenchida de branco. Ela será usada para colisão. Antes de cada if
(i == raio), coloque:
Código: Selecionar todos
if (place_meeting(px, py, obj_bloco)) {
// Parar de desenhar, quebrando o loop
break;
}
Assim, como ocorre em bomberman, se ele colidir com um bloco a chama não irá atravessá-lo.
Espero ter ajudado :)