![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Oct 2009
Сообщений: 53
|
Делаю игру.
У меня есть 6 кнопок магии. Я кликаю на одну из них, записываю какая это была кнопка в переменную, а потом кликаю в одного из 5 врагов. Так вот как мне не делать тысячу ифов и красиво записать разные действия на разных врагов в зависимости от выбранной комбинации кнопка-враг? (перечитал, спросил какуюто хрень, но может кто и поможет) ![]() |
|
|||||
|
Modus ponens
|
http://www.youtube.com/watch?v=4F72VULWFvc
Вот, хороший подкаст в тему, но, с другой стороны - я за ифы, а то что там - это для извращений в духе ява-интерпрайз. ![]()
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Oct 2009
Сообщений: 53
|
просто если магий будет 100 и 5 врагов то получаем 600 ифов, или это нормальная практика ифы стряпать? =)
|
|
|||||
|
Guest
Сообщений: n/a
|
можно сделать для каждого типа врага свой свитч, где в кейсах описать реакцию на магию.
Например: Последний раз редактировалось Xero201; 19.04.2010 в 00:23. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Вопрос действительно абстрактный))
Во-первых действие по клику в игре состоит из двух составляющих - визуальной и рассчетной. Визуально надо отобразить действие героя, кастующего закл, возможно процесс попадания закла во врага и, наконец, действие закла на врага (последнее наиболее вероятно). В рассчетной части надо определить успешность каста (было ли попадание, нет ли у цели полной устойчивости к этому типу закла), и урон, исходя из типа закла, возможно расстояния, бонусов/штрафов героя и бонусов/штрафов цели. Даже если в Вашей игре используется 5% этих параметров, нужен какой-то "процессор" для рассчетной части и "контроллер" визуальной. Возможный вариант - 1) при выборе закла определяем, какую анимацию проиграть (каст и "полет") - это могут быть мувиклипы, лежащие в библиотеке и добавляемые на сцену при необходимости, или ключевые кадры-метки на общем клипе заклов или клипе героя. Сразу определяем общую силу закла на основе типа и бонусов/штрафов героя. Это то, что "из него вылетит" - одно число. Сохраняем его в переменной. 2) При выборе цели включаем анимацию каста и в процессоре определяем прежде всего успешность каста - возможно ли попадание (или есть преграды) и нет ли у цели полного резиста к этому типу заклинаний. Если каст успешен, определяем и запускаем анимацию "действия заклинания на цель". Это могут быть например блочки кадров в клипе самой цели, помеченные метками кадра. Определяем урон, нанесенный цели, исходя из типа и силы закла и бонусов/штрафов цели к этому типу. Определяем, уничтожена ли цель. Если да, то по окончании клипа "действия закла" переходим к анимации (клипу/метке) "смерть врага". Итак, при клике на иконку закла надо определить его тип. Лучше всего сделать свой класс иконок и завести в нем нужные свойства/геттеры - некий ID для определения типа, дефолтное значение силы, и имя клипа/метки/номер_кадра анимации героя и анимации полета закла. Тогда при клике мы вызовем обработчик, который по свойству (MouseEvent).target сможет получить все эти свойства из экземпляра самой иконки и передать их процессору и контроллеру. Никаких "сотен ифов". Мы имеем все что нужно - тип, силу и готовую ссылку на анимацию. (Если анимации и бонусы/штрафы не предусмотрены, нас интересует вообще только сила, из которой будет определяться уровень урона). При выборе цели в обработчике просто отдаем ссылку на цель процессору и контроллеру; процессор из экземпляра цели "вытягивает" резисты и штрафы к типу закла и определяет успешность/урон, а контроллер переводит (или нет) клип цели на "действие_закла"(в соответствии с его типом) и, если надо, "смерть_цели". Добавлено через 18 минут По поводу свитчей - я бы тупо))) хранил все необходимые параметры в массивах в классах врагов, а тип заклинания хранил как число, используемое как индекс массива. Допустим, у нас Огонь - 0, Шок - 1, Холод - 2 и Дух - 3. Тогда каждый класс врага хранит константные массивы : И никаких свитчей и ифов. При определении урона и анимации мы по типу закла - индексу напрямую переходим к нужной анимации или получаем классовый резист. Если у каждого экземпляра идет свой счет бонусов/штрафов, то второй массив просто не делаем статическим, а свойством каждого экземпляра.
__________________
Reality.getBounds(this); |
|
|||||
|
Modus ponens
|
На абстрактный вопрос, абстрактный же и ответ
![]() А вообще, если по-интерпрайзному, то вместо ифоф надо делать так: (с ифами) class MagicDamageClaculator { function getDamage(forMagic:Magic):int { switch (forMagic) { case Magic.Earth: return 100; case Magic.Air: return 200; } } } Что вам больше по душе - решайте сами. На самом деле второй вариант - просто другой способ описать то же самое, в контексте AS3, скорее всего даже менее производительный, но в контексте просто разработки, и того, сколько нужно думать, и на сколько легко читается код - второй имеет преимущества.
__________________
Hell is the possibility of sanity |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
)) Так конечно правильней и вкуснее, только тут автор упомянул о сотне видов магии. Так что я бы остановился на массивах. Либо вообще сделал справочный класс со сводными таблицами дэмэджей, резистов и анимаций.
Добавлено через 30 минут Я тут наверно не очень ясно выразился - дело даже не в том, что для врагов тогда придется написать сотню геттеров, а в том что в другом месте придется написать все те же сто ифов или свитч на сто значений, чтобы выбрать какой именно геттер вызывать)) Массивы и индексы конечно не так человекочитабельны, зато позволяют сделать читабельным расчет, освободив его от стостроковых выборов. (в данном конкретном примере я говорю о классах врагов с ИХ свойствами, росписью резистов под каждый тип магии, т.е. не спорю с кодом wvxvw для классов типов магии. Там конечно нужны обычные геттеры дэмаджа.))
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 60
|
Можно еще сделать чтобы каждый тип магии был классом с набором public членов описывающих повреждения и эффекты, а к врагу применять enemy.applyDamage(currentMagic)
Не знаю насколько понятно выразился) Последний раз редактировалось petri; 19.04.2010 в 14:23. |
|
|||||
|
Modus ponens
|
Да нет, посмотрите подкаст, он немного затянутый, но если есть полчаса, то он стоит того, чтобы послушать / посмотреть. Даже не обязательно понимать все, что там говорят, слайдов вполне себе хватит.
__________________
Hell is the possibility of sanity |
|
|||||
|
.
|
Тут тоже на полчаса.
Не обращайте внимания, что некоторые участники пишут слово "команда" с ошибками. Добавлено через 21 минуту Начал смотреть подкаст. Если это относится к гуглояваскрипту - то с ифами у них все в порядке. К сожалению, со времен машины Алана Тьюринга, от ифов никуда не деться. Их можно скрывать до посинения за всякими полиморфизмами, но ифы будут живы. Я считаю, что это основа жизни. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:47. |
|
|
« Предыдущая тема | Следующая тема » |
|
|