Форум программистов, компьютерный форум, киберфорум
ActionScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
6 / 5 / 1
Регистрация: 20.01.2016
Сообщений: 105
1

Как организовать большую часть кода в main?

09.05.2016, 16:43. Показов 874. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В main у меня создается 5 кнопок игрового меню и там же в main вешается слушатель и располагается обработчик. Действия 4ых из этих 5 кнопок довольно простые (написать текст, выйти и так далее). Но 1 кнопка "Play" там подразумевается много много кода (нарисовать поле, таверна выбора персонажей, магазин способностей и т.д. и т.п.) Правильно ли располагать весь этот код в main?

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
                            
                var btn_play:MyButtonClass = new MyButtonClass();
                btn_play.name = "btn_PLAY";
                btn_play.label = "Play";
                btn_play.addEventListener(MouseEvent.CLICK, btnMouseHandle);
                addChild(btn_play).y = 50;
                btn_play.x = 80
 
                var btn_opt:MyButtonClass = new MyButtonClass();
                
                //тут сократил код остальные 4 кнопки
                
                function btnMouseHandle(e:MouseEvent):void
                {
                    switch(e.target.name){
                        case "btn_PLAY":
                            var TestSWC:MovieClip = new WSymbol_mc;
                            removeChild(btn_play);
                            removeChild(btn_opt);
                            removeChild(btn_inst);
                            removeChild(btn_abt);
                            removeChild(btn_ext);
                            trace("btn_01 click");
                            TestSWC.x = 50;
                            TestSWC.y = 50;
                            addChild(TestSWC);
                            break;
                        case "btn_OPTIONS":
                            trace("btn_02 click");
                            break;
                        case "btn_INSTRUCTIONS":
                            trace("btn_03 click");
                            break;
                        case "btn_ABOUT":
                            trace("btn_04 click");
                            break;
                        case "btn_EXIT":
                            trace("btn_05 click");
                            fscommand('quit');
                            break;
                    }
                }
По case "btn_PLAY" уже видно что там будет много много кода. Чувствую что это не правильно, а как структурировать и организовать не могу понять, по причине пробелов с ООП и AS в частности.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2016, 16:43
Ответы с готовыми решениями:

Как спрятать большую часть кода
у меня есть массив 27*27 он очень громоздкий можно ли как нибудь облегчить файл program? может...

Какую именно часть кода заменить, чтобы организовать ручное заполнение матрицы?
Подсказали, чтобы мы самим вводить матрицу, нужно вот этот код: for (int row=0; row<m_Size;...

Как вытащить часть кода из кода страницы?
Знаю, что можно через json как-то. Вот например есть код страницы, на нем есть несколько одинаковых...

Как объявить функцию main в данном куске кода?
как объявить функцию main в данном куске кода? int len; char* str = "gpDWtrjHs5Oa2YSFiaTeoQ==";...

18
154 / 136 / 51
Регистрация: 28.11.2009
Сообщений: 460
Записей в блоге: 14
09.05.2016, 20:40 2
Darshi, для решения вашей проблемы можно вынести тот кусок кода по кнопке "Play" в отдельную функцию или класс.

Я в своих играх делал так: заводил отдельные классы под каждый экран игры (меню, игра, ачивки и т.п.), наследовал эти классы от Sprite.
В main только инициализация всех этих классов. В меню игры по кнопке play скрытие спрайта с меню и показ спрайта с игрой.
1
6 / 5 / 1
Регистрация: 20.01.2016
Сообщений: 105
10.05.2016, 13:46  [ТС] 3
Цитата Сообщение от Nikto Посмотреть сообщение
в отдельную функцию или класс
Функция в том же main?

Я в своих играх делал так: заводил отдельные классы под каждый экран игры (меню, игра, ачивки и т.п.), наследовал эти классы от Sprite.
В main только инициализация всех этих классов. В меню игры по кнопке play скрытие спрайта с меню и показ спрайта с игрой.
А вот это интересно, попробую, спасибо.
0
6 / 5 / 1
Регистрация: 20.01.2016
Сообщений: 105
12.05.2016, 19:17  [ТС] 4
При попытке из класс меню, скрыть себя же, выдает ошибку Access of undefined property.
В main обявил переменную для класса меню как public.
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.display.*;
    import flash.events.MouseEvent;
    import flash.system.fscommand;
    import flash.text.*;
    
    public class Main extends Sprite
    {
    
        public var MScreen:MenuScreen = new MenuScreen;
    
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            addChild(MScreen);
                
        }
 
    }
 
}
Сам класс меню:
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.display.*;
    import flash.events.MouseEvent;
    import flash.system.fscommand;
    import flash.text.*;
    
    public class MenuScreen extends Sprite 
    {
        var MyFrmt:TextFormat = new TextFormat();   
        var AboutText:TextField = new TextField();
        
        var btn_play:MyButtonClass = new MyButtonClass();
        var btn_opt:MyButtonClass = new MyButtonClass();
        var btn_inst:MyButtonClass = new MyButtonClass();
        var btn_abt:MyButtonClass = new MyButtonClass();
        var btn_ext:MyButtonClass = new MyButtonClass();
                
        public function MenuScreen() 
                {
                super();
                                
                    MyFrmt.font = "Times New Roman";
                    MyFrmt.size = 20;
                    MyFrmt.color = 0x000000;
                    
                    MyFrmt.align = TextFormatAlign.CENTER;
                    MyFrmt.leading = 10;
                    AboutText.defaultTextFormat = MyFrmt;
                    
                    AboutText.width = 550;
                    AboutText.height = 250;
                    AboutText.x = 225;
                    AboutText.y = 80;
                    AboutText.selectable = false;
                    AboutText.setTextFormat(MyFrmt);
                    addChild(AboutText);
                
                    btn_play.name = "btn_PLAY";
                    btn_play.label = "Play";
                    btn_play.addEventListener(MouseEvent.CLICK, btnMouseHandle);
                    addChild(btn_play).y = 50;
                    btn_play.x = 80
 
                    
                    btn_opt.name = "btn_OPTIONS";
                    btn_opt.label = "Options"
                    btn_opt.addEventListener(MouseEvent.CLICK, btnMouseHandle);
                    addChild(btn_opt).y = 100;
                    btn_opt.x = 80
 
                    
                    btn_inst.name = "btn_INSTRUCTIONS";
                    btn_inst.label = "Instructions"
                    btn_inst.addEventListener(MouseEvent.CLICK, btnMouseHandle);
                    addChild(btn_inst).y = 150;
                    btn_inst.x = 80
                    
                    
                    btn_abt.name = "btn_ABOUT";
                    btn_abt.label = "About"
                    btn_abt.addEventListener(MouseEvent.CLICK, btnMouseHandle);
                    addChild(btn_abt).y = 200;
                    btn_abt.x = 80
                    
                    
                    btn_ext.name = "btn_EXIT";
                    btn_ext.label = "Exit"
                    btn_ext.addEventListener(MouseEvent.CLICK, btnMouseHandle);
                    addChild(btn_ext).y = 250;
                    btn_ext.x = 80
                }
        
        function btnMouseHandle(e:MouseEvent):void
                {                   
                    switch(e.target.name){
                        case "btn_PLAY":
                            
                    removeChild(MScreen);
                     MScreen.visible = false;
                            
                            break;
                        case "btn_OPTIONS":
                            trace("btn_02 click");
                            break;
                        case "btn_INSTRUCTIONS":
                            trace("btn_03 click");
                            ShowTextBlock (e.target.name);
                            break;
                        case "btn_ABOUT":
                            trace("btn_04 click");
                            ShowTextBlock (e.target.name);
                            break;
                        case "btn_EXIT":
                            trace("btn_05 click");
                            fscommand('quit');
                            break;
                    }
                }
                
        function ShowTextBlock (strID:String):void
                {       
                        if (strID == "btn_INSTRUCTIONS")
                            {
                            trace("INS");
                            AboutText.text = "ТЕКСТ ДЛЯ ИНСТРУКЦИИ";
                            }
                        else 
                            {
                            trace("AB");
                            AboutText.text = "ТЕКСТ ДЛЯ ИНФО";
                            }
                }
        
    }
 
}
Вот в case для btn_PLAY ошибка на любую инструкцию. Где я был неправ?
0
154 / 136 / 51
Регистрация: 28.11.2009
Сообщений: 460
Записей в блоге: 14
13.05.2016, 16:59 5
Darshi, потому что надо так:
ActionScript 3
1
2
this.parent.removeChild(this);
//MScreen.visible = false; а эта инструкция вообще лишняя, если вы уже удалили объект со сцены, но правильно было бы this.visible = false;
1
Модератор
2904 / 1763 / 179
Регистрация: 19.02.2011
Сообщений: 6,477
14.05.2016, 21:55 6
Цитата Сообщение от Nikto Посмотреть сообщение
потому что надо так:
Цитата Сообщение от Nikto Посмотреть сообщение
this.parent.removeChild(this);
Так не надо. Дети не должны ничего знать о своих родителях. Это вам не реальная жизнь, а суровый мир боли детей-классов-сироток.
0
154 / 136 / 51
Регистрация: 28.11.2009
Сообщений: 460
Записей в блоге: 14
14.05.2016, 22:19 7
TanaTiX, а можете подсказать это по какому-то паттерну проектирования так делать нельзя? Или такие действия могут привести к каким-то последствиям при разработке?
0
Модератор
2904 / 1763 / 179
Регистрация: 19.02.2011
Сообщений: 6,477
15.05.2016, 15:07 8
Цитата Сообщение от Nikto Посмотреть сообщение
Или такие действия могут привести к каким-то последствиям при разработке?
Это просто логика. Если провести аналогию, то у вас получается, что машиной может управлять винтик. И да, такой подход может приводить к ошибкам: вы пытаетесь обратиться к объекту, а его уже нет - не должно быть в программировании суицидов.
1
6 / 5 / 1
Регистрация: 20.01.2016
Сообщений: 105
21.05.2016, 14:59  [ТС] 9
Подскажите, направьте, чувствую где то путаю и горожу неправильный код.
В Main нарисовал 5 кнопок. По клику на 1 кнопке Play, все остальные делаю removeChild, и делаю addChild своего класса на основе Sprite где игрок выбирает персонажа. Дальше стопарнулся, когда игрок выбрал таки персонажа. Опять в самом классе делать removeChild (всех персонажей, описаний и т.д.) и addChild (класса уже с локацией где начинается игра)?
0
154 / 136 / 51
Регистрация: 28.11.2009
Сообщений: 460
Записей в блоге: 14
21.05.2016, 15:34 10
Darshi, можно проще. Раз дальше идёт игра, делайте removeChild всего экрана с меню и addChild всего экрана с игрой
0
6 / 5 / 1
Регистрация: 20.01.2016
Сообщений: 105
21.05.2016, 18:50  [ТС] 11
Цитата Сообщение от Nikto Посмотреть сообщение
можно проще. Раз дальше идёт игра, делайте removeChild всего экрана с меню и addChild всего экрана с игрой
А это вообще правильный подход?
Из класса в котором отрисованно все меню, можно его самого remove?
0
154 / 136 / 51
Регистрация: 28.11.2009
Сообщений: 460
Записей в блоге: 14
21.05.2016, 18:55 12
Darshi, если хотите правильно, то создайте класс, который будет управлять экранами. В нём функцию changeScreen. Функция будет принимать имя экрана, и внутри функции и будут уже происходить все эти removeChild ненужных экранов и addChild нужных.
1
Модератор
2904 / 1763 / 179
Регистрация: 19.02.2011
Сообщений: 6,477
22.05.2016, 07:56 13
Цитата Сообщение от Nikto Посмотреть сообщение
Функция будет принимать имя экрана
Зачем функции имя экрана? Что бы потом искать экраны по имени?
0
154 / 136 / 51
Регистрация: 28.11.2009
Сообщений: 460
Записей в блоге: 14
22.05.2016, 11:16 14
TanaTiX, можно завести константы в которых будут хранится имена экранов. Иначе то как? Экраны по сути не имеют указателей друг на друга, но вполне возможно что знают имена друг друга.
0
Модератор
2904 / 1763 / 179
Регистрация: 19.02.2011
Сообщений: 6,477
22.05.2016, 14:13 15
Цитата Сообщение от Nikto Посмотреть сообщение
Иначе то как?
Что мешает передать класс? Из него сделать экземпляр нужного экрана/окна.
1
6 / 5 / 1
Регистрация: 20.01.2016
Сообщений: 105
24.05.2016, 16:03  [ТС] 16
Как в функции класса, удалить его самого со сцены?
0
154 / 136 / 51
Регистрация: 28.11.2009
Сообщений: 460
Записей в блоге: 14
24.05.2016, 22:18 17
Darshi,
ActionScript 3
1
this.parent.removeChild(this);
Но выше уже обсудили, что так делать не стоит.
0
6 / 5 / 1
Регистрация: 20.01.2016
Сообщений: 105
25.05.2016, 18:25  [ТС] 18
Цитата Сообщение от TanaTiX Посмотреть сообщение
Что мешает передать класс? Из него сделать экземпляр нужного экрана/окна.
Поясните а как это передать класс? Можно конструкцию кодом.
0
Модератор
2904 / 1763 / 179
Регистрация: 19.02.2011
Сообщений: 6,477
31.05.2016, 20:02 19
Цитата Сообщение от Darshi Посмотреть сообщение
Поясните а как это передать класс?
ActionScript 3
1
someMethod(className);//тут не имя класса, а именно ссылка на класс, хотя, в зависимости от задачи, можно и имя класса (строка) передать
И соответственно
ActionScript 3
1
public function someMethod(classToItem:Class):void{//...
0
31.05.2016, 20:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2016, 20:02
Помогаю со студенческими работами здесь

Скрыть бОльшую часть интерфейса программы
Здравствуйте. Есть база MS Access, где есть кнопочная форма (раздел "формы" - пункт "управление"),...

Яша не индексирует большую часть страниц сайта
Недавно повыпадали страницы каталога товаров на интернет-магазине: В частности из индекса пропали...

Где складируете большую часть логики приложения?
Задался тут на досуге вопросом, в x-page где разрабатывать логику приложений, я по старой привычке...

Переустановил ОС, ноут потерял большую часть функционала
Ноутбук Lenovo Y570 i5. Пол-года назад при попытке установки w10 с виндовс7 домашняя расширенная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru