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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2012, 18:03   #11
EridorBlade
CAE Engineer
Пользователь
 
Аватар для EridorBlade
 
Регистрация: 10.03.2011
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
EridorBlade
Не вдаваясь в подробности кода, скажи ка, какие именно данные персонажа в твоей модели идут под сохранение в файл? ...те, что касаются опыта.
В файл я записываю только значение ExpResult - текущее количество опыта.
Моей целью было уменьшить количество элементов записываемых в сохраняемый файл. Это лично мне показалось более удобным. Но сразу могу сказать, что это приводит к некоему математическому изнасилованию компьютера .
Ладно, раз уж автор не появляется, напишу для тех кому будет это интереснее. Когда я загружаю данные, я беру только текущее значение опыта ExpResult. Из него я рассчитываю значение уровня персонажа.
Как я описывал выше
Coeff_Inc - коэффициент прироста опыта.
Сразу хочу отметить одно условие, что Coeff_Inc>1
ExpBasic - базовое значение опыта.
ExpBasic >0
Значения этих переменных задаются в программе.
Так вот ExpMax это ни что иное как
ExpMax=ExpBasic *Coeff_Inc*Coeff_Inc*....*Coeff_Inc
то есть ExpMax это ExpBasic умноженное на Coeff_Inc
N раз, то есть ExpMax=ExpBasic *Coeff_Inc^N;

А это значит, что LvlResult=N+1. Здесь добавляется единица потому, что базовое значение опыта задается для второго уровня.
ExpMax - монотонно возрастающая функция.
Untitled.jpg

Осталось определить N. Путем простых преобразований мы получаем
LvlResult=( Ln(ExpMax/ExpBasic) / Ln(Coeff_Inc) ) +1
Так определяется уровень из ExpMax.
Но в файле у нас есть только ExpResult. Поэтому сначала нам необходимо найти ExpMax. Но тут все просто
ExpMax:=ExpBasic;
Далее цикл
если ExpMax< ExpResult то
ExpMax:=ExpMax*Coeff_Inc
В итоге когда ExpMax превысило значение ExpResult мы получаем конечное и необходимое нам значение для ExpMax и выходим из цикла.

И есть еще один момент. Я выдаю проценты набранного опыта на данном уровне и это есть ни что иное, как

LvlProgress:=round( (100*(ExpResult*Coeff_Inc-ExpMax)) / (ExpMax*(Coeff_Inc-1)) ); - и округляю эти проценты до целых чисел

Все эти вычисления можно назвать насилием над компьютером . Но это позволяет уменьшить количество выводимых параметров, упростить так скажем визуально наш файл.

Последний раз редактировалось EridorBlade; 18.10.2012 в 18:07.
EridorBlade вне форума Ответить с цитированием
Старый 18.10.2012, 18:18   #12
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от EridorBlade Посмотреть сообщение
Все эти вычисления можно назвать насилием над компьютером .
Мде , что верно, то верно. Есть способ простой до безобразия, где база - это скилы, и всё находится через них.

Цитата:
Сообщение от EridorBlade Посмотреть сообщение
Но это позволяет уменьшить количество выводимых параметров, упростить так скажем визуально наш файл.
Отнюдь. Считывание и использование потока с простыми данными не в пример легче для машины и быстрее в преобразовании. Но, мы не ведем речь о выводе графики, поэтому производительность можно откинуть, пока это не касается ММО, поскольку в последней такие перлы положат сервер на лопатки.

Дождемся автора? ...или показать?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 18.10.2012, 18:38   #13
EridorBlade
CAE Engineer
Пользователь
 
Аватар для EridorBlade
 
Регистрация: 10.03.2011
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Отнюдь. Считывание и использование потока с простыми данными не в пример легче для машины и быстрее в преобразовании. Но, мы не ведем речь о выводе графики, поэтому производительность можно откинуть, пока это не касается ММО, поскольку в последней такие перлы положат сервер на лопатки.
Да я это понимаю. Но мой проект не ММО. На данный момент у меня 20 скиллов каждый из которых имеет опыт и получается, что на каждый скилл придется как минимум по 2 параметра записывать, а это уже 40 элементов. И есть планы на увеличение числа скиллов. В общем я просто облегчил себе для восприятия. И прекрасно понимаю, что русскому - хорошо, то немцу - смерть

А я пока думал сидел, у меня появился вопрос. Хорошо пусть проект ММО. Игрок зашел за своего персонажа. Он получил от сервера свое значение опыта. А дальше, как я понимаю, клиентская часть и будет заниматься преобразованиями над уровнем игрока. И у игрока отобразится его значение уровня и все остальное. Или клиентской части не стоит доверять рассчитывать такие вещи? Было бы интересно услышать совет на эту тему если не сложно
Цитата:
Сообщение от Beermonza Посмотреть сообщение
Дождемся автора? ...или показать?
Было бы интересно посмотреть

Последний раз редактировалось EridorBlade; 18.10.2012 в 18:49.
EridorBlade вне форума Ответить с цитированием
Старый 19.10.2012, 00:10   #14
EridorBlade
CAE Engineer
Пользователь
 
Аватар для EridorBlade
 
Регистрация: 10.03.2011
Сообщений: 75
По умолчанию

Я пока ехал домой понял, что мой вопрос оказался очень глупым. А ответ на него довольно очевидным. Конечно такие вещи ни в коем случае не должна рассчитывать клиентская часть, а любые математические сложности в серверной части в любом случае рано или поздно приведут к фатальным последствиям. Поэтому полностью согласен со всем, что ты написал.
А в моей схеме делалось это исключительно из-за визуального удобства. Никакой речи о быстрой работе кода в моей схеме не идет. Но для сингл игры я думаю это не так страшно.
EridorBlade вне форума Ответить с цитированием
Старый 20.10.2012, 18:41   #15
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Простая система скилов

Для любой программы страшна избыточность, а простота залог безотказной работы. Давайте подумаем, какова может быть основа системы скилов. Вот, например, у EridorBlade уровень (LvlResult) находится из опыта. А опыт это не базовая единица, а производная от уровня, т.е. все наоборот.

Лет 5 назад я показывал пример распределения скилов у некоторых типов персонажей. Посмотрим еще раз (как пример):

Человек -------------------------------
Сила - 3
Ловкость - 3
Могущество - 3
Выносливость - 3
----------------------------------------
Эльф ----------------------------------
Сила - 2
Ловкость - 4
Могущество - 4
Выносливость - 2
----------------------------------------
Гном ----------------------------------
Сила - 4
Ловкость - 2
Могущество - 2
Выносливость - 4
----------------------------------------

Есть закономерность? ...есть. Во всех случаях есть базовые баллы опыта, разбросанные по скилам, в данном случае это 12. На нулевом уровне у всех типов персонажей должен быть базовый запас один и тот же, а баланс достигается распределением. Только так.

Значит основа системы - скилы и базовые баллы. Попробуем найти уровень персонажа, зная, что каждое очко опыта он кидает на скил или оставляет неиспользованным:

ULevel = UStr + UAgi + UPwr + UVit + ULevelPoint - 12

На этапе распределения очков опыта, они перебрасываются из копилки ULevelPoint в одну из переменных скилов. Таким образом, формула всегда показывает один и тот же правильный результат.

Теперь мы знаем уровень персонажа по его скилам, которые обязательно передаются вместе с прочими параметрами. Кроме этого нужны текущие показатели опыта, жизни, энергии и пр., а пределы изменения опять так и находятся из уровня персонажа и его скилов.

Вернемся к опыту. Как уже показал выше:

UXPMin = ULevel^2 * k
UXPMax = (ULevel + 1)^2 * k

Теперь подумайте что можно сделать для шкалы "Энергия" (Мана) и "Жизнь". Подсказка: ...тоже элементарно в одно сложение и умножение, участвуют скилы.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 21.10.2012, 15:30   #16
EridorBlade
CAE Engineer
Пользователь
 
Аватар для EridorBlade
 
Регистрация: 10.03.2011
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Есть закономерность? ...есть. Во всех случаях есть базовые баллы опыта, разбросанные по скилам, в данном случае это 12. На нулевом уровне у всех типов персонажей должен быть базовый запас один и тот же, а баланс достигается распределением. Только так.

Значит основа системы - скилы и базовые баллы. Попробуем найти уровень персонажа, зная, что каждое очко опыта он кидает на скил или оставляет неиспользованным:

ULevel = UStr + UAgi + UPwr + UVit + ULevelPoint - 12

На этапе распределения очков опыта, они перебрасываются из копилки ULevelPoint в одну из переменных скилов. Таким образом, формула всегда показывает один и тот же правильный результат.
Это все верно для случая зависимости этих скиллов от уровня. У меня например Сила, Ловкость и другие это основные параметры персонажа которые прокачиваются за счет поведения персонажа в игре и за счет случайных событий. А скиллы набор умений/владений различными видами оружия, доспехов, заклинаний и ремесел которые как и уровень имеют опыт и которые в свою очередь прокачиваются так же за счет их постоянного использования. Уровень служит только для увеличения очков здоровья и создает сдерживающий фактор для неоправданного роста скиллов.

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Теперь подумайте что можно сделать для шкалы "Энергия" (Мана) и "Жизнь". Подсказка: ...тоже элементарно в одно сложение и умножение, участвуют скилы.
Вроде и простой вопрос. А может для меня он и не простой. Но ответов почему-то приходит сразу с десяток. Ведь на самом деле может быть как угодно.
Например в Fallout 2 очень похожая система распределения параметров СЛ ЛВК ВН ОБ МДР УД ИН
так вот там реализовано следующим образом:
Жизнь = БазовоеЗначение + СЛ + ВН*2
Но так кажется только с первого взгляда. Нужно ведь учесть ирост уровня.
Такой вот вариант я подсмотрел чтобы проверить свое предположение (так получилось что Fallout 2 у меня установлен )
30=15+5*1+5*2
если увеличить на 1 ВН или СЛ то получается что-то в этом духе
33=15+6*1+6*2
с получением уровня в Fallout мы так же получаем какое-то количество здоровья
Выше были написаны варианты для 1го уровня при создании персонажа. Но у меня еще оказалось сохранение на 7 и 8 уровнях.
СЛ=5 ВН =6
на 7 уровне Жизнь =62 и можно представить ее в виде суммы
62=15+5*1+6*2 + 30
30 это наш остаток
на 8 уровне Жизнь =67
67=15+5*1+6*2+ 35
35 - остаток

Ну вот теперь исходя из всех этих формул ответ кажется очевидным.
Жизнь = БазовоеЗначение +(Уровень-1)*СЛ+ СЛ + ВН*2
В итоге последнее можно преобразовать в
Жизнь = БазовоеЗначение +Уровень*СЛ+ ВН*2

Если вспомнить Diablo I если я не ошибаюсь
Здоровье= Выносливость*10 без каких либо базовых значений, но может я ошибаюсь.

В Diablo 3
Здоровье = 40 + (lvl-1)*4 + живучесть*(10+blvl)
lvl - уровень
blvl - бонус уровня который начинает накапливаться после 35 уровня
Но тут это формула здоровья для голого персонажа без учета шмоток и т.д.

У меня например так
function HPmax(VITa,HpBonusAdd,RaceP);
Begin
HPmax:=RaceP+VITa*10+(LvlResult-1)*(VITa div 2)+HpBonusAdd;
End;
где
RaceP - базовое значение для каждой расы
VITa - живучесть
HpBonusAdd - переменная в которую складываются бонусы от предметов, умений, заклинаний в виде суммы.

Энергия находится аналогично, но уже с другими коэффициентами.
Ну и вывод в общем-то такой, что у всех сделано по разному. Можно выделить общий кусок:
Здоровье=База+(Уровень-1)*Param+"Все что угодно и по замыслу автора"
где Param - наш параметр влияющий на здоровье.

Последний раз редактировалось EridorBlade; 21.10.2012 в 15:34.
EridorBlade вне форума Ответить с цитированием
Старый 21.10.2012, 22:09   #17
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от EridorBlade Посмотреть сообщение
Это все верно для случая зависимости этих скиллов от уровня.
Никак нет. Уровень персонажа - этикетка, фантик. Он нужен только для визуальной приблизительной оценки мощи персонажа. Однако, истинная сила в скилах, и их не показывают, кроме их хозяина. Улавливаете?

Почему тогда уровень участвует в формулах далее? ...а просто нет смысла снова считать уравнения со скилами, когда уже есть ответ, его содержит переменная уровня.

Да, в разных играх по-разному. Но! ...разнообразие заключается в подмешивании в формулы "Навыков" и "Умений", коими каждый тип персонажа владеет по-разному. Я показал чистый вид без навыков и умений.

EridorBlade, ты правильно подумал на счет вычисления шкалы жизни. Вот как может выглядеть элементарная формула:

UHPMax = 10 + UVit * k

k - всё тот же коэффициент прироста. А база - 10, это тот случай, когда нужно ограничить минимум жизни, ...он выбирается произвольно, но для всех типов персонажей одинаков. Аналогично и с "Энергией".

Что касается ловкости, то, лично у меня, она отвечает за скорость нанесения/выполнения ударов, за уворот, блок и т.п., разумеется в связке с навыками и умениями.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 24.10.2012, 13:00   #18
EridorBlade
CAE Engineer
Пользователь
 
Аватар для EridorBlade
 
Регистрация: 10.03.2011
Сообщений: 75
По умолчанию

Эта тема меня заставила подумать о некоторых моментах и кое что пересмотреть. Она оказалась очень полезной. Спасибо Beermonza за ответы ).
EridorBlade вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Опыт Штерна и Герлаха апрол Помощь студентам 0 23.02.2012 23:13
подредактировать античит к игре игре Nhl 09 (античит написан на дельфи) Viper18 Фриланс 3 03.08.2011 17:37
C++ первый опыт [продолжение] kin63camapa Софт 0 26.03.2010 23:19
C++ первый опыт kin63camapa Софт 9 13.03.2010 16:31
Как высчитать опыт? [Smarik] Паскаль, Turbo Pascal, PascalABC.NET 5 22.02.2008 22:34