Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   override как правильно переопределять метод? (http://www.flasher.ru/forum/showthread.php?t=212481)

neonoviiwolf 22.02.2016 14:05

override как правильно переопределять метод?
 
Доброго!
Дошло дело до различного поведения hero, строить километровые зависимости if else не хочется. Как красивый вариант дуаю подойдёт переопределение методов. Так вот, как правильно всё это дело построить?
вот поведение по умолчанию, отрывок из класса, используется Nape

Код AS3:

                private function preListenerCatAndMouse(cb:PreCallback):PreFlag
                {
                        if (cb.int1.castBody.velocity.y > 0)
                        {
                                cb.int1.castBody.velocity.y *= -1;
                        }
                        else cb.int1.castBody.velocity.y -= 50;
                        cb.int2.castBody.userData.collisionBoolean = true;
                        if (!unlockedJumpBoolean)
                        {
                                stage.dispatchEvent(new UserEvent(UserEvent.UNLOCKED_JUMP, true, false))
                                unlockedJumpBoolean = true;
                        }
                        return PreFlag.IGNORE_ONCE;
                }

так вот, мне нужно создать класс, который наследует приведённый и там переопределять данный метод? Т.е. этот код по умолчанию оставить, далее в дочернем классе сделать несколько вариантов переопределенного метода и повесить слушателя. Именно так делается? Nape такое съест нормально?

Добавлено через 21 минуту
А вообще можно-то переопределить метод, который вызывает слушатель?

Wolsh 22.02.2016 14:32

приватные методы недоступны наследнику.

neonoviiwolf 22.02.2016 14:35

Цитата:

Сообщение от Wolsh (Сообщение 1192042)
приватные методы недоступны наследнику.

это я уже выяснил, щас стоит protected

Wolsh 22.02.2016 14:36

Надо определить доступ как protected, тогда возможен override.
Однако вот это
Цитата:

в дочернем классе сделать несколько вариантов переопределенного метода
невозможно. Хоть в дочернем, хоть в каком)))

Добавлено через 3 минуты
но, думаю, Вы имели ввиду всё-таки РАЗНЫХ наследников Hero.

neonoviiwolf 22.02.2016 14:44

Цитата:

Сообщение от Wolsh (Сообщение 1192044)
Надо определить доступ как protected, тогда возможен override.
Однако вот это невозможно. Хоть в дочернем, хоть в каком)))

Добавлено через 3 минуты
но, думаю, Вы имели ввиду всё-таки РАЗНЫХ наследников Hero.

у меня hero, в игре получает разные способности на некоторое время и его поведение и управление соответственно изменяется. Как такое правильно и красиво организовать?

caseyryan 22.02.2016 15:16

сделай просто свитч
Код AS3:

protected function changeSkills(skillType:String):void {
  switch (skillType) {
      case "barf":
            activateBarfingSkills();
            break;
      case "fart":
            activateFartingSkills();
            break;
      default: activateNormalBehavior();
            break;
  }
}


neonoviiwolf 22.02.2016 15:29

Цитата:

Сообщение от caseyryan (Сообщение 1192047)
сделай просто свитч
Код AS3:

protected function changeSkills(skillType:String):void {
  switch (skillType) {
      case "barf":
            activateBarfingSkills();
            break;
      case "fart":
            activateFartingSkills();
            break;
      default: activateNormalBehavior();
            break;
  }
}


хм, я о таком варианте не думал и не очень представляю как его реализовать, учитывая, что мне нужно сохранить имя класса, т.к. не очень представляю, как в Nape подставить иное имя метода для обработки столкновений, не написав ещё один обработчик событий. Мне кажется, что придётся возиться несколькими обработчиками, останавливая и перезапуская их. Если можно, поподробнее, я возможно просто пока не понимаю как это красиво реализовать

Пока только вижу и двигаюсь к варианту, внутри класса написать приватные классы (можно конечно и отдельные, но не вижу смысла делать 5-7 классов в 10 строчек кода). В них же (приватных) и переопределять метод(ы). А в основном классе просто навещать слушателей событий, которые будут вызывать необходимый приватный класс

caseyryan 22.02.2016 15:56

Зачем тебе в нейпе подсовывать какое-то другое имя метода? Там при регистрации столкновения в метод-обработчик передается InteractionCallback вот так:
Код AS3:

private function onCollision(collision:InteractionCallback):void {
        // ты можешь просто проверить тип события здесь               
        if (collision.event == CbEvent.ONGOING) {
            // ...
        } else if (collision.event == CbEvent.BEGIN) {
            // ...
        }
}

что мешает сделать так?
У тебя какая-то сплошная каша и в коде и в вопросе. По-моему то, что ты хочешь сделать (если я правильно это понял), реализуется именно проверкой условия. Не нужно никаких методо переопределять.
Переопределение требуется, допустим, если у тебя есть 2 разных класса персонажей, которые ведут себя по разному. Скажем, один идет, а другой идет, и после каждого шага подпрыгивает.
Так ты в базом классе пишешь метод ходьбы.

Код AS3:

protected function walk():void {
    // тут код ходьбы
}

а в том классе, где требуется еще и подпрыгивание, пишешь переопределение
Код AS3:

override protected function walk():void {
    super.walk(); // сначала вызываем обший метод ходьбы, а потом делаем прыжок
    jump();
}

Вот как-то так.

neonoviiwolf 22.02.2016 16:22

caseyryan
хм, я не совсем понял ваш пример, как он мне поможет.

Я использую только PreCallback, остальные не нужны
Что я хочу сделать, есть персонаж, ведёт себя заранее опрелённым образом и обрабатывается определённое взаимодействие с Nape, пусть обрабатываются столкновения определённым образом. Дальше происходит событие и он теперь столкновение вообще не учитывает. Дальше происходит новое событие, столкновения снова учитываются, но уже другая реакция. При этом это не однократно, а в течении определённого времени. Простой пример, перс не может проходить сквозь стены, берёт очивку и в течении 10 секунд может

faraday 22.02.2016 17:26

это классическая задача для использования stateMachine, под AS вроде есть готовы либы, но лучше написать самому чтобы лучше разобраться. переопределение методов не совсем тот случай. игровые ситуации бывают оч сложные
первое из гугла по теме http://www.gamedev.ru/code/articles/..._state_machine


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

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