|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
18.10.2012, 18:03 | #11 | |
CAE Engineer
Пользователь
Регистрация: 10.03.2011
Сообщений: 75
|
Цитата:
Моей целью было уменьшить количество элементов записываемых в сохраняемый файл. Это лично мне показалось более удобным. Но сразу могу сказать, что это приводит к некоему математическому изнасилованию компьютера . Ладно, раз уж автор не появляется, напишу для тех кому будет это интереснее. Когда я загружаю данные, я беру только текущее значение опыта 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. |
|
18.10.2012, 18:18 | #12 | |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Мде , что верно, то верно. Есть способ простой до безобразия, где база - это скилы, и всё находится через них.
Цитата:
Дождемся автора? ...или показать?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
|
18.10.2012, 18:38 | #13 | |
CAE Engineer
Пользователь
Регистрация: 10.03.2011
Сообщений: 75
|
Цитата:
А я пока думал сидел, у меня появился вопрос. Хорошо пусть проект ММО. Игрок зашел за своего персонажа. Он получил от сервера свое значение опыта. А дальше, как я понимаю, клиентская часть и будет заниматься преобразованиями над уровнем игрока. И у игрока отобразится его значение уровня и все остальное. Или клиентской части не стоит доверять рассчитывать такие вещи? Было бы интересно услышать совет на эту тему если не сложно Было бы интересно посмотреть Последний раз редактировалось EridorBlade; 18.10.2012 в 18:49. |
|
19.10.2012, 00:10 | #14 |
CAE Engineer
Пользователь
Регистрация: 10.03.2011
Сообщений: 75
|
Я пока ехал домой понял, что мой вопрос оказался очень глупым. А ответ на него довольно очевидным. Конечно такие вещи ни в коем случае не должна рассчитывать клиентская часть, а любые математические сложности в серверной части в любом случае рано или поздно приведут к фатальным последствиям. Поэтому полностью согласен со всем, что ты написал.
А в моей схеме делалось это исключительно из-за визуального удобства. Никакой речи о быстрой работе кода в моей схеме не идет. Но для сингл игры я думаю это не так страшно. |
20.10.2012, 18:41 | #15 |
Инженер ИС
Старожил
Регистрация: 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) Мир духу его
|
21.10.2012, 15:30 | #16 | ||
CAE Engineer
Пользователь
Регистрация: 10.03.2011
Сообщений: 75
|
Цитата:
Цитата:
Например в 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. |
||
21.10.2012, 22:09 | #17 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Никак нет. Уровень персонажа - этикетка, фантик. Он нужен только для визуальной приблизительной оценки мощи персонажа. Однако, истинная сила в скилах, и их не показывают, кроме их хозяина. Улавливаете?
Почему тогда уровень участвует в формулах далее? ...а просто нет смысла снова считать уравнения со скилами, когда уже есть ответ, его содержит переменная уровня. Да, в разных играх по-разному. Но! ...разнообразие заключается в подмешивании в формулы "Навыков" и "Умений", коими каждый тип персонажа владеет по-разному. Я показал чистый вид без навыков и умений. EridorBlade, ты правильно подумал на счет вычисления шкалы жизни. Вот как может выглядеть элементарная формула: UHPMax = 10 + UVit * k k - всё тот же коэффициент прироста. А база - 10, это тот случай, когда нужно ограничить минимум жизни, ...он выбирается произвольно, но для всех типов персонажей одинаков. Аналогично и с "Энергией". Что касается ловкости, то, лично у меня, она отвечает за скорость нанесения/выполнения ударов, за уворот, блок и т.п., разумеется в связке с навыками и умениями.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
24.10.2012, 13:00 | #18 |
CAE Engineer
Пользователь
Регистрация: 10.03.2011
Сообщений: 75
|
Эта тема меня заставила подумать о некоторых моментах и кое что пересмотреть. Она оказалась очень полезной. Спасибо Beermonza за ответы ).
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Опыт Штерна и Герлаха | апрол | Помощь студентам | 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 |