箱や他のカバーの後ろに隠れているキャラクターへのダメージを少なくする方法で2D爆発を実装するにはどうすればよいですか?理想的には、損傷はカバーの強度に依存します(たとえば、金属製の壁は木製の箱よりも保護されます)。理想的には、距離とともにダメージも減少します。
Box2D物理エンジンのポート-Farseerを使用します。
ありがとうございました。
箱や他のカバーの後ろに隠れているキャラクターへのダメージを少なくする方法で2D爆発を実装するにはどうすればよいですか?理想的には、損傷はカバーの強度に依存します(たとえば、金属製の壁は木製の箱よりも保護されます)。理想的には、距離とともにダメージも減少します。
Box2D物理エンジンのポート-Farseerを使用します。
ありがとうございました。
回答:
これを行う比較的単純な方法の1つは、爆発の中心からすべてのエンティティの中心に光線を描画することですDISTANCE(explosion,entity) < exlosion.max_radius
(疑似コード)。
エンティティごとに、この光線に従い、基本ダメージを減らします。オブジェクトを打つたびに、ダメージからカバー値を差し引きます(本質的に光線を短くします)。
光線がエンティティに当たると、残っているダメージは爆発ダメージになります。
このアプローチでは、おそらく、距離とともに急激に減少するかなり高いベースダメージが必要になります(距離の2乗に反比例してうまくいくはずです)。
別のアプローチは、エンティティを完全に含むセクターを描画することです。しかし、広くはありません。そしてに至るまで.max_radius
。このセクターの面積から、爆発とエンティティの間のカバーで覆われている面積に、カバー値を掛けます。残りの領域は爆風によるダメージです。
これの1つのきちんとした副作用は、エンティティが爆発に近づくほど、セクターが広くなり、受けるダメージが大きくなることです(セクターのすべての領域をカウントし、実体と爆発。
カバーをエンティティとして扱うことも有用です。そして、より近いエンティティによって受けたダメージを、より遠いものから差し引くだけですが、それは危険なことになるかもしれません。
間違いなくもっとエレガントで賢いアプローチが存在しますが、おそらくかなり厄介な計算が必要です。常にそうです。
距離とともにダメージが減少するのは簡単なことです。爆発を作成するときは、爆発の中心の座標を知っている必要があります。2dで作業しているので、xとyだけになります。
あなたがする必要があるのは、ピタゴラスの定理を使用して爆発の中心の座標からプレーヤーの距離を計算し、それを最大半径に対して使用して、合計ダメージのパーセンテージを計算することです。
たとえば、座標(x1、y1)を説明の中心点とし、(x2、y2)をプレイヤーの座標とします。その後、次のようにして受けるダメージを計算できます。
Distance from centre = sqrt((x2-x1)² + (y2-y1)²)
Damage taken = (Distance from centre/Explosion radius) * max damage
物事に関しては、私は答えがわからないので疲れていますが、基本的には爆発の中心からプレーヤーまでの線に沿った交差点を探します。