Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.04.2010, 23:09
engineer_f_R вне форума Посмотреть профиль Отправить личное сообщение для engineer_f_R Найти все сообщения от engineer_f_R
  № 1  
Ответить с цитированием
engineer_f_R

Регистрация: Oct 2009
Сообщений: 53
Question Как не делать кучу ифов?

Делаю игру.
У меня есть 6 кнопок магии. Я кликаю на одну из них, записываю какая это была кнопка в переменную, а потом кликаю в одного из 5 врагов.

Так вот как мне не делать тысячу ифов и красиво записать разные действия на разных врагов в зависимости от выбранной комбинации кнопка-враг?
(перечитал, спросил какуюто хрень, но может кто и поможет)

Старый 18.04.2010, 23:52
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
http://www.youtube.com/watch?v=4F72VULWFvc
Вот, хороший подкаст в тему, но, с другой стороны - я за ифы, а то что там - это для извращений в духе ява-интерпрайз.
__________________
Hell is the possibility of sanity

Старый 19.04.2010, 00:11
engineer_f_R вне форума Посмотреть профиль Отправить личное сообщение для engineer_f_R Найти все сообщения от engineer_f_R
  № 3  
Ответить с цитированием
engineer_f_R

Регистрация: Oct 2009
Сообщений: 53
просто если магий будет 100 и 5 врагов то получаем 600 ифов, или это нормальная практика ифы стряпать? =)

Старый 19.04.2010, 00:17
  № 4  
Ответить с цитированием
Xero201
Guest

Сообщений: n/a
можно сделать для каждого типа врага свой свитч, где в кейсах описать реакцию на магию.
Например:
Код AS3:
//Для воздушных:
switch(magic){
case "огонь": действие="сгореть"; break;
case "пылесос": действие="раствориться"; break;
default: действие="не действует";
}
 
//Для огненных:
switch(magic){
case "земля": case "вода": действие="испариться"; break;
default: действие="не действует";
}


Последний раз редактировалось Xero201; 19.04.2010 в 00:23.
Старый 19.04.2010, 00:25
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вопрос действительно абстрактный))
Во-первых действие по клику в игре состоит из двух составляющих - визуальной и рассчетной. Визуально надо отобразить действие героя, кастующего закл, возможно процесс попадания закла во врага и, наконец, действие закла на врага (последнее наиболее вероятно). В рассчетной части надо определить успешность каста (было ли попадание, нет ли у цели полной устойчивости к этому типу закла), и урон, исходя из типа закла, возможно расстояния, бонусов/штрафов героя и бонусов/штрафов цели. Даже если в Вашей игре используется 5% этих параметров, нужен какой-то "процессор" для рассчетной части и "контроллер" визуальной.
Возможный вариант -
1) при выборе закла определяем, какую анимацию проиграть (каст и "полет") - это могут быть мувиклипы, лежащие в библиотеке и добавляемые на сцену при необходимости, или ключевые кадры-метки на общем клипе заклов или клипе героя. Сразу определяем общую силу закла на основе типа и бонусов/штрафов героя. Это то, что "из него вылетит" - одно число. Сохраняем его в переменной.
2) При выборе цели включаем анимацию каста и в процессоре определяем прежде всего успешность каста - возможно ли попадание (или есть преграды) и нет ли у цели полного резиста к этому типу заклинаний. Если каст успешен, определяем и запускаем анимацию "действия заклинания на цель". Это могут быть например блочки кадров в клипе самой цели, помеченные метками кадра. Определяем урон, нанесенный цели, исходя из типа и силы закла и бонусов/штрафов цели к этому типу. Определяем, уничтожена ли цель. Если да, то по окончании клипа "действия закла" переходим к анимации (клипу/метке) "смерть врага".
Итак, при клике на иконку закла надо определить его тип. Лучше всего сделать свой класс иконок и завести в нем нужные свойства/геттеры - некий ID для определения типа, дефолтное значение силы, и имя клипа/метки/номер_кадра анимации героя и анимации полета закла. Тогда при клике мы вызовем обработчик, который по свойству (MouseEvent).target сможет получить все эти свойства из экземпляра самой иконки и передать их процессору и контроллеру. Никаких "сотен ифов". Мы имеем все что нужно - тип, силу и готовую ссылку на анимацию. (Если анимации и бонусы/штрафы не предусмотрены, нас интересует вообще только сила, из которой будет определяться уровень урона).
При выборе цели в обработчике просто отдаем ссылку на цель процессору и контроллеру; процессор из экземпляра цели "вытягивает" резисты и штрафы к типу закла и определяет успешность/урон, а контроллер переводит (или нет) клип цели на "действие_закла"(в соответствии с его типом) и, если надо, "смерть_цели".

Добавлено через 18 минут
По поводу свитчей - я бы тупо))) хранил все необходимые параметры в массивах в классах врагов, а тип заклинания хранил как число, используемое как индекс массива. Допустим, у нас Огонь - 0, Шок - 1, Холод - 2 и Дух - 3. Тогда каждый класс врага хранит константные массивы :
Код AS1/AS2:
public static const ANIMATIONS:Array = ["я_горю", "я_трясусь", "я_замерз", "я_парализован", "я_умираю"]; // метки кадров
public static const RESISTS:Array = [0.1, 0.05, 0, 0.04];
И никаких свитчей и ифов. При определении урона и анимации мы по типу закла - индексу напрямую переходим к нужной анимации или получаем классовый резист. Если у каждого экземпляра идет свой счет бонусов/штрафов, то второй массив просто не делаем статическим, а свойством каждого экземпляра.
__________________
Reality.getBounds(this);

Старый 19.04.2010, 03:04
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
На абстрактный вопрос, абстрактный же и ответ
А вообще, если по-интерпрайзному, то вместо ифоф надо делать так:
(с ифами)
Код AS3:
class MagicDamageClaculator {
 
function getDamage(forMagic:Magic):int
{
    switch (forMagic)
    {
        case Magic.Earth: return 100;
        case Magic.Air: return 200;
    }
}
 
}
(без ифов)
Код AS3:
class EarthMagicDamageClaculator {
 
function getDamage():int { return 100; }
 
}
 
class AirMagicDamageClaculator {
 
function getDamage():int { return 200; }
 
}
Что вам больше по душе - решайте сами. На самом деле второй вариант - просто другой способ описать то же самое, в контексте AS3, скорее всего даже менее производительный, но в контексте просто разработки, и того, сколько нужно думать, и на сколько легко читается код - второй имеет преимущества.
__________________
Hell is the possibility of sanity

Старый 19.04.2010, 12:55
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
)) Так конечно правильней и вкуснее, только тут автор упомянул о сотне видов магии. Так что я бы остановился на массивах. Либо вообще сделал справочный класс со сводными таблицами дэмэджей, резистов и анимаций.

Добавлено через 30 минут
Я тут наверно не очень ясно выразился - дело даже не в том, что для врагов тогда придется написать сотню геттеров, а в том что в другом месте придется написать все те же сто ифов или свитч на сто значений, чтобы выбрать какой именно геттер вызывать)) Массивы и индексы конечно не так человекочитабельны, зато позволяют сделать читабельным расчет, освободив его от стостроковых выборов. (в данном конкретном примере я говорю о классах врагов с ИХ свойствами, росписью резистов под каждый тип магии, т.е. не спорю с кодом wvxvw для классов типов магии. Там конечно нужны обычные геттеры дэмаджа.))
__________________
Reality.getBounds(this);

Старый 19.04.2010, 14:20
petri вне форума Посмотреть профиль Отправить личное сообщение для petri Найти все сообщения от petri
  № 8  
Ответить с цитированием
petri
 
Аватар для petri

Регистрация: Dec 2009
Сообщений: 60
Можно еще сделать чтобы каждый тип магии был классом с набором public членов описывающих повреждения и эффекты, а к врагу применять enemy.applyDamage(currentMagic)

Не знаю насколько понятно выразился)


Последний раз редактировалось petri; 19.04.2010 в 14:23.
Старый 19.04.2010, 19:34
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 9  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Да нет, посмотрите подкаст, он немного затянутый, но если есть полчаса, то он стоит того, чтобы послушать / посмотреть. Даже не обязательно понимать все, что там говорят, слайдов вполне себе хватит.
__________________
Hell is the possibility of sanity

Старый 20.04.2010, 01:40
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 10  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Тут тоже на полчаса.

Не обращайте внимания, что некоторые участники пишут слово "команда" с ошибками.

Добавлено через 21 минуту
Начал смотреть подкаст. Если это относится к гуглояваскрипту - то с ифами у них все в порядке. К сожалению, со времен машины Алана Тьюринга, от ифов никуда не деться. Их можно скрывать до посинения за всякими полиморфизмами, но ифы будут живы. Я считаю, что это основа жизни.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:06.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


Часовой пояс GMT +4, время: 02:06.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.