Вход

Просмотр полной версии : Собственные события


neonoviiwolf
13.01.2016, 03:54
Доброго.
Начал читать про собственные события, гугл/Мук, но что-то я до конца так и не понял что и как работает. Вот отрывок из Мука

package
{
import flash.events.Event;

public class ToggleEvent extends Event
{
public static const TOGGLE:String = "toggle";
public var isOn:Boolean;

public function ToggleEvent(type:String,
bubblts:Boolean = false,
cancable:Boolean = false,
isOn:Boolean = false)
{
super(type, bubblts, cancable);
this.isOn = isOn;
}
public override function clone ():Event
{
return new ToggleEvent (type, bubbles, cancelable, isOn); //что мы туда возвращаем и зачем?
}

public override function toString ():String
{
return formatToString ("ToggleEvent", "bubbles",
"cancable", "EventPhase", "isOn");//А это вообще не пойму для чего нужно
}
}
}

Zebestov
13.01.2016, 05:52
public override function clone():Event {
return new ToggleEvent(type, bubbles, cancelable, isOn); //что мы туда возвращаем и зачем?
}

Если не переопределить метод clone(), то твое событие будет скопировано без этого самого isOn, ради которого (в данном примере) мы вообще создали собственный Event. Ты переопределяешь его, чтобы он возвращал копию себя не как Event(type, bubbles, cancelable) (по умолчанию), а именно как ToggleEvent(type, bubbles, cancelable, isOn). Следует отметить, что метод clone() вызывается порой неявно, так что переопределять его в кастомных события обязательно.


public override function toString():String {
return formatToString("ToggleEvent", "bubbles",
"cancable", "EventPhase", "isOn"); //А это вообще не пойму для чего нужно
}

А это для отладки. Не обязательно, но удобства может прибавить.

neonoviiwolf
13.01.2016, 15:26
Если не переопределить метод clone(), то твое событие будет скопировано без этого самого isOn, ради которого (в данном примере) мы вообще создали собственный Event. Ты переопределяешь его, чтобы он возвращал копию себя не как Event(type, bubbles, cancelable) (по умолчанию), а именно как ToggleEvent(type, bubbles, cancelable, isOn). Следует отметить, что метод clone() вызывается порой неявно, так что переопределять его в кастомных события обязательно.
Что значит "возвращал копию себя"?
А это для отладки. Не обязательно, но удобства может прибавить.
Если можно, приведите пример, хочу разобраться

Добавлено через 3 минуты
public static const TOGGLE:String = "toggle";
Почему String? Да, вываливает ошибку, если другой тип, но почему?
Мы же только тут и задаём значение "toggle", тут ведь можно написать что угодно?

Wolsh
13.01.2016, 15:59
Почему String? Да, вываливает ошибку, если другой тип, но почему?
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Если можно, приведите пример, хочу разобраться
trace(event);
Что значит "возвращал копию себя"?Каждый EventDispatcher в цепочке передачи события отдает подписчикам КОПИЮ полученного события, а не ссылку на некий изначальный объект (экземпляр) события. Почему? Да потому что любой объект может вносить изменения в полученное событие перед тем как отдать его дальше — например, записать свои данные в его свойства, которые интересуют следующего получателя. Но, если событие передавать как ссылку на один единственный объект, то предыдущие получатели события при обращении к его свойствам получат не изначальные — предназначенные для них, а обновленные после них значения, предназначенные не им.

Zebestov
13.01.2016, 16:21
Что значит "возвращал копию себя"?Этот метод возвращает клон события (неожиданное поведение для метода с таким названием, isn't it?) — новый экземпляр класса ToggleEvent, у которого type, bubbles и cancelable (а в нашем кастомном событии еще и isOn) такие же. Если не переопределишь, то это будет новый экземпляр уже другого класса — Event (без isOn), как и определено в суперклассе Event, от которого ты наследуешь свой ToggleEvent.

Если можно, приведите пример, хочу разобраться.
function onToggleEvent(event:ToggleEvent):void {
trace(event);
}

Почему String?
Потому что в Event определено, что type должен быть типа String. Разумеется, можно сделать свой собственный type не строковым. Тогда при передаче его в качестве аргумента конструктора суперкласса (вот этот вот super(…) у тебя в конструкторе) просто придется дописать к нему .toString() (или сделать из не строкового type строку еще каким-то своим индивидуальным способом). Вот только зачем это нужно, если type — является лишь меткой, позволяющей понять, что именно за событие произошло. Если твоему событию нужен какой-то идентификатор (а это таки бывает нужно, когда доходит до кастомных событий) — сделай его еще одним полем класса ToggleEvent точно так же, как это сделано с полем isOn.

Добавлено через 48 секунд
P.S. Как мы синхронненько :)

neonoviiwolf
14.01.2016, 02:36
спасибо, господа, что-то начинает прояснятся.
Вот код следующего класса из Мука, тот же пример идёт

package
{
import flash.display.Sprite;

public class ToggleSwitch extends Sprite
{
private var isOn:Boolean;

public function ToggleSwitch()
{
isOn = false;
}

public function toggle():void
{
isOn = !isOn;
dispatchEvent(new ToggleEvent(ToggleEvent.TOGGLE, true, false, isOn));//вот тут не ясно,
//мы тут получается в "ручную" объявляет о свершении события
//т.е. все слушатели, которые подписаны на это событие, получат его, так?
//Но чтобы объявить о событии, мы должны в ручную вызвать функцию "toggle()"?
}
}
}


а ещё натыкался где-то, что расширяют класс EventDispatcher, тогда как логика меняется?

Zebestov
14.01.2016, 03:21
//вот тут не ясно
Скорее дела обстоят так. Мы вызываем у экземпляра класса ToggleSwitch метод toggle(), который переключает туда-сюда состояние isOn. Так вот если бы не dispatchEvent(…), то все происходило бы по-тихому. Даже более: из-за того, что поле isOn приватное, о его состоянии снаружи вообще никак было бы не узнать (ну, за некоторым исключением, которое здесь несущественно).

Выходит, что при "щелчке" (вызове vетода toggle) согласно архитектуре приложения-примера из книжки нужно всякий раз сообщать всем заинтересованным*, что isOn сменил значение, и, что самое важное, еще и указать, какое именно значение сейчас имеет этот самый isOn. Это конечно лучше было сделать по-другому (в данном случае). Но для примера автор решил показать, как можно это значение передать через кастомное событие, которое не только сообщает смене значения определенного поля, но и содержит это значение.

* Под заинтересованными понимаются все, кто подписался на это событие от этого экземпляра класса ToggleSwitch или кого-то из его родителей, потому что ToggleSwitch наследуется от Sprite, а событие посылается с разрешением на "всплытие" — второй аргумент в конструкторе new ToggleEvent(…) — true.

caseyryan
14.01.2016, 09:23
а ещё натыкался где-то, что расширяют класс EventDispatcher, тогда как логика меняется?
У тебя класс расширяет спрайт. Спрайт тоже расширяет EventDispatcher в цепочке наследования, пллюс добавляяет возможности дисплей объекта. Так вот если тебе не нужно никуда на экран добавлять экземпляры класса, но нужно чтобы он умел отправлять и принимать события (например начала или окончания игры или события свзянные со звуком или сетью), то можешь вместо extends Sprite писать extends EventDispatcher

Wolsh
14.01.2016, 11:05
Мне кажется, это вопрос скорее о телепатии. Вопрос о том, откуда берутся события. Поскольку до того, как впервые сделать своё собственное событие, мы только ловили уже готовые, непонятно откуда взявшиеся, у многих новичков есть такое интуитивное "понимание", что события сами собой возникают и рассылаются "на каждый чих", типа — поменяли координату у клипа на 1 пиксель — можно поймать какое-то событие об этом в другом месте (подразумевается "в любом другом месте" ;) ), надо только понять, какое)) Необходимость посылать свое событие "вручную" кажется какой-то нелепостью, ведь до этого события нужны были, чтобы о чем-то "узнать", а тут получается какая-то "бессмысленная" система — узнал о чем-то –> послал событие. Потому что мозг еще не думает о том, что находится вне класса, о том что кто-то ТАМ хотел бы тоже "узнать" и именно для них мы создаем и посылаем Событие.

и да, функция таки должна называться switch (переключить, поменять состояние), а не toggle (традиционно используется для указания, что нужно сохранить, зафиксировать состояние)

neonoviiwolf
14.01.2016, 14:03
Wolsh значит вариант телепатии прокатит, если в класс добавить слушатель, к примеру, энтер_фрейм, с помощью которого мы будем проверять, поменялся ли isOn, и в случаи изменения - диспатчить событие, так? Я хочу уменьшить зависимости кода, как вариант правильно?

Wolsh
14.01.2016, 15:02
А в чем смысл то?
Всегда есть два правильных варианта.
1. Если этот isOn является публичным свойством, public var isOn, то его изменение происходит в тот момент, когда кто-то где-то пишет ..isOn = true; (например). То есть, в этот самый момент в этом самом месте мы ТОЧНО знаем, что isOn изменился, и можем послать Событие.
2. Если isOn оформлен как сеттер/геттер, мы можем послать Событие из сеттера, то есть опять же оттуда, где происходит его изменение. То же касается и функции типа вашей toggle().
Так какой смысл проверять его значение 60 раз в секунду, если Вы точно "знаете" где и когда он может быть изменен? Ведь это изменение не где-то в тени происходит по волшебству, неожиданно для кода. Был isOn true и ВДРУГ РРАЗ! — и сам собой стал false? Да нет же. Это ВЫ в своем коде сделали его false, и прекрасно знаете где.

caseyryan
14.01.2016, 18:32
и да, функция таки должна называться switch (переключить, поменять состояние), а не toggle (традиционно используется для указания, что нужно сохранить, зафиксировать состояние)
Вот только switch - это зарезервированное слово, сдается мне, что проблемы вылезут еще на этапе компиляии. Хотя не проверял)

neonoviiwolf
18.01.2016, 16:21
Более-менее стало понятно, но написав собственное событие, выдаёт странную ошибку


package Event
{
import flash.events.Event;


public class StartStopReset extends Event
{
public static var NEW_START:String = "newStart";
public static var ANEW:String = "anew";
public static var STOP:String = "stop";

public function StartStopReset(type:String, bubbles:Boolean, cancable:Boolean);
{
super (type, bubbles, cancelable);
}

public override function clone ():Event
{
return new StartStopReset (type, bubbles, cancelable);
}

public override function toString ():String
{
return formatToString ("StartStopReset", "bubbles",
"cancable", "EventPhase");
}
}
}


package Event
{
import flash.display.Sprite;

public class SwitchEvent extends Sprite
{

public function SwitchEvent()
{
}

public function play ():void
{
dispatchEvent(new StartStopReset.NEW_START, true, false);
}
public function anew():void
{
dispatchEvent (new StartStopReset.ANEW, true, false);
}

public function stop ():void
{
dispatchEvent (new StartStopReset.STOP, true, false);
}
}
}

так подписываюсь

var startStopReset:SwitchEvent = new SwitchEvent();
startStopReset.addEventListener(new StartStopReset.NEW_START, newStart);

в итоге при сборке выдаёт
src\Event\StartStopReset.as(15): col: 4 Error: A super statement can be used only inside class instance constructors.
Так вроде бы в конструкторе super вызывается, что я сделал не правильно или снова что-то не понял?

caseyryan
18.01.2016, 16:26
Потому что ты пишешь
new StartStopReset.NEW_START
А надо
new StartStopReset(StartStopEvent.NEW_START)

neonoviiwolf
18.01.2016, 16:35
поправил, ошибка таже

package Event
{
import flash.display.Sprite;

public class SwitchEvent extends Sprite
{

public function SwitchEvent()
{
}

public function play ():void
{
dispatchEvent(new StartStopReset(StartStopReset.NEW_START, true, false));
}
public function anew():void
{
dispatchEvent (new StartStopReset(StartStopReset.ANEW, true, false));
}

public function stop ():void
{
dispatchEvent (new StartStopReset(StartStopReset.STOP, true, false));
}
}
}

KBAC
18.01.2016, 16:41
Точка с запятой лишняя:

public function StartStopReset(type:String, bubbles:Boolean, cancable:Boolean);

Zebestov
18.01.2016, 16:43
Убери точку с запятой в этой строке:
public function StartStopReset(type:String, bubbles:Boolean, cancable:Boolean);

neonoviiwolf
19.01.2016, 03:19
Спасибо всем! чёт я слепой
дальше все поправил и теперь вуаля, вообще никакие слушатели не рабоют
вот отрывок из класса, где создаётся слушатель

import Event.StartStopReset;
import Event.SwitchEvent;
public function PlayGame()
{
space = SpaceSingleton.getSpaceSingleton.getSpace;

cat = CatSingleton.getCatSingleton.getCat;
//вектор Mouse
vectorMouse = MouseSingleton.getMouseSingleton.getVectorMouse;
//вектор BalloonMouse
vectorBallonMouse = MouseBalloonSingleton.getMouseBalloonSingleton.getVectorMouse;
// pointerAndRoundSpeed
pointerAndRoundSpeed = PointerAndRoundSpeedSingleton.getPointerAndRoundSpeedSingleton.getPointerAndRoundSpeed;
//
speedometer = SpeedometerSingleton.getSpeedometerSingleton.getSpeedometer;

postMenu = PostMenuSingleton.getPostMenuSingleton.getPostMenu;

speedWorld = SpeedWorldSingleton.getSpeedWorldSingleton.getSpeedWorkd;

addEventListener(Event.ADDED_TO_STAGE, init); //тут как и во всех слушателях пишет "D:\FatCat\Main\src\ObjactGame\PlayGame\PlayGame.as(58): col: 27 Error: Access of undefined property ADDED_TO_STAGE in package Event.

}
private var startMenu:StartMenu;

private function init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);//тут как и во всех слушателях пишет "D:\FatCat\Main\src\ObjactGame\PlayGame\PlayGame.as(58): col: 27 Error: Access of undefined property ADDED_TO_STAGE in package Event.
//начальное меню
var _startMenuSingleton:StartMenuSingleton = StartMenuSingleton.getStartMenuSingleton;
startMenu = _startMenuSingleton.getStartMenu;
addChild(startMenu);
stage.addEventListener(MouseEvent.CLICK, clickStartMenu);

startStopReset = new SwitchEvent();
startStopReset.addEventListener(new StartStopReset.NEW_START, newStart);//а тут пишет D:\FatCat\Main\src\ObjactGame\PlayGame\PlayGame.as(73): col: 55 Error: Attempted access of inaccessible method NEW_START through a reference with static type Class.
}
private function newStart(e:StartStopReset):void
{
trace(123);
}



Добавлено через 2 минуты
Ему верхние два импорта не нравятся, если их удалить вместе с своим событием, то всё становится как раньше - работате

Добавлено через 3 минуты
так сейчас выглядят остальные классы

package Event
{
import flash.events.Event;


public class StartStopReset extends Event
{
public static const NEW_START:String = "newStart";
public static const ANEW:String = "anew";
public static const STOP:String = "stop";

public function StartStopReset(type:String, bubbles:Boolean, cancable:Boolean)
{
super (type, bubbles, cancelable);
}

public override function clone ():Event
{
return new StartStopReset (type, bubbles, cancelable);
}

public override function toString ():String
{
return formatToString ("StartStopReset", "bubbles",
"cancable", "EventPhase");
}
}
}


package Event
{
import flash.display.Sprite;

public class SwitchEvent extends Sprite
{

public function SwitchEvent()
{
}

public function play ():void
{
dispatchEvent(new StartStopReset(StartStopReset.NEW_START, true, false));
}
public function anew():void
{
dispatchEvent (new StartStopReset(StartStopReset.ANEW, true, false));
}

public function stop ():void
{
dispatchEvent (new StartStopReset(StartStopReset.STOP, true, false));
}
}
}

Wolsh
19.01.2016, 03:27
А ничо, что у Вас первый класс даже не объявлен?

neonoviiwolf
19.01.2016, 03:36
А ничо, что у Вас первый класс даже не объявлен?
если вы про public function PlayGame(), то там написано сверху, что это отрывjк, т.е. там лишь 2 импорта новых, конструктор и функция init()

Добавлено через 1 минуту
я могу её всю выложить, но там довольно много того, что не имеет никакого значения в данном вопросе, более того, вся работа как раз связана с тем, чтобы её как раз упростить, так как она явный костыль изначально

Wolsh
19.01.2016, 08:59
import Event.StartStopReset;
import Event.SwitchEvent; найдите другое слово для названия пакета.

Zebestov
19.01.2016, 12:02
1. Event — это уже есть такой класс: flash.events.Event. А ты заставил компилятор понимать это слово как твой пак с кастомными событиями. Разумеется, можно выкрутиться и при каждом "Event.ADDED_TO_STAGE" писать "flash.events.Event.ADDED_TO_STAGE", но лучше раз и навсегда переименовать пак "Event" в какие-то "events" (и да, паки строчными буквами пишутся).

2. В этом месте "startStopReset.addEventListener(new StartStopReset.NEW_START, newStart);" не нужен "new". NEW_START — это не конструктор класса, а статическое поле, тип события, метка, строчка с названием события, за которым будем следить. Мне кажется тебе нужно сделать паузу на каких-то полчаса и еще раз внимательно прочитать доки по Event (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/events/Event.html) и EventDispatcher (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/events/EventDispatcher.html). Ты делаешь совершенно простые ошибки только потому, что крадешься на ощупь.

neonoviiwolf
20.01.2016, 13:14
Спасибо
Я новичок+забросил флеш на пол года, надобно быть более внимательным

И с нова косяк, ну тут я вообще не понимаю, должно работать
Не могу поймать событие, хотя диспатчится и возвращает true
скину все, в каком виде сейчас
Своё событие

package EventClass
{
import flash.events.Event;


public class StartStopReset extends Event
{
public static const NEW_START:String = "newStart";
public static const ANEW:String = "anew";
public static const STOP:String = "stop";

public function StartStopReset(type:String, bubbles:Boolean, cancable:Boolean)
{
super (type, bubbles, cancelable);
}

public override function clone ():Event
{
return new StartStopReset (type, bubbles, cancelable);
}

public override function toString ():String
{
return formatToString ("StartStopReset", "bubbles",
"cancable", "EventPhase");
}
}
}

класс, который отправляет события

package EventClass
{
import flash.display.Sprite;

public class SwitchEvent extends Sprite
{

public function SwitchEvent()
{
}

public function newStart():void
{
dispatchEvent(new StartStopReset(StartStopReset.NEW_START, true, false));
}

public function anew():void
{
dispatchEvent(new StartStopReset(StartStopReset.ANEW, true, false));
}

public function stop():void
{
dispatchEvent(new StartStopReset(StartStopReset.STOP, true, false));
}
}
}

вот класс игрового меню (родитель Sprite), мы нажимает на кнопку, в зависимости от нажатой кнопки должно отсылаться своё событие. Для примера только одна кнопка

package Singleton.StartMenuSingleton.StartMenu
{
import EventClass.StartStopReset;
import EventClass.SwitchEvent;
import flash.events.Event;
import flash.events.MouseEvent;
import Singleton.StartMenuSingleton.StartMenu.StartButton.StartButton;

public class StartMenu extends startMenu_mc
{

public function StartMenu()
{
x = 400;
y = 225;
addEventListener(Event.ADDED_TO_STAGE, init);
}

private static var startButton:StartButton = new StartButton();
private function init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

this.addChild(startButton);
startButton.addEventListener(MouseEvent.CLICK, clickStartButton);
}
private var switchEvent:SwitchEvent = new SwitchEvent();

private function clickStartButton(e:MouseEvent):void
{
switchEvent.newStart(); //тут вызывается функция класса для создания своего события
}

public function get getStartButton ():startButton_mc
{
return startButton;
}
}
}


в этом классе я жду события

package ObjactGame.PlayGame
{

import EventClass.StartStopReset;
import EventClass.SwitchEvent;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import nape.space.Space;
import ObjactGame.ActionObject.ControlUser;
import ObjactGame.PositionObject.PositionObject;
import Singleton.CatSingleton.CatBody.CatBody;
import Singleton.CatSingleton.CatSingleton;
import Singleton.MouseBalloonSingleton.MouseBalloonSingleton;
import Singleton.MouseSingleton.MouseSingleton;
import Singleton.PostMenuSingleton.PostMenu.PostMenu;
import Singleton.PostMenuSingleton.PostMenuSingleton;
import Singleton.Space.SpaceSingleton;
import Singleton.SpeedometerSingleton.Speedometer.Speedometer;
import Singleton.SpeedometerSingleton.SpeedometerSingleton;
import Singleton.SpeedWorld.SpeedWorld.SpeedWorld;
import Singleton.SpeedWorld.SpeedWorldSingleton;
import Singleton.StartMenuSingleton.StartMenu.StartMenu;
import Singleton.StartMenuSingleton.StartMenuSingleton;
import Singleton.PointerAndRoundSpeedSingleton.PointerAndRoundSpeed.PointerAndRoundSpeed;
import Singleton.PointerAndRoundSpeedSingleton.PointerAndRoundSpeedSingleton;

public class PlayGame extends Sprite
{
private var space:Space;
private var cat:CatBody;
private var vectorMouse:Vector.<Object>;
private var vectorBallonMouse:Vector.<Object>;
private var pointerAndRoundSpeed:PointerAndRoundSpeed;
private var speedometer:Speedometer;
private var postMenu:PostMenu;
private var speedWorld:SpeedWorld;
private var positionObject:PositionObject = new PositionObject();

public function PlayGame()
{
space = SpaceSingleton.getSpaceSingleton.getSpace;

cat = CatSingleton.getCatSingleton.getCat;
//вектор Mouse
vectorMouse = MouseSingleton.getMouseSingleton.getVectorMouse;
//вектор BalloonMouse
vectorBallonMouse = MouseBalloonSingleton.getMouseBalloonSingleton.getVectorMouse;
// pointerAndRoundSpeed
pointerAndRoundSpeed = PointerAndRoundSpeedSingleton.getPointerAndRoundSpeedSingleton.getPointerAndRoundSpeed;
//
speedometer = SpeedometerSingleton.getSpeedometerSingleton.getSpeedometer;

postMenu = PostMenuSingleton.getPostMenuSingleton.getPostMenu;

speedWorld = SpeedWorldSingleton.getSpeedWorldSingleton.getSpeedWorkd;

addEventListener(Event.ADDED_TO_STAGE, init);

}
private var startMenu:StartMenu;

private function init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//начальное меню
var _startMenuSingleton:StartMenuSingleton = StartMenuSingleton.getStartMenuSingleton;
startMenu = _startMenuSingleton.getStartMenu;
addChild(startMenu);
//stage.addEventListener(MouseEvent.CLICK, clickStartMenu);
///////
this.addEventListener(StartStopReset.NEW_START, newStart);//создаю слушателя
//слушатель есть, но он чёт глухой
///////
}


private function newStart(e:StartStopReset):void
{
trace(122223);
}

private var controlUser:ControlUser;

private function clickStartMenu(e:MouseEvent):void
{
if ((e.target == startMenu.getStartButton) && (startMenu.stage != null))
{
removeChild(startMenu);
cat.visible = true;
stage.addChild(pointerAndRoundSpeed);
addChild(speedometer);
controlUser = new ControlUser();
this.addChild(controlUser);
}
if (pointerAndRoundSpeed.stage != null)
{
controlUser.addEvent();//добавляет слушателей
speedWorld.setSpeedWorld = speedWorld.getMaxSpeedWorld * pointerAndRoundSpeed.getPointer;
stage.removeChild(pointerAndRoundSpeed);
addEventListener(Event.ENTER_FRAME, updateSpace);
}
if ((e.target == postMenu.getResetButton) && (postMenu.stage != null))
{
stage.removeChild(postMenu);
stage.addChild(pointerAndRoundSpeed);
positionObject.defoltPosition();
cat.visible = true;
}
}

private function updateSpace(e:Event):void
{
space.step(1 / stage.frameRate);
if ((speedWorld.getSpeedWorld == 0) && (pointerAndRoundSpeed.stage == null))
{
stage.addChild(postMenu);
removeEventListener(Event.ENTER_FRAME, updateSpace);
controlUser.removeEvent();
}
}
}
}


Добавлено через 1 час 35 минут
Сам решил, хотя так и не понял, почему не работает
класс SwitchEvent исключил и диспатчу событие сразу из StartMenu, должно быть без разницы, но увы, вместо
switchEvent.newStart();
сразу пишу
dispatchEvent(new StartStopReset (StartStopReset.NEW_START, true, false));
тогда начинает работать
хотел прост сделать отдельный класс, в котором собраны необходимые события, было бы удобно. Мож я где-то что-то недопонимаю, может SwitchEvent нужно было наследовать от Sprite (так делал изначально) и добавлять класс на сцену (изначально не добавлял на сцену, так как зачем?)

Zebestov
20.01.2016, 15:16
вместо … сразу пишу … тогда начинает работать
Так и должно работать. Дело в том, что в первом варианте событие посылал не твой StartMenu, а SwitchEvent, который ввиду его отсутствия на сцене (ты же нигде его не добавляешь) никакого всплытия своим событиям не обеспечил. Вот и выходит, что все работает, но только если подписаться на сам SwitchEvent. Ты просто допустил архитектурную ошибку, добавив методы newStart(), anew() и stop() в отдельный класс. Им самое место в классе StartMenu.
хотел прост сделать отдельный класс, в котором собраны необходимые события, было бы удобно.
И у тебя это вышло. Все норм.
Мож я где-то что-то недопонимаю, может SwitchEvent нужно было наследовать от Sprite.
Нет, его просто нужно удалить как ненужное звено.

Добавлено через 5 минут
Теперь немного о вещах, которые режут глаз.

1. package EventClass
Понимай package как папки на компе. Это просто хранилище классов, но ни в коем случае не сам класс. Их принято именовать строчными латинскими символами без каких либо "-", "_" и т.д. В данном случае логично было бы как минимум назвать пак "events", чтобы стало понятно, что за классы лежат у тебя в этой папке.

2. public class StartStopReset extends Event
Класс, наследуемый от Event логично бы как-то обозначить как событие, поэтому прямо просится назвать его как минимум StartStopResetEvent.

neonoviiwolf
20.01.2016, 15:44
Zebestov спасибо
По названием учту