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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2010, 14:02   #1
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию Создание эффектов, действующих на различных существ

Доброго времени суток!
Возникла у меня недавно проблема с созданием различных эффектов, действующих на различных существ.
Откуда, собственно, уши растут: в моей игре персонаж может подбирать различные бонусы (на данный момент - три типа), соответственно после поднятия каждого из них на кого-то начинает действовать какой-то эффект (а именно: замедление на врагов, ускорение и неуязвимость - на персонажа). В принципе до определенного момента, когда еще было только два бонуса (ускорение и замедление) и они визуально никак не проявлялись, все было достаточно просто: имеется массив размером, равным числу видов бонусов, его значения соответствовали оставшемуся времени действия каждого вида бонусов. Если элемент массива равен нулю - значит бонус не действует; каждую итерацию игрового цикла все ненулевые значения уменьшались на единичку, при подборе бонуса длительность соответствующего эффекта становилась равной начальному значению. Потом в соответствующих местах проверялись значения элементов массива эффектов. Если элемент, отвечающий за ускорение, не равен нулю - скорость персонажа на этот ход удваивалась, аналогично враги замедлялись, если при столкновении игрока с врагом бонус неуязвимости активен - ничего не происходит, иначе - упс!
Вообще этот метод, на мой взгляд, неэлегантен. А уж когда мне потребовалось сделать визуализацию эффектов...
Еще один сложный момент: все эти три эффекта - эффекты длительные, а ведь могут быть еще и эффекты единовременные, например, дополнительная жизнь. Через подобную схему их и вовсе непонятно как реализовать.
Итак, в свете всего вышесказанного я ищу решение, предполагаю о нем следующее:
  • Видов эффектов может быть достаточно много.
  • Эффект может быть применен к объектам разного типа (персонаж и враг).
  • На один и тот же объект может быть применено одновременно несколько эффектов.
  • Один и тот же эффект может быть одновременно быть применен к одному объекту и не применен к другому объекту того же типа.
  • Вообще все объекты типа "эффект" могут быть независимыми друг от друга, как по времени действия, так и по отображению (два объекта типа "эффект" могут одновременно отображать различные кадры своей анимации)
  • В то же время должен иметься регулярный способ управления эффектами (например, при поднятии бонуса на все объекты определенного типа может быть наложен один и тот же эффект. А может быть и не наложен. Или наложен, но только на тех, кто находится в определенной области)
  • Если на объект уже действует какой-то эффект, то при повторном накладывании на него этого же эффекта старый эффект должен быть заменен новым (или, может быть, продлен), т.е. на объект не может быть наложено два однотипных эффекта одновременно
  • Эффекты могут быть как длительными, так и единовременными (как замедление и дополнительная жизнь)
Кажется, все...
Вот пишу и думаю: а не сделать ли каждому объекту по такому же массиву, что был раньше один на всех?... Разве что с единовременными эффектами проблем это не решит.
В своей игре я пока что решил проблему с помощью костылей, добавив врагам по номеру кадра анимации для эффекта замедления, а персонажу - два номера кадра - для эффекта ускорения и неуязвимости. Но это, конечно, далеко не идеал.
Были у меня даже мысли по поводу скриптов, но пока что хотелось бы обойтись без них.
Вот как бы можно было бы в идеале решить такую проблему?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 07.03.2010, 14:30   #2
Ckomoroh
Я еще только учусь
Форумчанин
 
Аватар для Ckomoroh
 
Регистрация: 24.10.2009
Сообщений: 125
По умолчанию

Для каждого объекта в игре есть массив. Каждый эффект должен быть пронумерован, например замедление 1 столбец, ускорение 2 и.т.д. При поднятии определенного бонуса, ставим маркер в массиве, что бонус взят и делаем операции, что делает этот бонус.

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

При повторном взятии, если бонус такой взят, то просто либо обнуляем счетчик, либо вычитаем из счетчика время действия эффекта(если нужно продлить эффект).
Ckomoroh вне форума Ответить с цитированием
Старый 07.03.2010, 16:04   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
Вообще этот метод, на мой взгляд, неэлегантен
Это точно, такие вещи обычно реализуются с помощью ООП, иначе код превратится в лапшу
пыщь
JTG вне форума Ответить с цитированием
Старый 07.03.2010, 16:49   #4
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Нужно создать тип эффекта TGEffect в записях: статус, тип, время, текущий кадр, область действия, что там еще понадобится... В каждом типе объекта TGObj числится массив типа TGEffect. Массив может быть как ограниченным, так и динамическим (это сложнее). Применим первый случай, 10-15 ячеек хватит.

Движок должен быть оснащен процедурой заполнения массива. Статус отвечает за состояние эффекта, есть или нет, чтобы оперативно искать не нужные записи и вставлять новые эффекты. Тип отвечает за анимацию и параметры действия в банке эффектов. Время - сколько длится эффект, по этому значению определяется конец эффекта. Текущий кадр - понятно что такое. Область действия - область на карте, где действует эффект, ...если эффект точечный, то вместо области записываются индексы цели (объектов игры).

Главный параметр - тип, условия движка ориентируются на него при обработке и выполнении эффектов.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 07.03.2010 в 16:52.
Beermonza вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение в различных браузерах Xeon332 HTML и CSS 7 22.02.2009 09:09
ТРЕБУЕТСЯ агрессивная раскрутка действующих интернет-магазинов. 50tonn Фриланс 2 04.02.2009 22:31
Авторизация на различных сайтах delphin100 Работа с сетью в Delphi 4 20.01.2009 23:13
подсчет различных значений zetrix Microsoft Office Excel 0 31.10.2006 07:28