Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как правильно сделать "переключатель" для игровых экранов? (http://www.flasher.ru/forum/showthread.php?t=212903)

Azrael 24.05.2016 19:37

Как правильно сделать "переключатель" для игровых экранов?
 
1 экран - меню
2 экран - выбор персонажа
3 экран - выбор снаряжения
4 экран - игра

Скажите как правильно работать с экранами, может есть какой то урок на эту тему. Мне приходит в голову каждый экран создать классом на базе sprite, и из меню по onClick делать addChild(например 2 экран). Далее я выбрал персонажа и опять же по onClick что я делаю? Как правильно удалить себя со сцены и добавить следующий?

faraday 24.05.2016 19:41

синглтон Layers с методами showChar, showGame, showMenu в данном случае пожалуй самый удобный вариант

undefined 24.05.2016 20:02

либо экраны имплементят интерфейс IShowable с методами show/hide + класс StageMediator,хранящий ссылку на stage/root и добавляющий экраны когда надо.

Azrael 26.05.2016 18:17

Цитата:

Сообщение от undefined (Сообщение 1194288)
либо экраны имплементят интерфейс IShowable с методами show/hide + класс StageMediator,хранящий ссылку на stage/root и добавляющий экраны когда надо.

А можно чуть более подробнее.

Если в main.as написать функцию которая будет делать addChild и removeChild по переданому ей параметру, а параметром будет выступать класс экрана. То как в AS передавать этот класс функции?

undefined 26.05.2016 19:19

в as есть класс Class,но лучше его не использовать т.к. с его помощью можно передать в функцию все что угодно.Правильнее будет завести класс или интерфейс Showable от которого и наследовать все экраны и передавать не класс, а экземпляр класса.

Azrael 26.05.2016 19:59

Цитата:

Сообщение от undefined (Сообщение 1194316)
в as есть класс Class,но лучше его не использовать т.к. с его помощью можно передать в функцию все что угодно.

Можно пример как передать класс Menu с помощью Class?

Цитата:

Сообщение от undefined (Сообщение 1194316)
Правильнее будет завести класс или интерфейс Showable от которого и наследовать все экраны и передавать не класс, а экземпляр класса.

Мне не понятно как передавать классы или экземпляры классов в функцию, я пока тока разбираюсь с AS. Пример можно.

undefined 26.05.2016 20:52

передача класса в метод:
Код AS3:

private function someMethod(someClass:Class) {
..
}
someMethod(Object);

Передача экземпляра класса:
Код AS3:

private function someMethod(screen:Showable) {
..
}
var myScreen:Showable=new MyScreen();// класс MyScreen наследует/имплементирует класс/интерфейс Showable
someMethod(myScreen);


Azrael 27.05.2016 22:19

Цитата:

Сообщение от undefined (Сообщение 1194319)
передача класса в метод:
Код AS3:

private function someMethod(someClass:Class) {
..
}
someMethod(Object);


Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.display.*;
 
        public class Main extends Sprite
        {       
                var MenuScreen:Menu = new Menu();
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        ShowScreen(MenuScreen);
                }
                public function ShowScreen(Screen:Class)
                {
                        addChild(Screen);
                }
        }
}

Выдает ошибку Implicit coercion of a value of type Menu to an unrelated type Class. Что не так сделал?


Цитата:

Сообщение от undefined (Сообщение 1194319)
Передача экземпляра класса:
Код AS3:

private function someMethod(screen:Showable) {
..
}
var myScreen:Showable=new MyScreen();// класс MyScreen наследует/имплементирует класс/интерфейс Showable
someMethod(myScreen);


А зачем нужно наследовать/имплементировать? Нельзя просто в функцию передавать параметр который нужно и который функция будет делать addChild?

undefined 28.05.2016 13:33

у тебя классическая путаница понятий класс/экземпляр класса.Советую таки почитать что-нибудь по ооп чтоб не плавать в терминологии(хоть мука того же самого).Например что делает эта строка:
Код AS3:

var MenuScreen:Menu = new Menu();

1)Создает переменную с именем MenuScreen, которая может содержать ссылку на экземпляр класса Menu.Альтернативно можно сказать может содержать ссылку на экземпляр объекта типа Menu.Слова "класс" и "тип данных" в большинстве случаев взаимозаменяемые, также как "экземпляр класса N"/"объект типа N".
2)Создается экземпляр\объект класса/типа Menu(new Menu()), ссылка на свежесозданный объект кладется в переменную MenuScreen.
Короче класс - это просто описание типа данных(какую информацию он содержит и что может с ней делать).Экземпляр класса - то, что получается в результате работы оператора new.Т.е. классов обычно немного, а объекты могут штамповаться сотнями.
Дальше
Цитата:

Выдает ошибку Implicit coercion of a value of type Menu to an unrelated type Class. Что не так сделал?
Это потому что ты спрашивал как тебе передать класс в метод(в as для этого есть специальный тип данных Class),а ты туда передаешь экземпляр класса Menu.Если совсем не хочется запариваться - пиши
Код AS3:

public function ShowScreen(Screen:Menu)

Т.е. метод ожидает что ему дадут на вход ссылку на объект типа Menu.
Цитата:

А зачем нужно наследовать/имплементировать?
Наверно это пока рано.

Azrael 28.05.2016 14:42

Цитата:

Сообщение от undefined (Сообщение 1194349)
Наверно это пока рано.

Наследовать надо что бы можно было передать разные экземпляры (разные экраны) разных классов? То есть если остальные экраны будут расширять Menu я смогу и их передавть в:

Код AS1/AS2:

public function ShowScreen(Screen:Menu)

?

Спасибо за развернутый ответ!


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

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