私は単純な2dゲームに取り組んでいます。多くの敵が引き続きプレイヤーやプレイヤーをpython + pygameで追いかけています。私が遭遇した問題と、この種のゲームをプログラムした多くの人々が遭遇したのは、敵が非常に迅速に収束するということです。私は、互いに近づけすぎると2つの敵をランダムに押し離す機能を使ってこの問題を一時的に解決しました。これは正常に機能しますが、すべてのフレームで実行されるO(n^2)アルゴリズムと、プログラムが遅くなり始める高い敵についてです。一度に多くの敵を指揮する
私のプログラムがこの機能で動作するとき、敵は丸いオブジェクトを形成しているように見えます。塊は通常は黄道のように見えるが、プレイヤーが移動するにつれて敵が異なる方向に引っ張られるため、実際にはより複雑(対称ではない)である可能性がある。私は、このクランプが動作する方法が好きですが、それを計算するより効率的な方法があるかどうか疑問に思っています。現在、塊(しばしば> 100)内のすべての敵は、最初にプレイヤーの方向に移動され、次に離されます。代わりに、クランプが作成する図形を計算する方法があった場合、それがどのように動くかによって多くの計算量が節約されます。
私はこの問題にどのように接近するのか正確にはわかりません。図形の境界線がどこに移動するかを計算し、展開して領域が同じであることを確認することができます。
また、現在の敵を移動するために使用されている私の二つの機能:
def moveEnemy(enemy, player, speed):
a = player.left-enemy.left
b = player.top-enemy.top
r = speed/math.hypot(a,b)
return enemy.move(r*a, r*b)
def clump(enemys):
for p in range(len(enemys)):
for q in range(len(enemys)-p-1):
a = enemys[p]
b = enemys[p+q+1]
if abs(a.left-b.left)+abs(a.top-b.top)<CLUMP:
xChange = (random.random()-.5)*CLUMP
yChange = ((CLUMP/2)**2-xChange**2)**.5
enemys[p] = enemys[p].move(int(xChange+.5), int(yChange + .5))
enemys[p+q+1] = enemys[p+q+1].move(-int(xChange+.5),-int(yChange+.5))
return enemys
編集:塊がどのように見えるかのいくつかのスクリーンショット: http://imageshack.us/photo/my-images/651/elip.png/ http://imageshack.us/photo/my-images/ 832/newfni.png/
http://imageshack.us/photo/my-images/836/gamewk.png/
塊は(Eclipseのようなしかし、複数の方向に延伸してもよい)大部分だけ延伸丸い物体であると思われる、しかし、それは、電流増幅率長方形の敵のためにまっすぐなエッジがありません。
範囲のコードはどうですか?距離チェックをしていますか?これは、非常に多くのユニットにとって高価になります。 –
また、すべてのフレームではなく、むしろXフレームごとにこれを実行してください。私は同様の方法でこの同じ問題を解決しましたが、いくつかの重なりを許しました。大量の群れがより危険に見えるようになります! –
ここで得られる回答の質によっては、http://gamedev.stackexchange.com/で質問することもできます。 –