私は ActionScript 3 をいじっており、ビデオ ゲーム (トップダウン アクション/シューティング) の非常に単純なプロトタイプを構築しようとしていますが、弾丸の処理は当初想像していたよりも少し難しいことに気付きました。
キャラクターとターゲットの間の弾丸のかなり適切な「飛行」を得るために、最終的にはブレゼンハムのライン アルゴリズムの高度に修正されたバージョンを使用して弾丸の飛行経路を決定し、小さな flash.geom を描画するだけになりました。アプリケーションの描画フレーム段階で、その「飛行経路」上の適切な場所に Rectangle オブジェクト。
私は実際の問題に気づいていませんが、これが 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;
}