如何在AS3中将矩形碰撞与基于图块的游戏结合使用?

时间:2012-08-20 06:05:57

标签: actionscript-3 flash collision

在我一直在研究的这个项目中,播放器在屏幕中央保持静止,而地图则根据键盘输入移动。 -Map是基于图块的;我手动放入1280x896像素的影片剪辑中的所有图块,然后脚本将每个图块放入一个数组(blockArray)。从历史上看,我总是相当成功地在父脚本和子脚本(Movie Clip tile-holder)之间传递碰撞信息,而没有使用点碰撞的麻烦。

- 在更多基于物理的项目中,我在矩形碰撞(getRect等)方面取得了更大的成功。然而,在这些情况下,我以前从未使用它与上述Tile Holder / Movie Clip一起使用。

以下代码作为MoveBall / Player脚本的一部分运行,每个帧都会更新。当我在测试窗口中运行它时,它总是会崩溃程序 - 也许它不能脱离“for”循环?

public function moveBall (event:Event)
{
    if (lastTime == 0) lastTime = getTimer();
    var timePassed:int = getTimer() -lastTime;
    lastTime += timePassed;

    var newBallX = _Level.x +ballDX*timePassed; //ballDX = ball direction x
    var newBallY = _Level.x+ballDY*timePassed; //ballDY = ball direction y

    var oldBallRect = new Rectangle(_ball.x-ballRadius, _ball.y-ballRadius, ballRadius*2, ballRadius*2);
    var newBallRect = new Rectangle(newBallX-ballRadius, newBallY-ballRadius, ballRadius*2, ballRadius*2); // These correspond to the actual player, which is stationary and 64x64 pixels.

    for(var i:int=blockArray.length-1;i>=0;i--)
    {
            var theBlock = blockArray[i];
            var blockRect:Rectangle = getRect(theBlock);
            if (blockRect.intersects (newBallRect))
            {
                  //collision treatment here
            }
    }
}

下面是我用来在构造函数中构建关卡的方法:

public function startGame()
{
         //constructor code
         stage.focus = stage;
        
         if (_Level == null)
         {
                  _Level = new level_obj(); // this Movie Clip, "level_obj",  is where the blocks that are loaded into the blockArray reside.
                  addChild (_Level);
                
                 for (var i:int = _Level.numChildren-1;i>=0;i--) // this "for" Loop loads the blocks from inside the _Level Movieclip into the blockArray
                 {
                           if (_Level.getChildAt(i) is block_obj)
                           {
                                        blockArray.push(_Level.getChildAt(i));
                           }
                 }
}

我在这里遇到的主要问题是,getRect(theBlock)没有得到Rectangle应该与之碰撞的特定区块的Player/Ball - blockArray(i)。根据我的追踪,blockRect的大小是1280x896 - 整个Movie Clip的大小,它包含blockArray中的所有块 - 而不仅仅是其中一个块“(i)” ,这是64x64。

奇怪的是,我制作了一种标记Movie Clip,它在碰撞/移动脚本中的for循环期间被添加到_Level影片剪辑中;这个Movie Clip总是附加到我放在那里的第一个Block的注册点,而不是_Level Movie Clip的注册点,它位于(0,0)的左上角,是什么getRect命令似乎在引用。

所以,我的问题是:这是一个失败的原因还是有什么我可以投入或取出来使这项工作?

如果我在这种方法上浪费时间,那么这些方法中哪一种听起来最可行?

  1. 使用常规Array方法(newArray = [Block, Block, Block, Lavapit, Block, etc.] - 级别的构造在Game/Constructor类中完全处理。
  2. 回到点碰撞;但不确定这对基于物理的项目有多好。
  3. 或者是否有一种我不知道的替代方法?
  4. 无论如何;所有人!晚安/早上/下午/晚上。

2 个答案:

答案 0 :(得分:0)

您可以考虑使用Box2d。

如果你有一个球跳跃,我不会称之为基于Tile的游戏。基于瓷砖意味着所有物体的运动都是直线和特定位置,如国际象棋。

答案 1 :(得分:0)

做了一些研究并从头开始建立了一个基本的碰撞系统,并从SAT theoy获得了一些灵感。