0

在我一直从事的这个项目中,玩家在屏幕中心保持静止,而地图根据键盘输入四处移动。-地图是基于瓷砖的;我手动将所有图块放入 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的特定块的。根据我的跟踪,它的大小是 1280x896 - 包含所有块的整个电影剪辑的大小- 而不仅仅是块“(i)”中的一个,它是 64x64。Player/BallblockArray(i)blockRectblockArray

奇怪的是,我制作了一种标记电影剪辑,它_Level在碰撞/运动脚本的 for 循环期间添加到电影剪辑中;此影片剪辑始终附加到我放置在那里的第一个块的注册点,而不是_Level影片剪辑的注册点,它位于 (0,0) 的左上角,并且是getRect命令的内容参考。

所以,我的问题是:这是一个失败的原因,还是我可以投入或取出一些东西来完成这项工作?

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

  1. 使用常规Array方法 ( newArray = [Block, Block, Block, Lavapit, Block, etc.]- 级别的构建完全在Game/ConstructorClass 中处理。
  2. 回点碰撞;不过,不确定这对于基于物理的项目有多好。
  3. 或者是否有我不知道的替代方法?

任何状况之下; 非常感谢,所有!晚安/早上/下午/晚上。

4

2 回答 2

0

您可以考虑使用 Box2d。

如果你有一个跳来跳去的球,我不会称之为基于瓷砖的游戏。基于图块意味着所有对象的移动都是直线和特定位置,如国际象棋。

于 2012-08-20T09:27:28.473 回答
0

受SAT理论的启发,做了一些研究并从头开始构建了一个基本的碰撞系统。

于 2012-08-23T16:04:06.353 回答