Форум 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=197609)

zzSpirit 10.04.2013 04:57

Структура написания приложения
 
Здравствуйте, уважаемые программисты!
После процедурного программирования все не могу понять, как всетаки начать писать игру...
До паттернов еще не дошел, хочу что-нибудь простенькое для себя пока написать, что бы убрать непонятки.

К примеру, у меня в игре есть меню и сама игра. Пробовал сделать 2 класса Menu и Game и вызывать их из главного класса, но тут возникает проблема - приходится передавать ссылки на класс Main и на прочие...

Решил сделать такую структуру:
Код AS3:

package sources
{
        import flash.display.*;
        import flash.events.*;
 
        public class Main extends Sprite
        {
                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);
                        // тут инициализация
                        menu();
                }
 
                private function menu():void
                {
// тут главное меню
                }
 
                private function game():void
                {
// тут код игры
                        function somethingFunction(e:Event):void
                        {
                        }
                        function enterFrameHandler(e:Event):void
                        {
                        }
                }
 
        }
}

Но тут мне не нравится что все в одном классе, получится слишком длинный код в итоге, где сложно что-то найти поменять и т.д. + неудобно что у меня функции somethingFunction() и enterFrameHandler() располагаются в методе game(). А если я вынесу их за пределы метода game() - то теряется структура и читаемость кода, хотя так читаемость кода тоже не очень хорошая.

Кто как делает?

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

Wolsh 10.04.2013 05:55

Цитата:

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

Babylon 10.04.2013 06:14

ООП предполагает наличие объекта, над которым производятся какие то процедуры. Например, в JS большая сложная функция jQuery работает над DOM. В AS это Object поэтому от "процедурного" программирования Вы никуда не уйдете. Только процедуры называются функциями и работают они по большей частью со ссылками на разные объекты:) Нарисовали бы логику для начала по-детальнее - что куда? Так и замысел ваш станет более понятен вам самому, а за ним и умысел увидим.

zzSpirit 10.04.2013 06:54

Цитата:

Сообщение от Wolsh (Сообщение 1129066)
Приходится? Кому и зачем они вдруг понадобились?

Недавно я писал *****код, в котором передал ссылку на Main в класс Game, чтобы там создать экземпляр класса APIConnection (vkontakte api). Все получилось и даже выполнял запросы, хотя код очень корявый.

Зачем я так сделал? Перед этим я создавал экземпляр APIConnection в Main классе и передавал ссылку на экземпляр в экземпляр класса Game, но это выдало несколько ошибок, причем не в моих классах, а в классах VK... Понял что это неправильно и так больше делать не стал.

Теперь понял что все это бред и все это надо писать в классе Main. Только код то длинный получается, я в нем начинаю путаться, а если ошибки возникать начинают, в которых компилятор не указывает номер строки - то я полчаса мучаюсь с этим кодом и в итоге создаю новый проект и пишу все снова.

А если так писать всю игру - то несколько тысяч строк кода в классе Main будет в итоге - так и должно быть?

Добавлено через 11 минут
Цитата:

Сообщение от Babylon (Сообщение 1129068)
ООП предполагает наличие объекта, над которым производятся какие то процедуры. Например, в JS большая сложная функция jQuery работает над DOM. В AS это Object поэтому от "процедурного" программирования Вы никуда не уйдете. Только процедуры называются функциями и работают они по большей частью со ссылками на разные объекты:) Нарисовали бы логику для начала по-детальнее - что куда? Так и замысел ваш станет более понятен вам самому, а за ним и умысел увидим.

Вроде бы все понятно, но ведь в главном файле код получится на несколько тысяч строк кода - меня это пугает, т.к. сложно найти ошибку и очень запутанно все будет. Еще методы VK.api работают так, что они не возращают значение в переменную, а вызывают 1 функцию при удаче и другую при неудаче. И у меня получается куча функций, куча api-запросов, причем в этих функциях по одной строчке кода. То есть идет запрос, потом функция возврата значения, потом функция ошибки, потом опять запрос и т.д.

В общем куча таких непоняток, которые мне кайф от программирования прям ломают.
Никакого прогресса, стою на месте, сдвинуться не могу, т.к. не понимаю куда двигаться. Но спать не иду :)

Babylon 10.04.2013 09:28

В вашем словесном потоке очень трудно разобраться, а значит и помочь вам. Код в студию и комменты к нему. А вообще есть видеокурсы по программированию на апи вк. Согласен, апи неидеально, но вполне се работоспособно :)

iflamberg 10.04.2013 13:44

Я уже много раз говорил. Не придумывайте велосипеды. Сначала посмотрите как работают чужие. Изучите движки, как там построено, почитайте туторы по играм. Зачем мучаться? Один уже помучался - скопируйте его наработки.

MikroAcse 10.04.2013 13:49

А я использую кастрированный MVC без модели. Т.е. главный класс создает Controller, который загружает и парсит данные, а потом создает вьюшку, которая использует состояния для отображения (MenuState, GameState extends acse.display.State).
Получается очень простая структура.

in4core 10.04.2013 16:20

Цитата:

А я использую кастрированный MVC без модели
Это не MVC .
Это другой паттерн :) Это паттерн пылесос : vacuum cleaner :faceplam

Gaen 10.04.2013 23:45

Цитата:

Сообщение от zzSpirit (Сообщение 1129071)
несколько тысяч строк кода в классе Main будет в итоге - так и должно быть?

Так быть не должно, Б-же упаси от такого.

Код должен быть разбит по мелким и понятным классам. Объекты создаются по мере надобности. Тот, кто создал объект, дергает его методы и слушает его события. Созданный объект ничего не знает о своем создателе и шлет наверх события в надежде, что их кто-то услышит.

Цитата:

Перед этим я создавал экземпляр APIConnection в Main классе и передавал ссылку на экземпляр в экземпляр класса Game, но это выдало несколько ошибок, причем не в моих классах, а в классах VK... Понял что это неправильно и так больше делать не стал.
Создавать APIConnection в Main и передавать его в Game - это как раз очень правильно, вы зря отказались от этого направления. То, что RTE вылетело из библиотеки вконтакта, еще не означает, что ошибка там. Скорее всего, вы кормите туда кривые данные. Продолжайте копать (:

zzSpirit 12.04.2013 04:02

Наверное лучший совет:
Цитата:

Сообщение от iflamberg (Сообщение 1129116)
Я уже много раз говорил. Не придумывайте велосипеды. Сначала посмотрите как работают чужие. Изучите движки, как там построено, почитайте туторы по играм. Зачем мучаться? Один уже помучался - скопируйте его наработки.

Действительно, когда смотрю чужие коды, туторы и т.д. - много вопросов сами с собой решаются и это большое удовольствие мне приносит. Иногда бывает даже создаю новую тему с вопросом, пока сформулирую вопрос и пока попробую написать код чтобы показать в чем проблема - вопрос решается.

Код AS3:

В вашем словесном потоке очень трудно разобраться, а значит и помочь вам. Код в студию и комменты к нему. А вообще есть видеокурсы по программированию на апи вк. Согласен, апи неидеально, но вполне се работоспособно

Да хрен с ним, с кодом, уже это все не так важно :)

В общем, забью на лень и буду все подряд по теме изучать. iflameberg похоже наставил меня на путь истинный :)
Всем спасибо.

Добавлено через 22 минуты
А хотя, убежусь кое в чем, пользуясь случаем:
Цитата:

Сообщение от Gaen (Сообщение 1129205)
Так быть не должно, Б-же упаси от такого.
Код должен быть разбит по мелким и понятным классам. Объекты создаются по мере надобности. Тот, кто создал объект, дергает его методы и слушает его события. Созданный объект ничего не знает о своем создателе и шлет наверх события в надежде, что их кто-то услышит.

Это я и так знал, но спасибо за то что напомнил об этом и я лучше все обдумал сейчас о структуре.
Цитата:

Создавать APIConnection в Main и передавать его в Game - это как раз очень правильно, вы зря отказались от этого направления. То, что RTE вылетело из библиотеки вконтакта, еще не означает, что ошибка там. Скорее всего, вы кормите туда кривые данные. Продолжайте копать (:
Вроде бы данные были правильные, т.к. в Main запросы работали, в Game - нет, хотя если передать Main ссылкой в Game или написать parent.stage и т.д. - все работало. Ладно, фиг с ним, ща это не так важно, сам разберусь думаю.

Меня очень волнует - правилен ли сам подход такой? прям не терпится узнать... Описываю:
если бы я делал кадрами - то я бы сделал на первом кадре экран загрузки, на втором меню, на третьем игру, на четвертом магазин...
Правильно ли сделать также классами(вместо каждого кадра по классу), что бы не писать все это в главном классе?
То есть у меня будет главный класс Main, который будет создавать экземпляры след. классов и запускать их:
  • Main - главный класс, который запускает все остальные
  • LoadGame - экран загрузки игры
  • Menu - меню игры
  • Game - сама игра
  • Shop - магазин игры

То есть Main первым делом запускает загрузку и слушает ее, как игра загрузилась, делаем LoadGame = null, чтоб не засорять память и создаем класс Menu... Блин, вот опять лажа получилась. Как я из класса Menu вызову класс Game, не используя parent?
Также, при выходе из класса Game как я скажу классу Main чтоб он обнулил класс Game и запустил класс Menu? Хм... По идее Main слушает все классы, но я не пойму как сделать прослушивание не покадрово, не с какой-то переодичностью типа таймера, а чтоб память не засорялась. Т.е. чтоб прослушка не была ежесекундной к примеру, а чтоб Game сказал классу Main что игра окончилась и все, а не было постоянной проверки окончилась ли игра, в игре ведь и так расчетов много очень, нефиг проц грузить.

Кароче нифига я не знаю, фигню понаписал, буду исходники изучать... Но если ответите как это теоритически все работает - очень рад буду. А то пока не пойму как это работает - к паттернам как-то очень хочется переходить, т.к. напишу код, я в нем путаюсь, мне он не нравится, он становится большим - удаляю, замучился уже.

Ну ладно, iflamberg дал мне совет, воспользуюсь им...


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

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