![]() |
Как не делать кучу ифов?
Делаю игру.
У меня есть 6 кнопок магии. Я кликаю на одну из них, записываю какая это была кнопка в переменную, а потом кликаю в одного из 5 врагов. Так вот как мне не делать тысячу ифов и красиво записать разные действия на разных врагов в зависимости от выбранной комбинации кнопка-враг? (перечитал, спросил какуюто хрень, но может кто и поможет) :wacko: |
http://www.youtube.com/watch?v=4F72VULWFvc
Вот, хороший подкаст в тему, но, с другой стороны - я за ифы, а то что там - это для извращений в духе ява-интерпрайз. :) |
просто если магий будет 100 и 5 врагов то получаем 600 ифов, или это нормальная практика ифы стряпать? =)
|
можно сделать для каждого типа врага свой свитч, где в кейсах описать реакцию на магию.
Например: Код AS3:
|
Вопрос действительно абстрактный))
Во-первых действие по клику в игре состоит из двух составляющих - визуальной и рассчетной. Визуально надо отобразить действие героя, кастующего закл, возможно процесс попадания закла во врага и, наконец, действие закла на врага (последнее наиболее вероятно). В рассчетной части надо определить успешность каста (было ли попадание, нет ли у цели полной устойчивости к этому типу закла), и урон, исходя из типа закла, возможно расстояния, бонусов/штрафов героя и бонусов/штрафов цели. Даже если в Вашей игре используется 5% этих параметров, нужен какой-то "процессор" для рассчетной части и "контроллер" визуальной. Возможный вариант - 1) при выборе закла определяем, какую анимацию проиграть (каст и "полет") - это могут быть мувиклипы, лежащие в библиотеке и добавляемые на сцену при необходимости, или ключевые кадры-метки на общем клипе заклов или клипе героя. Сразу определяем общую силу закла на основе типа и бонусов/штрафов героя. Это то, что "из него вылетит" - одно число. Сохраняем его в переменной. 2) При выборе цели включаем анимацию каста и в процессоре определяем прежде всего успешность каста - возможно ли попадание (или есть преграды) и нет ли у цели полного резиста к этому типу заклинаний. Если каст успешен, определяем и запускаем анимацию "действия заклинания на цель". Это могут быть например блочки кадров в клипе самой цели, помеченные метками кадра. Определяем урон, нанесенный цели, исходя из типа и силы закла и бонусов/штрафов цели к этому типу. Определяем, уничтожена ли цель. Если да, то по окончании клипа "действия закла" переходим к анимации (клипу/метке) "смерть врага". Итак, при клике на иконку закла надо определить его тип. Лучше всего сделать свой класс иконок и завести в нем нужные свойства/геттеры - некий ID для определения типа, дефолтное значение силы, и имя клипа/метки/номер_кадра анимации героя и анимации полета закла. Тогда при клике мы вызовем обработчик, который по свойству (MouseEvent).target сможет получить все эти свойства из экземпляра самой иконки и передать их процессору и контроллеру. Никаких "сотен ифов". Мы имеем все что нужно - тип, силу и готовую ссылку на анимацию. (Если анимации и бонусы/штрафы не предусмотрены, нас интересует вообще только сила, из которой будет определяться уровень урона). При выборе цели в обработчике просто отдаем ссылку на цель процессору и контроллеру; процессор из экземпляра цели "вытягивает" резисты и штрафы к типу закла и определяет успешность/урон, а контроллер переводит (или нет) клип цели на "действие_закла"(в соответствии с его типом) и, если надо, "смерть_цели". Добавлено через 18 минут По поводу свитчей - я бы тупо))) хранил все необходимые параметры в массивах в классах врагов, а тип заклинания хранил как число, используемое как индекс массива. Допустим, у нас Огонь - 0, Шок - 1, Холод - 2 и Дух - 3. Тогда каждый класс врага хранит константные массивы : Код AS1/AS2:
|
На абстрактный вопрос, абстрактный же и ответ :)
А вообще, если по-интерпрайзному, то вместо ифоф надо делать так: (с ифами) Код AS3:
Код AS3:
|
)) Так конечно правильней и вкуснее, только тут автор упомянул о сотне видов магии. Так что я бы остановился на массивах. Либо вообще сделал справочный класс со сводными таблицами дэмэджей, резистов и анимаций.
Добавлено через 30 минут Я тут наверно не очень ясно выразился - дело даже не в том, что для врагов тогда придется написать сотню геттеров, а в том что в другом месте придется написать все те же сто ифов или свитч на сто значений, чтобы выбрать какой именно геттер вызывать)) Массивы и индексы конечно не так человекочитабельны, зато позволяют сделать читабельным расчет, освободив его от стостроковых выборов. (в данном конкретном примере я говорю о классах врагов с ИХ свойствами, росписью резистов под каждый тип магии, т.е. не спорю с кодом wvxvw для классов типов магии. Там конечно нужны обычные геттеры дэмаджа.)) |
Можно еще сделать чтобы каждый тип магии был классом с набором public членов описывающих повреждения и эффекты, а к врагу применять enemy.applyDamage(currentMagic)
Не знаю насколько понятно выразился) |
Да нет, посмотрите подкаст, он немного затянутый, но если есть полчаса, то он стоит того, чтобы послушать / посмотреть. Даже не обязательно понимать все, что там говорят, слайдов вполне себе хватит.
|
Тут тоже на полчаса.
Не обращайте внимания, что некоторые участники пишут слово "команда" с ошибками. Добавлено через 21 минуту Начал смотреть подкаст. Если это относится к гуглояваскрипту - то с ифами у них все в порядке. К сожалению, со времен машины Алана Тьюринга, от ифов никуда не деться. Их можно скрывать до посинения за всякими полиморфизмами, но ифы будут живы. Я считаю, что это основа жизни. |
| Часовой пояс GMT +4, время: 03:27. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.