And*_*rew 3 objective-c actionscript-3 game-physics
在2D方形网格系统中进行移动的最佳方法是什么?我有这个有用的东西,但它似乎错误/丑陋(见下文).
x x x x x x x
x x x x x x x
x x x O x x x
x x x U x x x
x x x x x x x
x x x x x x x
x x x x x x x
Run Code Online (Sandbox Code Playgroud)
例如,U是我想要移动的单位,而O是像另一个单位或山一样无法通过的对象.如果U可以移动3个图块,我希望可移动区域(M)看起来像这样.
x x x x x x x
x x M x M x x
x M M O M M x
M M M U M M M
x x M M M M x
x x M M M x x
x x x M x x x
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
public function possibleMoves(range:uint, cords:Array):void {
var X:uint = cords[0];
var Y:uint = cords[1];
if (range > 0) {
try {
theGrid[X + 1][Y].moveable = true;
if (theGrid[X + 1][Y].getOccupied == false) {
possibleMoves(range - 1, [X + 1, Y], flag, mtype);
}
} catch (err:Error) { }
try {
theGrid[X - 1][Y].moveable = true;
if (theGrid[X - 1][Y].getOccupied == false) {
possibleMoves(range - 1, [X - 1, Y], flag, mtype);
}
} catch (err:Error) { }
try {
theGrid[X][Y + 1].moveable = true;
if (theGrid[X][Y + 1].getOccupied == false) {
possibleMoves(range - 1, [X, Y + 1], flag, mtype);
}
} catch (err:Error) { }
try {
theGrid[X][Y - 1].moveable = true;
if (theGrid[X][Y - 1].getOccupied == false) {
possibleMoves(range - 1, [X, Y - 1], flag, mtype);
}
} catch (err:Error) { }
}
Run Code Online (Sandbox Code Playgroud)
小智 6
你的tileset的数据结构似乎强烈地耦合到一个"Tile"类,它做了太多的事情; theGrid [X] [Y] .moveable,theGrid [X] [Y] .getOccupied ...... +可能还有其他一些方法.
也许tileset数据结构应该只存储布尔值(walkable?true/false),并且只有一个方法来告诉tile是否可以步行.在这种情况下,布尔值的Vector就足够了.测试4(或8对角线)的naerby值非常快,并且可以使用递归循环将测试扩展到新找到的值.
如果您有不同类型的图块(墙,对象,字符等),您可以使用Vector.<int>而不是布尔值; 0将是一个可步行的瓷砖,其他任何东西都是禁区.这允许布尔检查:0 = false,任何其他值= true.
我在这里做了一个样本http://wonderfl.net/c/bRV8 ; 它可能比粘贴代码更清晰.移动鼠标,你应该看到一个粉红色的形状,给你有效的细胞.
因此,无论起点如何都执行递归.它会以一种有时出乎意料的方式溢出.
如果你需要给出一定数量的动作,这是不够的,你将不得不设置某种路径查找器.
编辑:似乎提供的代码有效,但包含一个递归终止错误,尝试通过以下行避免.这只适用于某些情况,如果你将你的角色放在地图的边缘或者给他5个以外的移动次数,这种行为真的很奇怪:
var max:int = ( maxDepth * maxDepth );
if( maxDepth % 2 == 0 )max--;
recursiveCheck( valid, tilesetClone, 0, max, connexity );
Run Code Online (Sandbox Code Playgroud)
我检查了不同的递归深度,这个bug很快变得明显.这个例子缺少网格和复杂的地图设计掩盖了这个错误,但是这里有一个截图 - 请注意,如果鼠标位于角落中,如图所示,该字段向上延伸6个方格,剩下7个方格,而它应该只是5.
归档时间: |
|
查看次数: |
1543 次 |
最近记录: |