|
|
|||||||
| Регистрация | Справка | Пользователи | Социальные группы | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
#281 | ||||
|
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
в общем почитываю тему. имхо, использование инженерного подхода и качественных источников делает етот мод весьма привлекательным для реализации. я бы его включил в свой реал пак
![]() в чем конкретно проблемы с реализацией? что нужно конкретно сделать для реализации? типовые данные о бомбе: Цитата:
Цитата:
![]() данные о бомбах нужны? Цитата:
![]() Цитата:
|
||||
|
|
|
|
|
#282 |
|
Местный
Регистрация: 29.11.2009
Сообщений: 649
|
|
|
|
|
|
|
#283 |
|
Звуковых дел мастер
|
Ага, а помимо того чтобы ввести пару констант, нужно полностью изменять физ модель взрыва в игре... что мне кажется и сильно повлияет на воздействие ОФЗ на самолеты....
Мое имхо, проще отработать то что есть. Ебо мусолить формулы это одно, а практически реализовать - совершенно другое. P.S. Трудно картинку в джепег пережать?
__________________
Апдейты на мод можно проверить здесь http://www.mediafire.com/?sharekey=3...129846a9fea912 Последний раз редактировалось SG2_Wasy; 09.02.2010 в 14:37. |
|
|
|
|
|
#284 | |
|
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
Цитата:
именно этот параметр и отвечает за тип бомбы, насколько я помню. Существующих параметров вполне хватит, не надо ничего добавлять углублять и расширять! Изменение ДМ объектов - совершенно другая тема, хотя и зависимая. Если мы сумеем ввести в формулы тип бомбы, то вполне реально подогнать юомбы ближе к правильной зависимости. Заметьте - я говорбю о зависимости, а не реальных параметрах поражения. В общем хорошо бы, чтоб толковый перец свел в одну кучу всё что обсчитывается сейчас в игре. Чтоб знать от чего оттолкнутся. Последний раз редактировалось JGr124_boRada; 09.02.2010 в 14:46. |
|
|
|
|
|
|
#285 | |
|
Звуковых дел мастер
|
Цитата:
Просто взрыв Взрыв с долгим дымом (АЖ-2) Взрыв с пламенем.
__________________
Апдейты на мод можно проверить здесь http://www.mediafire.com/?sharekey=3...129846a9fea912 |
|
|
|
|
|
|
#286 | |
|
Местный
Регистрация: 29.11.2009
Сообщений: 649
|
Цитата:
|
|
|
|
|
|
|
#287 |
|
Звуковых дел мастер
|
Нету это ничего в игре, НЕТУ.
__________________
Апдейты на мод можно проверить здесь http://www.mediafire.com/?sharekey=3...129846a9fea912 |
|
|
|
|
|
#288 |
|
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
http://forum.aviaskins.com/showpost....4&postcount=46
Это формулы из игры по крайней мере в них не использован тип бомбы. А если ввести одну переменную=тип бомбы? Расчет будет идти так же по энергии, но её распределение можно в некоторых пределах регулировать. Например для домов тип=0 ( фугас) имеет коэффициент 1, а тип=1( осколочные) 0.5 Для пушек и машин - наоборот. Это очень упрощенно но уже действенно и безболезненно для процессора и программирования. Последний раз редактировалось JGr124_boRada; 09.02.2010 в 15:08. |
|
|
|
|
|
#289 |
|
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
Борада, а из каких классов ты ети формулы то выдрал?
про паур тайп гляну... |
|
|
|
|
|
#290 |
|
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
|
|
|
|
|
|
#291 |
|
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
тэкс, посмарел цепочку.
в общем бомба летит летит летит и встречаеться с землей. происходят всякие перетурьации, и запускаеться вот что Код:
protected void doExplosion(Actor actor, String s, Point3d point3d) {
/* 250*/ Class class1 = getClass();
/* 251*/ float f = Property.floatValue(class1, "power", 1000F);
/* 252*/ int i = Property.intValue(class1, "powerType", 0);
/* 253*/ float f1 = Property.floatValue(class1, "radius", 150F);
/* 254*/ MsgExplosion.send(actor, s, point3d, getOwner(), M, f, i, f1);
/* 256*/ ActorCrater.initOwner = getOwner();
/* 257*/ Explosions.generate(actor, point3d, f, i, f1);
/* 258*/ ActorCrater.initOwner = null;
/* 260*/ destroy();
}
нас интересует MsgExplosion.send вот он: Код:
{
00024 explosion.chunkName = s;
00025 explosion.p.set(point3d);
00026 explosion.radius = f2;
00027 explosion.initiator = actor1;
00028 explosion.power = f1;
00029 explosion.powerType = i;
00030 if(i == 1)
00031 explosion.computeSplinterParams(f);
00032 if(!Actor.isValid(actor1) && Mission.isSingle() && (Mission.cur().netObj() == null || Mission.cur().netObj().isMaster()))
00033 explosion.initiator = actor1 = Engine.actorLand();
00034 if(!Actor.isValid(actor1))
00035 return;
00036 if(actor1.isNet() && actor1.net.isMirror())
00037 return;
00038 if(Actor.isValid(actor))
00039 {
00040 msg.setListener(actor);
00041 msg.send();
00042 }
00043 if(f2 <= 0.0F)
00044 return;
00045 Engine.collideEnv().getSphere(lst, point3d, f2);
00046 int j = lst.size();
00047 if(j <= 0)
00048 return;
00049 explosion.chunkName = null;
00050 for(int k = 0; k < j; k++)
00051 {
00052 Actor actor2 = (Actor)lst.get(k);
00053 if(Actor.isValid(actor2) && actor != actor2)
00054 {
00055 msg.setListener(actor2);
00056 msg.send();
00057 }
00058 }
00059
00060 lst.clear();
00061 }
выделено- там где powertype 1 запускаеться 1 лишний метод(условно моно перевести как "пересчет осколков", т.е. вычисление кол-ва осколков. так что есть разделение )правда пока неизвестно, рассчитываеться ли повреждение от осколков...мб ето токо заготовка ![]() а вот собсна сам код взырвов: Код:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
00002 // Jad home page: http://www.kpdus.com/jad.html
00003 // Decompiler options: packimports(3)
00004 // Source File Name: Explosion.java
00005
00006 package com.maddox.il2.ai;
00007
00008 import com.maddox.JGP.Point3d;
00009 import com.maddox.il2.engine.*;
00010
00011 // Referenced classes of package com.maddox.il2.ai:
00012 // World, RangeRandom
00013
00014 public class Explosion
00015 {
00016
00017 public Explosion()
00018 {
00019 p = new Point3d();
00020 }
00021
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 }
00035
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 }
00049
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 }
00066
00067 public boolean isMirage()
00068 {
00069 if(!Actor.isValid(initiator))
00070 return true;
00071 else
00072 return initiator.isNetMirror();
00073 }
00074
00075 public float receivedPower(ActorMesh actormesh)
00076 {
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 }
00089
00090 public float receivedTNT_1meter(float f)
00091 {
00092 if(f >= radius)
00093 return 0.0F;
00094 if(f < 1.0F)
00095 return power;
00096 else
00097 return power / (f * f);
00098 }
00099
00100 public float receivedTNT_1meter(Point3d point3d, float f)
00101 {
00102 float f1 = (float)point3d.distance(p) - f;
00103 return receivedTNT_1meter(f1);
00104 }
00105
00106 public float receivedTNT_1meter(ActorMesh actormesh)
00107 {
00108 float f = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p) - actormesh.collisionR();
00109 return receivedTNT_1meter(f);
00110 }
00111
00112 public float receivedTNTpower(ActorMesh actormesh)
00113 {
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 }
00125
00126 public static boolean killable(ActorMesh actormesh, float f, float f1, float f2, float f3)
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 }
00141
00142 public static final int POWER_SPLASH = 0;
00143 public static final int POWER_SPLINTERS = 1;
00144 public static final int POWER_NAPALM = 2;
00145 public static final float SPLINTER_MASS = 0.015F;
00146 private static final float SPLINTERS_K = 0.9F;
00147 public String chunkName;
00148 public Point3d p;
00149 public float radius;
00150 public Actor initiator;
00151 public float power;
00152 public int powerType;
00153 private float nSplinters;
00154
00155 }
собсна вот ото всего вот етого можете отталкиваеться...вот формулы моделирования взрыва в игре...сами формулы моно если что подрихтовать ![]() исходя из этого и стоитпересчитывать пармеетры бомб ![]() по воводу добавлений. скажу сразу, ето можно делать только В КРАЙНЕМ случае, если ето координально меняет картину. ибо сделать можно, но работы много( грю про ся, мб программер опытнее лучше сделает) Последний раз редактировалось ZloyPetrushkO; 09.02.2010 в 16:59. |
|
|
|
|
|
#292 |
|
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
и еще...учтите, что если рихтовать формулы, то эффект будет для ВСЕХ взрывов
![]() ----- а Борада как раз скинул пост с цитатами, объясняющими действие етих формул. вот такие дела
Последний раз редактировалось ZloyPetrushkO; 09.02.2010 в 16:57. |
|
|
|
|
|
#293 |
|
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
ыыы.. а в человеческий язык можно перевести? А то я не врубаюсь что такое f а что f1 и прочее.....
Сами формулы работают то достаточно нормально, не надо их менять. А менять исходные данные. Ну и желательно всеж разделить осколочные, если этого нет. Последний раз редактировалось JGr124_boRada; 09.02.2010 в 17:27. |
|
|
|
|
|
#294 |
|
Местный
Регистрация: 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 }
вот такие вот дела) в общем случае, идет расчет дамага(либо от осколков, либо от фугаса), потом он вычитаеться из лайфбара объекта ![]() иногда добавляетья еще область, в которой поражение зависит от рандома ![]() вот тако оно собсна рассчитывает...теперь зная ети формулы и способы вычисления осталось просчитать исходные параметры так, чтобы получалось похоже на нужный результат ![]() или если совсем косяки в формулах-подрихтовать формулы ![]() токо помните, что рихтовка формул отразиться на всех объектах данного типа! вводить новые параметры бомб, ровно как и менять типа объектов низя. |
|
|
|
|
|
#295 |
|
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
итого...порядок причесывания имхо сводиться к такому.
1)знаем данные о реальных бомбах 2) вычисляем данные о эффекте РЕАЛЬНЫХ бомб 3) берем какую либо точку в зоне поражения, и сравниваем отношение эффекта от 2 бомб в реале. запоминаем ето отношение 4) берем данные о игровых бомбах, по формулам считаем дамаг для какогонибудь случая. например для авто. далее берем отношение етих дамагов в точке для двух бомб 5) сравнениваем отношение дамагов к отношению эффективности 6) если большое различие- правим игровые исходные данные, что различие уменьшилось. вот так ![]() мое имхо
|
|
|
|
|
|
#296 | |
|
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
Чудненько! Спасибо за перевод! Думаем....
Цитата:
|
|
|
|
|
|
|
#297 |
|
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
Вопрос, а при расчете осколков что передается функции
void computeSplinterParams(float f) PS Предварительный просмотр показывает, что достаточно тщательно просчитывается действие бомб ( лучше чем я ожидал). Теперь точно уверен что добавлять ничего ненадо. Единственно, есть одна хотелка - внести небольшую зависимость от задержки взрывателя ( а может уже и есть?) Последний раз редактировалось JGr124_boRada; 09.02.2010 в 20:01. |
|
|
|
|
|
#298 |
|
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
|
|
|
|
|
|
#299 |
|
Местный
Регистрация: 19.02.2009
Сообщений: 450
|
Почему, поясню.
При задержке близкой к нулю осколочные будут наиболее эффективны ( не зарываются в грунт - соответственно настильность осколков лучше) Соответственно если хотите наибольшую эффективность, забудьте от бомбежке с 5 м высоты. Иначе ставим 3-5 секунды ( как сейчас) и спокойно кидаем гладя цель брюхом. Согласен, это уже десятое дело, но если вдруг такое получится простым способом - это будет плюс. С другой стороны - при такой высоте (5-50м) будут ли в реале бомбы зарываться в грунт? Когда вертикальная скорость ниже горизонтальной |
|
|
|
|
|
#300 | |
|
Местный
Регистрация: 31.05.2008
Сообщений: 1,159
|
Цитата:
но н едумаю что ето получиться просто. поясню: т.к. бомба и взрыв находятся в разных классах(а мб и в разных ветках) нужно будет налаживать передачу параметра bombdelay оно того не стоит... другой вопрос, что мб там уже передаеться bombdelay - то можно. хуже не будет
|
|
|
|
|
![]() |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|