Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2013, 01:55   #1
Serg-Grin
Дивиджей
Пользователь
 
Аватар для Serg-Grin
 
Регистрация: 05.01.2009
Сообщений: 84
По умолчанию Навык ловкости в игре

Доброго времени суток!
Как реализовать вычисление ловкости, тойсть промаха мобов. Например, при бое с мобом, взависимости от навыка ловкости персонажа и моба, чтобы моб по случайности промахнулся по персонажу! Очень хотелось бы узнать как можно это реализовать.
Впишите в google:
DVJ Serg-Grin
И вы услышите мои песни
Serg-Grin вне форума Ответить с цитированием
Старый 03.12.2013, 06:47   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Зависит от желаемого поведения. Но в любом случае придётся использовать Random
Можно сделать фиксированный шанс на каждую единицу разницы ловкостей, тогда
Код:
const ChanceDelta = 3;
var DextDelta: integer;
DextDelta := (Player.Dexterity - Mob.Dexterity) * ChanceDelta;
Result := Random(100) + 1 < DextDelta;
Если случайное число меньше разницы ловкостей (DextDelta), умноженной на коэффициент, то итог - промах. Но тут не учтена возможность отрицательной разницы ловкостей (моб круче игрока) и большой разницы (игрок сильно круче моба, и дальнейший рост не даёт ничего).
Можно ориентироваться на пороговые значения, т.е. предел максимума и минимума параметра и приводить к ним процент вместо коэффициента
Код:
const MinDext = 5;
const MaxDext = 85;
DextDelta := (Player.Dexterity - Mob.Dexterity) * 100 / (MaxDext - MinDext);
В этом случае учтён вопрос крутости игрока (игрок всё равно ограничен максимумом, который и учтён формулой), но не вопрос крутости монстра.
Добавить учёт крутости монстра можно отдельно, например, увеличить урон, или не делать ничего и брать за минимальную разницу 0 - т.е. в случае крутости монстра считаем, что шанс промаха всегда один - 0% или любой другой, который захотите, получая минимальный возможный шанс.
Тогда формулу надо модифицировать
Код:
Random(100) + 1 < Max(MinChance, DextDelta)
Берётся одно из 2 чисел, в зависимости от того, которое больше - либо вычисленная по одной из формул разница ловкостей, либо константа MinChance - если разница меньше мин. шанса, то будет взят в расчёт мин. шанс (как больший по результату работы функции Max)
Можно добавить Максимальный шанс срабатывания события (в данном случае промах-попадание), как в диабло2, например - 95%.
Код:
Min(Max(MinChance, DextDelta), MaxChance)
Тут выберется минимальное из рассчитанной разницы и константы MaxChance что даст ограничение на итоговую вероятность. Или же использовать
Код:
Clamp(DextDelta, MinChance, MaxChance) // Clamp - общеупотребительное название, в дельфи EnsureRange
Дополнительно, по желанию, можно усложнить выбор случайного числа, убрав обычный Random который даёт равномерное распределение и заменив его на гауссово (нормальное) распределение (RandG из модуля Math в случае с дельфи), которое возможно контролировать за счёт среднего значения и стандартного отклонения, но в этом случае формулы сильно усложнятся, в том числе если само распределение параметризовать характеристиками моба и перса, например рубящий удар мечом по кожаному доспеху имеет большее стандартное отклонение ввиду деформируемости доспеха и место удара (как раз то, что моделируем рандомом, в случае модели повреждений без учёта зон) сильно влияет на итоговый урон. Латный же доспех имеет очень маленькое отклонение, т.к. не деформируется и удар мечом будет почти всегда иметь результат подобный удару палицы - дробящий урон, и напрямую зависит от силы удара а не от места удара или ловкости.
Но это сложная модель Лучше сперва реализовать простую (но желательно так, чтобы модель была отдельной подсистемой и можно было легко заменить при необходимости другой, без необходимости переписывать другой код) и поглядеть в деле, если устроит, то незачем воротить сложнее.

Последний раз редактировалось phomm; 03.12.2013 в 06:59.
phomm вне форума Ответить с цитированием
Старый 16.01.2014, 00:12   #3
studen
Пользователь
 
Регистрация: 21.05.2012
Сообщений: 88
По умолчанию

Код:
bool  Attack( int AttDexterity,  int DefDextrity,  int BaseHitChance )
{
    int dice  =  random( 101 );
//  0..100
    return  dice < BaseHitChance+AttDexterity+DefDexterity;
}
AttDexterity - ловкость атакующего,
DefDexterity - ловкость атакуемого,
BaseHitChance - базовый шанс попадания для типа атаки, если он равен 0, то при равной ловкости будет 50% попаданий.

Насколько я понимаю, на урон ловкость не влияет, лишь на шанс попасть.
Я надеюсь, формула не будет применяться для атак по области, ведь нельзя уклониться от метеорита, стоя на месте.
studen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Жизни в игре glebast Помощь студентам 11 18.05.2012 01:10
многопоточность в игре sinestro Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 15.03.2012 05:03
Бан в игре Abuhamed Компьютерное железо 0 09.03.2012 14:31
подредактировать античит к игре игре Nhl 09 (античит написан на дельфи) Viper18 Фриланс 3 03.08.2011 17:37
Звук в игре. Abuhamed JavaScript, Ajax 7 18.04.2011 22:38