Лежебокер,
В 3D, где нет кадров, а есть непрерывные анимации, придётся это дело переработать. Например, вместо кадра — фаза движения, у которой задана анимация из библиотеки, длительность, ссылка на код и активный момент (когда эту ссылку активировать). Возможно, активный момент не один, а несколько, чтобы демон мог стрелять очередями.
Это зависит от вашего анимационного движка, насколько сложную систему анимаций хотите и много чего ещё, но принцип поняли.
Лежебокер, Если вы хотите, чтобы можно было сделать нового монстра и новый снаряд для него, придётся сделать вот что.
Строите новых персонажей «Демон» и «Снаряд демона». Где-то в свойствах демона есть: его снаряд — «снаряд демона», точность — например, 1°. В одном из кадров демона указано: ссылка на код — что-нибудь типа ShootCustomProjectile. Эта функция получает object->type->projectile и object->type->shootingPrecision, и выпускает нужный снаряд с нужной точностью.
Сколько HP снимает — можно хранить в свойствах снаряда, можно в свойствах демона (не особо важно). Главное, добраться до этой цифры, когда снаряд попадает в игрока.
Лежебокер,
Могу продолжить дальше. У каждого персонажа есть название спрайта (тот самый PLAY), огромная куча флагов (свисает с потолка, неуязвимый, сплошной, и прочая, и прочая), кол-во HP, диаметр, высота, шанс прервать имеющуюся анимацию и перейти к анимации боли (слабое место какодемона — пилишь его бензопилой, а он отворачивается и ничего не может делать).
Ну и, разумеется, ссылки на первый кадр различных анимаций (движение/стрельба/боль/смерть).
Не обязательно так сложно, но в целом всё, что вы придумаете в библиотеке функций, должно иметь какое-то отражение в этих самых данных.
Лежебокер, маленький пример движка на данных.
В Doom есть такое понятие, как кадр анимации. Он состоит из…
• фазы анимации (от А до Z, а также [ \ ]). Загрузчик спрайтов учитывал название спрайта, фазу анимации и ориентацию и, например, PLAYB2B8 — игрок (PLAY) в фазе B, который смотрит на 45° влево (2). Игрок в фазе B, который смотрит на 45° вправо (8), делается зеркальным отражением. Особая ориентация 0 говорит, что этот спрайт берётся независимо от ориентации. Буквы ничего не значат в отрыве от контекста; A/B/C/D — у большинства монстров анимация хождения.
• длительности кадра, в игровых тактах (1/35 с)
• указателя на следующий кадр
• флагов (помню один: рисовать на полной яркости, не просчитывая освещение)
• указателя в код. Для редактирования вне игры лучше использовать строки типа «ShootPistol», DEHACKED использовал что-то типа «точно так же, как было в кадре 15».
Лежебокер, Сам я, когда играл с исходниками Doom, сделал какой-то ключ, который говорит: за убийство врагов давать фраги (ну и появляется псевдоигрок Opponent, получающий фраги за вас). Именно для таких тренажёров.
Лежебокер, Естественно, движок на данных проще всех. Из Doom невозможно сделать, например, CTF, но гранаты, огнемёты, камикадзе, маскирующихся под бочки, и даже deathmatch-тренажёр (фраги не считаются) делали.
Anton Dyrkov, В том, что Graph — единый неразрывный кусок, нет никаких проблем.
Штука у вас в том, что Parser ссылается на Graph, а Graph — на Parser. Не очень мне это нравится, и есть два варианта.
1. Вся функциональность по построению графа в Graph (а Parser выдаёт какой-то промежуточный код типа вызова callback’ов) — сделать интерфейс типа GraphSource.
2. Вся функциональность по построению графа в Parser — я уже говорил.
VrencchBug, Просто ноут такой, что нет нужды ремонтировать отвал чипа. Где кто писал про «ремонт» — просто хочу сказать человеку, стоит ли тащить старющий «пенёк» к ремонтникам.
shvaidahder, Условия, что стоит чуть выше, я не вижу.
При каком условии перестанет выполняться неравенство i < i + (что-то там)? Когда сумма в правой части переполнится! То есть цикл выполнит 2 млрд итераций.
shvaidahder,
"horror" (и вообще любой строковый литерал) находится в сегменте данных, предназначенном только для чтения, имеет тип char const* (или const char*) и не позволяет переприсваивания.
shvaidahder, 1. ПОВТОРЯЮ, вызывать strlen в цикле неоптимально.
2. У вас совершенно неверное условие остановки цикла. Которое выполнится, когда i переполнится.
В 3D, где нет кадров, а есть непрерывные анимации, придётся это дело переработать. Например, вместо кадра — фаза движения, у которой задана анимация из библиотеки, длительность, ссылка на код и активный момент (когда эту ссылку активировать). Возможно, активный момент не один, а несколько, чтобы демон мог стрелять очередями.
Это зависит от вашего анимационного движка, насколько сложную систему анимаций хотите и много чего ещё, но принцип поняли.