Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 07.03.2010, 15:02   #1
Гром
Профессионал
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
Репутация: 473

icq: 482-373-277
По умолчанию Создание эффектов, действующих на различных существ

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

icq: 359715548
По умолчанию

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

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

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

icq: III 37373860
По умолчанию

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

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

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

Главный параметр - тип, условия движка ориентируются на него при обработке и выполнении эффектов.
__________________
Руководитель проекта MMO 2D RPG

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


04:08.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru