I have started to make a puzzle bobble game and everything is going well but I have now hit a snag.
I want it so when the player removes a set of bubbles it plays an animation or does a particle effect at each bubble that was removed.
I can get it to do a particle effect at the last bubble that made the chains position but not the other bubbles positions.
Any help would be greatly appreciated.
Here is my code
package {
import org.flintparticles.twoD.emitters.Emitter2D;
import org.flintparticles.twoD.renderers.BitmapRenderer;
import com.greensock.*;
import flash.filters.BlurFilter;
import flash.filters.ColorMatrixFilter;
import flash.geom.Rectangle;
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.text.TextField;
public class Main extends Sprite{
private const ROT_SPEED:uint=2;
private const R:uint=22;
private const D:Number=R*Math.sqrt(3);
private const DEG_TO_RAD:Number=0.0174532925;
private const BUBBLE_SPEED:uint=10;
private var cannon:cannon_mc;
private var left:Boolean=false;
private var right:Boolean=false;
private var bubCont:Sprite;
private var bubble:bubble_mc;
private var fire:Boolean=false;
private var vx,vy:Number;
private var fieldArray:Array;
private var chainArray:Array;
private var connArray:Array;
private var bubbleScore:int = 0;
private var bubblesAdded:int = 0;
private var bubblesRemoved:int = 0;
private var gameOverBubble = false;
private var emitter:Emitter2D;
public function Main() {
placeCannon();
placeContainer();
loadBubble();
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKUp);
stage.addEventListener(MouseEvent.MOUSE_MOVE, moveMouse);
stage.addEventListener(MouseEvent.MOUSE_UP, onMUp);
addEventListener(Event.ENTER_FRAME, onEFrame);
}
private function onEFrame(e:Event):void {
bubbleScoreText.text = "Score: "+bubbleScore;
if (bubblesRemoved >= bubblesAdded) {
gameOverBubble = true;
}
if (gameOverBubble) {
stage.removeEventListener(MouseEvent.MOUSE_UP, onMUp);
}
if (left) {
cannon.rotation-=ROT_SPEED;
}
if (right) {
cannon.rotation+=ROT_SPEED;
}
if (fire) {
bubble.x+=vx;
bubble.y+=vy;
if (bubble.x<R){
bubble.x=R;
vx*=-1;
}
if (bubble.x>R*15) {
bubble.x=R*15
vx*=-1;
}
if (bubble.y<R) {
parkBubble();
} else {
for (var i:uint = 0; i<bubCont.numChildren; i++) {
var tmp:bubble_mc;
tmp=bubCont.getChildAt(i) as bubble_mc;
if (collide(tmp)) {
parkBubble();
break;
}
}
}
}
}
private function placeCannon():void {
cannon=new cannon_mc();
addChild(cannon);
cannon.y=450;
cannon.x=R*10;
}
private function placeContainer():void {
fieldArray=new Array();
bubCont=new Sprite();
addChild(bubCont);
bubCont.graphics.lineStyle(1,0x000000, 0.2);
for(var i:uint=0;i<9;i++){
fieldArray*=new Array();
for(var j:uint=0;j<8;j++){
if (i%2==0) {
bubCont.graphics.drawCircle(R+j*R*2,R+i*D,R);
fieldArray*[j]=0;
} else {
if (j<7) {
with (bubCont.graphics) {
drawCircle(2*R+j*R*2,R+i*D,R);
fieldArray*[j]=0;
}
}
}
}
}
}
private function loadBubble():void {
if (gameOverBubble == false) {
bubble = new bubble_mc();
addChild(bubble);
bubble.gotoAndStop(Math.floor(Math.random()*6))+1;
} else {
removeChild(bubble);
}
if (bubblesAdded >= 15) {
bubble.x=R*10;
bubble.y=450;
}
if (bubblesAdded == 0) {
bubble.x=22;
bubble.y = 22;
bubble.gotoAndStop(1);
parkBubble();
}
if (bubblesAdded == 1) {
bubble.x = 66;
bubble.y = 22;
bubble.gotoAndStop(2);
parkBubble();
}
if (bubblesAdded == 2) {
bubble.x = 110;
bubble.y = 22;
bubble.gotoAndStop(3);
parkBubble();
}
if (bubblesAdded == 3) {
bubble.x = 154;
bubble.y = 22;
bubble.gotoAndStop(4);
parkBubble();
}
if (bubblesAdded == 4) {
bubble.x = 198;
bubble.y = 22;
bubble.gotoAndStop(5);
parkBubble();
}
if (bubblesAdded == 5) {
bubble.x = 242;
bubble.y = 22;
bubble.gotoAndStop(4);
parkBubble();
}
if (bubblesAdded == 6) {
bubble.x = 286;
bubble.y = 22;
bubble.gotoAndStop(5);
parkBubble();
}
if (bubblesAdded == 7) {
bubble.x = 330;
bubble.y = 22;
bubble.gotoAndStop(4);
parkBubble();
}
if (bubblesAdded == 8) {
bubble.x=44;
bubble.y = 66;
bubble.gotoAndStop(3);
parkBubble();
}
if (bubblesAdded == 9) {
bubble.x = 88;
bubble.y = 66;
bubble.gotoAndStop(2);
parkBubble();
}
if (bubblesAdded == 10) {
bubble.x = 132;
bubble.y = 66;
bubble.gotoAndStop(1);
parkBubble();
}
if (bubblesAdded == 11) {
bubble.x = 176;
bubble.y = 66;
bubble.gotoAndStop(2);
parkBubble();
}
if (bubblesAdded == 12) {
bubble.x = 220;
bubble.y = 66;
bubble.gotoAndStop(3);
parkBubble();
}
if (bubblesAdded == 13) {
bubble.x = 264;
bubble.y = 66;
bubble.gotoAndStop(4);
parkBubble();
}
if (bubblesAdded == 14) {
bubble.x = 308;
bubble.y = 66;
bubble.gotoAndStop(5);
parkBubble();
}
}
private function parkBubble():void {
var row:uint=Math.floor(bubble.y/D);
var col:uint;
if (row%2==0) {
col=Math.floor(bubble.x/(R*2));
} else {
col=Math.floor((bubble.x-R)/(R*2));
}
var placed_bubble:bubble_mc = new bubble_mc();
bubCont.addChild(placed_bubble);
if (row%2==0) {
placed_bubble.x=(col*R*2)+R;
} else {
placed_bubble.x=(col*R*2)+2*R;
}
placed_bubble.y=(row*D)+R;
placed_bubble.gotoAndStop(bubble.currentFrame);
placed_bubble.name=row+","+col;
if(fieldArray[row][col]==0) {
fieldArray[row][col]=bubble.currentFrame;
} else {
gameOver();
gameOverBubble = true;
}
chainArray=new Array();
getChain(row,col);
if (chainArray.length>2) {
for (var i:uint=0; i<chainArray.length; i++) {
with (bubCont) {
bubblePop();
removeChild(getChildByName(chainArray*));
bubbleScore += 100;
bubblesRemoved += 1;
}
var coords:Array=chainArray*.split(",");
fieldArray[coords[0]][coords[1]]=0;
}
removeNotConnected();
}
trace("chain: "+chainArray);
removeChild(bubble);
fire=false;
bubblesAdded += 1;
loadBubble();
}
private function collide(bub:bubble_mc):Boolean {
var dist_x:Number=bub.x-bubble.x;
var dist_y:Number=bub.y-bubble.y;
return Math.sqrt(dist_x*dist_x+dist_y*dist_y)<=2*R-4;
}
private function onKDown(e:KeyboardEvent):void {
switch (e.keyCode) {
case 37 :
left=true;
break;
case 38 :
if (! fire) {
fire=true;
var radians=(cannon.rotation-90)*DEG_TO_RAD;
vx=BUBBLE_SPEED*Math.cos(radians);
vy=BUBBLE_SPEED*Math.sin(radians);
}
break;
case 39 :
right=true;
break;
}
}
private function onKUp(e:KeyboardEvent):void{
switch (e.keyCode) {
case 37 :
left=false;
break;
case 39 :
right=false;
break;
}
}
private function moveMouse(e:MouseEvent):void {
var dir=Math.atan2(cannon.y-mouseY,cannon.x-mouseX);
cannon.rotation=dir*180/Math.PI-90;
if (cannon.rotation<-60) {
cannon.rotation=-60;
}
if(cannon.rotation>45) {
cannon.rotation=45;
}
}
private function onMUp(e:MouseEvent):void {
if (! fire) {
fire=true;
var radians=(cannon.rotation-90)*DEG_TO_RAD;
vx=BUBBLE_SPEED*Math.cos(radians);
vy=BUBBLE_SPEED*Math.sin(radians);
}
}
private function getValue(row:int,col:int):int {
if (fieldArray[row]==null) {
return -1;
}
if (fieldArray[row][col]==null) {
return -1;
}
return fieldArray[row][col];
}
private function isNewChain(row:int,col:int,val:uint):Boolean {
return val == getValue(row,col)&&chainArray.indexOf(row+","+col)==-1;
}
private function getChain(row:int,col:int):void {
chainArray.push(row+","+col);
var odd:uint=row%2;
var match:uint=fieldArray[row][col];
for (var i:int=-1; i<=1; i++) {
for (var j:int=-1; j<=1; j++) {
if (i!=0||j!=0) {
if (i==0||j==0||(j==-1&&odd==0)||(j==1&&odd==1)) {
if (isNewChain(row+i,col+j,match)) {
getChain(row+i,col+j);
}
}
}
}
}
}
private function isNewConnection(row:int,col:int):Boolean {
return getValue(row,col)>0&&connArray.indexOf(row+","+col)==-1;
}
private function getConnections(row:int,col:int):void {
connArray.push(row+","+col);
var odd:uint=row%2;
for (var i:int=-1; i<=1; i++) {
for (var j:int=-1; j<=1; j++) {
if (i!=0||j!=0) {
if(i==0||j==0||(j==-1&&odd==0)||(j==1&&odd==1)) {
if (isNewConnection(row+i,col+j)) {
if (row+i==0) {
connArray[0]="connected";
} else {
getConnections(row+i,col+j);
}
}
}
}
}
}
}
private function removeNotConnected():void {
for (var i:uint=1; i<9; i++) {
for (var j:uint=0; j<8; j++) {
if (getValue(i,j)>0) {
connArray=new Array();
getConnections(i,j);
if (connArray[0]!="connected") {
with (bubCont) {
removeChild(getChildByName(i+","+j));
bubbleScore += 100;
bubblesRemoved += 1;
}
fieldArray*[j]=0;
}
}
}
}
}
private function gameOver():void {
// put gameOver script here
}
private function bubblePop():void {
emitter = new Firework();
var renderer:BitmapRenderer = new BitmapRenderer( new Rectangle( 0, 0, 500, 400 ) );
renderer.addEmitter( emitter );
addChild( renderer );
emitter.x = bubble.x;
emitter.y = bubble.y;
emitter.start();
}
}
}