在我一直在研究的这个项目中,播放器在屏幕中央保持静止,而地图则根据键盘输入移动。 -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
命令似乎在引用。
所以,我的问题是:这是一个失败的原因还是有什么我可以投入或取出来使这项工作?
如果我在这种方法上浪费时间,那么这些方法中哪一种听起来最可行?
Array
方法(newArray = [Block, Block, Block, Lavapit, Block, etc.]
- 级别的构造在Game/Constructor
类中完全处理。无论如何;所有人!晚安/早上/下午/晚上。
答案 0 :(得分:0)
您可以考虑使用Box2d。
如果你有一个球跳跃,我不会称之为基于Tile的游戏。基于瓷砖意味着所有物体的运动都是直线和特定位置,如国际象棋。
答案 1 :(得分:0)
做了一些研究并从头开始建立了一个基本的碰撞系统,并从SAT theoy获得了一些灵感。