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

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

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

Регистрация: Sep 2015
Сообщений: 20
По умолчанию продиспатчить кастомный ивент дальше

В одном классе я кидаю кастомное событие
Код AS3:
dispatchEvent(new StateEvent(StateEvent.CHANGE_STATE, StateStack.PLAY_STATE));
В другом классе я его ловлю и кидаю дальше
Код AS3:
private function init():void {
         menuInfo.addEventListener(StateEvent.CHANGE_STATE, onStateChange);
}
 
private function onStateChange(event:StateEvent):void {
        dispatchEvent(event); // тут ошибка..
}
Но вываливается ошибка
Код AS1/AS2:
TypeError: Error #1034: Type Coercion failed: cannot convert flash.events::Event@544f511 to States.Events.StateEvent.
Что делать? Почему ошибка?

Старый 05.10.2015, 00:20
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Ошибка говорит, что в хендлер onStateChange приходит экземпляр класса Event, а не StateEvent. Вы не кидаете событие типа StateEvent, оттого и возникает RTE, ищите ошибку в первом диспатче.
И да, чтобы пробросить дальше, достаточно написать
Код AS3:
menuInfo.addEventListener(StateEvent.CHANGE_STATE, dispatchEvent);
__________________
тут я

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

Регистрация: Sep 2015
Сообщений: 20
Я перепроверял, точно кидаю свой StateEvent который наследуется от Event. Даже брейк поинтом проверял, приходит тоже StateEvent с теми данными которые я передал..

Старый 05.10.2015, 00:27
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Приведите более полный код, чтобы не гадать на кофейной гуще.
__________________
тут я

Старый 05.10.2015, 00:41
Quadro9 вне форума Посмотреть профиль Отправить личное сообщение для Quadro9 Найти все сообщения от Quadro9
  № 5  
Ответить с цитированием
Quadro9

Регистрация: Sep 2015
Сообщений: 20
код ивента, может с ним что-то не так?
Код AS3:
package States.Events {
import flash.events.Event;
 
public class StateEvent extends Event {
 
    public static const CHANGE_STATE:String = "change state";
 
    private var _newState:int;
 
    public function StateEvent(type:String, newState:int, bubbles:Boolean = false, cancelable:Boolean = false) {
        super(type, bubbles, cancelable);
        _newState = newState;
    }
 
    public function get newState():int {
        return _newState;
    }
}
}
тут я кидаю событие
Код AS3:
override public function update(delta:Number):void {
        if (_model.isMouseDown) {
            dispatchEvent(new StateEvent(StateEvent.CHANGE_STATE, StateStack.PLAY_STATE));
        }
    }
Добавлено через 10 минут
Все я понял, надо в ивенте еще дописать клон
новый код ивента

Код AS3:
package States.Events {
import flash.events.Event;
 
public class StateEvent extends Event {
 
    public static const CHANGE_STATE:String = "change state";
 
    private var _newState:int;
 
    public function StateEvent(type:String, newState:int, bubbles:Boolean = false, cancelable:Boolean = false) {
        super(type, bubbles, cancelable);
        _newState = newState;
    }
 
    public function get newState():int {
        return _newState;
    }
 
    // always create a clone() method for events in case you want to redispatch them.
    public override function clone():Event
    {
        return new StateEvent(type, newState, bubbles, cancelable);
    }
}
}

Старый 05.10.2015, 06:41
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Больше ничему не добавлен этот же обработчик? Вполне возможно, что он дергается по какому-то другому событию.
Я бы ради эксперимента попробовал еще явным образом привести к типу
Код AS3:
dispatchEvent(event as StateEvent);
Если и в этом случае отвалится, значит проблема вызвана чем-то другим. А в этом месте падает как следствие

п.с.
Вряд ли конечно проблема в "change state", но пробелов в таких делах лучше избегать

Старый 05.10.2015, 11:01
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 7  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Не, все проще, топикстартер забыл переопределить clone )
__________________
тут я

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Как это забыл то?
А это что?
Цитата:
Код AS3:
// always create a clone() method for events in case you want to redispatch them.
    public override function clone():Event
    {
        return new StateEvent(type, newState, bubbles, cancelable);
    }

Старый 05.10.2015, 12:50
Quadro9 вне форума Посмотреть профиль Отправить личное сообщение для Quadro9 Найти все сообщения от Quadro9
  № 9  
Ответить с цитированием
Quadro9

Регистрация: Sep 2015
Сообщений: 20
там выше код, без этого кусочка, а потом я выложил пофикшиную версию на память потомкам
вместе с Clone все работает как нужно

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

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

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


 


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


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