Показать сообщение отдельно
Старый 09.02.2010, 18:28   #294
ZloyPetrushkO
Местный
 
Регистрация: 31.05.2008
Сообщений: 1,159
По умолчанию

тэкс) а теперь вторая часть алгоритма просчета))


в общем, в представленном выше коде для каждого объекта есть своя модель взрыва. соотвественно, после запуска взрыва для каждого объекта вызываеться свой расчет повреждений и по ней ведеться расчет.
если бомба осколочная, и объект чувтсивтелен: а ето танки,дома, самолеты к осколкам сначала идет расчет осколков вот по такому коду:

количество осколков:
Код:
00022     void computeSplinterParams(float f)
00023     {
00024         float f1 = f * 0.9F;
00025         nSplinters = f1 / 0.015F;
00026         if(nSplinters < 0.5F)
00027         {
00028             nSplinters = 0.0F;
00029             return;
00030         } else
00031         {
00032             return;
00033         }
00034     }
скорость осколков:
Код:
00036     public float computeSplinterSpeed(float f)
00037     {
00038         if(f <= 0.01F)
00039             return 650F;
00040         if(f >= radius)
00041         {
00042             return 150F;
00043         } else
00044         {
00045             float f1 = f / radius;
00046             return 650F * (1.0F - f1) + 150F * f1;
00047         }
00048     }

само поражение от осколков:
Код:
00050     public void computeSplintersHit(Point3d point3d, float f, float f1, float af[])
00051     {
00052         float f2 = (float)point3d.distance(p) - f;
00053         if(f2 <= 0.001F)
00054         {
00055             af[0] = nSplinters * 0.5F;
00056             af[1] = computeSplinterSpeed(f2);
00057         }
00058         float f3 = 3.141593F * f * f;
00059         float f4 = 12.56637F * f2 * f2;
00060         float f5 = (nSplinters * f3) / f4;
00061         if(f5 >= nSplinters * 0.5F)
00062             f5 = nSplinters * 0.5F;
00063         af[0] = f5;
00064         af[1] = computeSplinterSpeed(f2);
00065     }

еще есть для некоторых типов радиус, в котором возможно поражение. он называеться вот так, и рбаотает тоже так:
Код:
static boolean com.maddox.il2.ai.Explosion.killable  	(  	ActorMesh   	 actormesh,
		float  	f,
		float  	f1,
		float  	f2,
		float  	f3	 
	) 			[static]

Definition at line 126 of file Explosion.java.

00127     {
00128         float f4 = f;
00129         if(f4 <= f1)
00130             return false;
00131         if(f4 >= f2)
00132         {
00133             return true;
00134         } else
00135         {
00136             float f5 = (f4 - f1) / (f2 - f1);
00137             f3 += (1.0F - f3) * f5;
00138             return World.Rnd().nextFloat(0.0F, 1.0F) < f3;
00139         }
00140     }

теперь поехали по типам...

Здания:
расчет:
Код:
{
00077         float f = actormesh.collisionR();
00078         float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p);
00079         f1 -= f;
00080         if(f1 >= radius)
00081             return 0.0F;
00082         float f2 = 1.0F - f1 / radius;
00083         f2 *= f2;
00084         if(f2 >= 1.0F)
00085             return power;
00086         else
00087             return f2 * power;
00088     }
условие умиранияот фугасок:
Код:
if(Explosion.killable(this, explosion.receivedPower(this), prop.MIN_TNT, prop.MAX_TNT, prop.PROBAB_DEATH_WHEN_EXPLOSION))
00498                 die(explosion.initiator, true);
00499             return;
условие умирания от осколочных бомб:
Код:
float af[] = new float[6];
00480             mesh().getBoundBox(af);
00481             pos.getAbs(p);
00482             p.x = (p.x - (double)af[0]) + (double)(af[3] - af[0]);
00483             p.y = (p.y - (double)af[1]) + (double)(af[4] - af[1]);
00484             p.z = (p.z - (double)af[2]) + (double)(af[5] - af[2]);
00485             float af1[] = new float[2];
00486             explosion.computeSplintersHit(p, mesh().collisionR(), 0.7F, af1);
00487             Explosion _tmp1 = explosion;
00488             float f = 0.015F * af1[1] * af1[1] * 0.5F;
00489             float f1 = ComputeProbabOfPenetrateKill(f, (int)(af1[0] + 0.5F));
00490             if(RndB(f1))
00491                 die(explosion.initiator, true);

-------


для поездов, людей, кораблей, ракетной артиллерии(катюш чтоли?), парашютистов, мостов и самолетов: вот етот расчет(если я прально понял)

Код:
{
00092         if(f >= radius)
00093             return 0.0F;
00094         if(f < 1.0F)
00095             return power;
00096         else
00097             return power / (f * f);
00098     }
условие умирания(на примере корабля)
Код:
float f = explosion.power;
00675             Explosion explosion1 = explosion;
00676             if(explosion.powerType == 2 && explosion.chunkName != null)
00677                 f *= 0.45F;
00678             float f1;
00679             if(explosion.chunkName != null)
00680             {
00681                 float f2 = f;
00682                 f2 *= Rnd(1.0F, 1.1F);
00683                 if(f2 < prop.stre.EXPLHIT_MIN_TNT)
00684                     return;
00685                 f1 = f2 / prop.stre.EXPLHIT_MAX_TNT;
00686             } else
00687             {
00688                 float f3 = explosion.receivedTNT_1meter(this);
00689                 f3 *= Rnd(1.0F, 1.1F);
00690                 if(f3 < prop.stre.EXPLNEAR_MIN_TNT)
00691                     return;
00692                 f1 = f3 / prop.stre.EXPLNEAR_MAX_TNT;
00693             }
00694             life -= f1;
00695             if(life <= 0.0F)
00696                 Die(explosion.initiator, -1L, true);
00697         }

------
для танков,артиллерии,машин, самолетов и статических юнитов
вот ето:

Код:
{
00114         float f = actormesh.collisionR();
00115         float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p) - f;
00116         if(f1 <= 0.0F)
00117             return 0.5F * power;
00118         float f2 = 1.0F / (float)Math.pow(f1, 1.2000000476837158D);
00119         if(f2 <= 0.0F)
00120             return 0.0F;
00121         if(f2 >= 0.5F)
00122             f2 = 0.5F;
00123         return f2 * power;
00124     }

условие умирания на прмиере танка:
от осколочных:
Код:
 
00902             int i = explosion.powerType;
00903             if(explosion == null);
00904             if(i == 1)
00905             {
00906                 if(splintersKill(explosion, prop.fnShotPanzer, Rnd(0.0F, 1.0F), Rnd(0.0F, 1.0F), this, 0.7F, 0.25F, prop.PANZER_BODY_FRONT, prop.PANZER_BODY_SIDE, prop.PANZER_BODY_BACK, prop.PANZER_BODY_TOP, prop.PANZER_HEAD, prop.PANZER_HEAD_TOP))
00907                     Die(explosion.initiator, false);
00908             }

от остальных бомб:
Код:
else
00909             {
00910                 int j = explosion.powerType;
00911                 if(explosion == null);
00912                 if(j == 2 && explosion.chunkName != null)
00913                 {
00914                     Die(explosion.initiator, false);
00915                 } else
00916                 {
00917                     float f;
00918                     if(explosion.chunkName != null)
00919                         f = 0.5F * explosion.power;
00920                     else
00921                         f = explosion.receivedTNTpower(this);
00922                     f *= Rnd(0.95F, 1.05F);
00923                     float f1 = prop.fnExplodePanzer.Value(f, prop.PANZER_TNT_TYPE);
00924                     if(f1 < 1000F && (f1 <= 1.0F || RndB(1.0F / f1)))
00925                         Die(explosion.initiator, true);
00926                 }
00927             }


вот такие вот дела)
в общем случае, идет расчет дамага(либо от осколков, либо от фугаса), потом он вычитаеться из лайфбара объекта
иногда добавляетья еще область, в которой поражение зависит от рандома


вот тако оно собсна рассчитывает...теперь зная ети формулы и способы вычисления осталось просчитать исходные параметры так, чтобы получалось похоже на нужный результат
или если совсем косяки в формулах-подрихтовать формулы
токо помните, что рихтовка формул отразиться на всех объектах данного типа!
вводить новые параметры бомб, ровно как и менять типа объектов низя.
ZloyPetrushkO вне форума   Ответить с цитированием