2012-07-13 17 views
1

我正在做一个泡泡射击游戏,我正在试着让我正在燃烧的泡泡堆积起来,然后在列中的正确位置。我在板上放置的气泡看起来像这样:如何在我的Bubble Shooter游戏中制作新的气泡堆栈?

000000000000000 
000000000000000 
000000000000000 
000000000000000 

有4行15个气泡。这是迄今为止我所编写的代码:

主要

package { 
import flash.display.Sprite; 
import flash.events.KeyboardEvent; 
import flash.events.Event; 
import flash.display.SpreadMethod; 

public class Main extends Sprite { 
    private const ROT_SPEED:uint=2; 
    private const R:uint=18; 
    private const DEG_TO_RAD:Number=0.0174532925; 
    private const BUBBLE_SPEED:uint=10; 
    private var bubbleArr:Array=new Array(); 
    private var loadArr:Array=new Array(); 
    private var cannon:cannon_mc; 
    private var bubble:bubble_mc; 
    private var row:uint=0; 
    private var col:uint=0; 
    private var left:Boolean=false; 
    private var right:Boolean=false; 
    public var bubCont:Sprite; 
    private var loadCont:Sprite; 
    private var fire:Boolean=false; 
    private var vx,vy:Number; 
    public function Main() { 
     placeContainer(); 
     placeCannon(); 
     loadBubble(); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN,onKDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP,onKUp); 
     addEventListener(Event.ENTER_FRAME,onEFrame); 
     trace("row= "+row+" , col= "+col); 
    } 
    private function placeCannon():void { 
     cannon=new cannon_mc(); 
     addChild(cannon); 
     cannon.y=385.5; 
     cannon.x=320; 
    } 
    private function onKDown(e:KeyboardEvent):void { 
     switch(e.keyCode) { 
      case 37 : 
       left=true; 
       break; 
      case 39 : 
       right=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; 
     } 
    } 
    private function onKUp(e:KeyboardEvent):void { 
     switch(e.keyCode) { 
      case 37 : 
       left=false; 
       break; 
      case 39 : 
       right=false; 
       break; 
     } 
    } 
    private function onEFrame(e:Event):void { 
     if (left) { 
      cannon.rotation-=ROT_SPEED; 
     } 
     if (right) { 
      cannon.rotation+=ROT_SPEED; 
     } 
     if (fire) { 
      bubble.x+=vx; 
      bubble.y+=vy; 
      if (bubble.x<59) { 
       bubble.x=59; 
       vx*=-1; 
      } 
      if (bubble.x>(59+R*R)) { 
       bubble.x=59+R*R; 
       vx*=-1; 
      } 
      if (bubble.y<(40)) { 
       bubble.y=40; 
      } 
     } 
    } 

    public function placeContainer():void { 
     var iRow:Boolean=false; 
     bubCont=new Sprite(); 
     addChild(bubCont); 
     for (var i:uint=0; i<4; i++) { 
      if (! iRow) { 
       for (var j:uint=0; j<15; j++) { 
        bubbleArr[i]=new Array(); 
        bubbleArr[i][j]=Math.floor(Math.random()*6); 
        bubble = new bubble_mc(bubbleArr[i][j],i,j); 
        bubCont.addChild(bubble); 
        iRow=true; 
        row++; 
        col++; 
       } 
      } else { 
       for (j=0; j<15; j++) { 
        bubbleArr[i]=new Array(); 
        bubbleArr[i][j]=Math.floor(Math.random()*6); 
        bubble = new bubble_mc(bubbleArr[i][j],i,j); 
        bubble.x=77+j*2*R; 
        bubCont.addChild(bubble); 
        iRow=false; 
        row++; 
        col++; 
       } 
      } 
     } 
    } 
    private function loadBubble():void { 
     addChild(bubble); 
     bubble.gotoAndStop(Math.floor(Math.random()*6))+1; 
     bubble.x=320; 
     bubble.y=410; 
    } 
} 

bubble_mc类:

package { 
import flash.display.MovieClip; 
public class bubble_mc extends MovieClip { 
    public function bubble_mc(val:uint,row:uint,col:uint) { 
     gotoAndStop(val+1); 
     name=row+"_"+col; 
     x=59+col*36; 
     y=40+row*32; 
    } 
} 

我absolutley不知道如何使泡沫叠加在一起..我尝试过使用hitTestObject函数,并试图编写自己的函数来检查碰撞,然后调用应该将气泡放在正确位置的函数,但是它d没有工作,我不知道为什么。我收到一个名为TypeError的错误:错误#1010。 这里是碰撞功能,这是为了把气泡在正确的地方parkBubble功能 - :

private function parkBubble(bubble:bubble_mc,row:int,col:int):void { 
     var iRow:Boolean=false; 
     for (var j:uint=0; j<col; j++) { 
      trace("first for loop "); 
      for (var i:uint=row; i>0; i--) { 
       trace("second for loop "); 
       if (bubbleArr[i][j]!=null) { 
        trace("first if loop "); 
        if (! iRow) { 
         trace("second if loop "); 
         bubbleArr[i+1]=new Array(); 
         bubbleArr[i+1][j]=Math.floor(Math.random()*6); 
         bubble = new bubble_mc(bubbleArr[i+1][j],(i+1),j); 
         bubCont.addChild(bubble); 
         iRow=true; 
         row++; 
         col++; 
        } else { 
         trace("first for loop after else "); 
         bubbleArr[i+1]=new Array(); 
         bubbleArr[i+1][j]=Math.floor(Math.random()*6); 
         bubble = new bubble_mc(bubbleArr[i+1][j],(i+1),j); 
         bubble.x=77+j*2*R; 
         bubCont.addChild(bubble); 
         iRow=false; 
         row++; 
         col++; 
        } 
       } 
      } 
     } 
     removeChild(bubble); 
     fire=false; 
     loadBubble(); 
     trace("slutet av parkBubble "); 
    } 

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; 
} 

回答

1

是在这条线的类型错误?

var placed_bubble:bubble_mc=new bubble_mc([row][col],row,col); 

[row]是一个数组,[col]是一个数组。但构造期望的无符号整数:

public function bubble_mc(val:uint,row:uint,col:uint) { 

为了将气泡复制到泡沫容器,通过帧编号:

var placed_bubble:bubble_mc=new bubble_mc(bubble.currentFrame-1, row, col); 

这可能不是唯一的问题。 TypeError通常是由一个未定义的变量产生的,这可能来自修改变量“bubble”的其他代码。例如,placeContainer将容器中的气泡分配给变量“bubble”。

parkBubble函数始终将“iRow”设置为false,但如果气泡与上面的行碰撞,那很奇怪,您希望iRow为true。

var row:uint=Math.floor(bubble.y/(40+R*Math.sqrt(3))); 
    var iRow:Boolean= row % 2 == 1 ? true : false; 

至少在编译之后,如果返回并用一些常量名称简化和优化数学,那么问题就会减少。那么你会更容易看到上面的代码来计算行是不太正确的。它应该减去顶部边距(40)。对于命名常量,这是显而易见的:

private const Y_PER_ROW:int = int(R * Math.sqrt(3)); 
    private const TOP:int = 40; 
    ... 
    var row:uint = int((bubble.y - TOP)/Y_PER_ROW); 

我也仔细检查了其他计算。 Puzzle Bobble游戏通常设置奇数行在半径上水平偏移,而不是在2半径(2 * R)。所以他们像六边形一样合体。

placeContainer函数可以简化。偶数或奇数行中的大部分代码都是相同的,因此可以从if块中取出。在你发布的代码中,我不明白为什么你需要在placeContainer中使用“row ++”和“col ++”。这相当于和更容易阅读:

for (var i:uint=0; i<4; i++) { 
      var xOffset:int = (i % 2) * 2 * R; 
      for (var j:uint=0; j<15; j++) { 
       bubbleArr[i] = new Array(); 
       bubbleArr[i][j] = int(Math.random()*6); 
       bubble = new bubble_mc(bubbleArr[i][j], i, j); 
       bubble.x += xOffset; 
       bubCont.addChild(bubble); 
       row++; 
       col++; 
      } 
    } 

然后,从碰撞检测码可以简化和优化,以避免计算当气泡远离并避免昂贵的平方根计算:

Circle Collision Detection HTML5 Canvas

http://cgp.wikidot.com/circle-to-circle-collision-detection

+0

谢谢你的回答!我已将placeContainer函数更改为您的函数,但无论您将最后一行添加到舞台上,无论您将其设置为多少行,它都可以正常工作。你知道这是为什么吗?我也意识到我发布了错误的parkBubble函数,所以我在我的问题中改变了它,你能否看看它并告诉我我做错了什么? – JNeander 2012-07-16 11:33:54

+0

我想我即将解决parkBubble功能!如果@Ethan有任何想法,为什么最后一个泡泡没有显示在placeContainer函数中,请让我知道! :) – JNeander 2012-07-17 14:24:26

+0

有一个混淆可能是在placeContainer和点火中都使用了变量“bubble”。所以当你开火时,它会触发最后一个泡泡。为避免将placeContainer中的最后一个气泡从PlaceContainer中移除,请创建一个与“bubble”不同的局部变量,如“placedBubble”。此代码或其他代码中可能存在其他问题。 – 2012-07-22 21:43:53