したがって、私のゲームでは、5x5 (およそ) のスプライトを使用して、高速で移動する Bullet オブジェクトがあります。約 30 の速度で移動し、厚さがわずか約 5 ピクセルの比較的薄い敵オブジェクトに衝突する必要があります。一定の距離間隔で、弾丸は衝突せずに敵を通過します。
弾丸が非常に速く動いているため、たまたま敵を「ジャンプ」したため、一定の間隔になっていると思います。弾丸または敵の幅を広げる以外に、衝突が適切に検出されることを保証する方法はありますか?
したがって、私のゲームでは、5x5 (およそ) のスプライトを使用して、高速で移動する Bullet オブジェクトがあります。約 30 の速度で移動し、厚さがわずか約 5 ピクセルの比較的薄い敵オブジェクトに衝突する必要があります。一定の距離間隔で、弾丸は衝突せずに敵を通過します。
弾丸が非常に速く動いているため、たまたま敵を「ジャンプ」したため、一定の間隔になっていると思います。弾丸または敵の幅を広げる以外に、衝突が適切に検出されることを保証する方法はありますか?
スプライトがジャンプする領域をテストします。
そのため、コリジョン ボックスについては、弾丸の前の最も前方の位置から新しい最も前方の位置までテストします。弾丸が右に動いている場合:
bullet.collisionbox.x = bullet.x
bullet.colisionbox.y = bullet.y
bullet.collisionbox.width = bullet.x + bullet.width + newpos.x
bullet.collisionbox.height = bullet.height
グラフィカルに:
>[____________>]
したがって、弾丸や敵の幅を広げるのではなく、弾丸と敵の衝突検出だけを増やします。
この問題には、次のような多くの解決策があります。
a)move_contact_...
弾丸を移動するための関数の使用
b)lengthdir_
次のような関数と手動の衝突チェックを使用して、弾丸をループ内で移動します。
var i;
for (i = sprite_width; i <= speed; i += sprite_width)
{
if place_meeting(x + lengthdir_x(i,direction), y + lengthdir_y(i,direction), o_wall) // is a wall in this position?
{
x += lengthdir_x(i, direction); // moving to position of the collision
y += lengthdir_y(i, direction);
event_perform(ev_collision, o_wall); // call collision event
}
}
c)collision_line
位置変更後の使用などif collision_line(x, y, xprevious, yprevious, obj, false, true)!=noone { ... }
と他の多くの...
衝突が確実に検出されるように、弾丸の速度を 4 以下に下げることができます。また、スプライトを大きくしなくても、エンドの後ろの弾丸の衝突マスクを増やすことができます。弾丸のマスク幅を 2 倍にすると、弾丸の最大速度を 9 にすることができます。
あなたの問題は、弾丸の動きが速すぎることです。弾丸は実際には空間を移動していません。したがって、弾丸の x 速度をゲーム ループのたびに 5 に設定すると、弾丸は 5 ピクセル上に再描画されます。弾丸の速度が 30 の場合、実際にはそれらのピクセルを通過せずに 30 ピクセル上に再描画されます。敵が 2 つの場所の間にいる場合、弾丸が引き寄せられ、弾丸が衝突することはありません。
このことを考慮。あなたの敵は位置 (5, 5) にあり、5x5 の正方形です。あなたの弾丸は (0, 7) の位置から来ています。1 ピクセルの大きさです。弾丸が x 方向に 20 ピクセルの速度で移動する場合、弾丸は (0, 7) に描画され、次に (20, 7) に描画されます。それらの場所のどちらも敵と交差しません。
弾丸を遅くするか、弾丸スプライトのサイズを変更することをお勧めします。弾丸のスプライトはまだ小さなペレットで、残りのスプライトは透明のままにしておくことができます。弾丸の衝突ボックスを大きくするようなものです。
お役に立てれば :)
Flash では、HitTest メソッドを使用して、オブジェクトが別のオブジェクトと衝突するかどうかをテストします。ヒットが true になったときに弾丸の方向、速度、または外観を変更するコードを追加する必要がある衝突があると思います。それは通過しますヒット イベントが発生したときにオブジェクトのプロパティを変更するためのコードがない場合、オブジェクトがヒット/接触したとしても、オブジェクト
また
弾丸と移動オブジェクトの領域をテストできます
IF (AreaofBullet=AreaofMovingobject)
Change The Appearance, properties of the bullets and the object
else
Do nothing
お役に立てれば
ありがとう :)