我正在使用 ActionScript 3 并尝试为视频游戏(自上而下的动作/射击游戏)构建一个非常简单的原型,并意识到处理子弹比我最初想象的更具挑战性。
为了在角色和目标之间获得相当不错的子弹“飞行”,我最终使用了Bresenham 线算法的高度修改版本来确定子弹的飞行路径,然后仅绘制一个微小的 flash.geom。在我的应用程序的并条框阶段,该“飞行路径”上适当位置的矩形对象。
我没有注意到任何真正的问题,但我无法想象这是在 Flash 游戏中处理子弹的最佳方式。我想一旦屏幕上有多个敌方玩家并且有大量子弹飞来飞去(尤其是当我在自动武器中编码时),事情可能会停止。
我在这里想念什么?我并不是真正的游戏开发者,所以我所做的大部分事情都是当场“编造”出来的,但我无法弄清楚如何在 Flash 中有效地处理子弹。
编辑:根据要求,这是“我的”布雷森汉姆代码。我用引号说“我的”,因为我基本上是从互联网上的某个地方撕下来的。我对算法的更改基本上涉及底部的行。最初的实现会找到从玩家角色到目标的路径,除了每隔一段时间(我浪费了一点时间试图弄清楚但从未到达任何地方)它会生成从目标到目标的路径播放器。为了“修复”这个问题,我最终只检查了路径数组中的第一个 X/Y 值,如果这些值与我的玩家角色的 X/Y 值不匹配,则反转数组。
public function bresenham(fromX:int, fromY:int, toX:int, toY:int, value:int):Array
{
// store the character's location
var orig_x:int = fromX;
var orig_y:int = fromY;
var error:int;
var bullet_path:Array = new Array;
var dx:int = toX - fromX;
var dy:int = toY - fromY;
var yi:int = 1;
if ( dx < dy ) {
// swap end points
fromX ^= toX; toX ^= fromX; fromX ^= toX;
fromY ^= toY; toY ^= fromY; fromY ^= toY;
}
if ( dx < 0 ) {
dx = -dx;
yi = -yi;
}
if ( dy < 0 ) {
dy = -dy;
yi = -yi;
}
if ( dy > dx ) {
error = -( dy >> 1 );
for ( ; toY < fromY; toY++ ) {
bullet_path.push( { 'x' : toX, 'y': toY } );
error += dx;
if ( error > 0 ) {
toX += yi;
error -= dy;
}
}
} else {
error = -(dx >> 1);
for ( ; fromX < toX; fromX++ ) {
bullet_path.push( { 'x' : fromX, 'y': fromY } );
error += dy;
if ( error > 0 ) {
fromY += yi;
error -= dx;
}
}
}
// reverse the bullet path if it was generated from target to player.
if ( bullet_path[0].x != orig_x && bullet_path[0].y != orig_y ) {
return bullet_path.reverse();
}
return bullet_path;
}