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

vineda 28.07.2011 23:50

Разделение на классы
 
Написал небольшую игру, 170 строк кода, все в одном классе. Можете посоветовать, стоит ли разделить ее на отдельные классы?
Код AS3:

package 
{
        import flash.display.Loader;
        import flash.display.MorphShape;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
        import flash.net.URLRequest;
        import flash.system.LoaderContext;
        import flash.system.ApplicationDomain;
        import flash.utils.*;
 
        /**
        * ...
        * @author me
        */

        public class Main extends Sprite
        {
                private var loader: Loader = new Loader();
                private var bars: Array = new Array();                                    //все барельефы
                private var puttedBars: Array = new Array();                              //барельефы, поставленые на свободные места
                private var correctBars: Array = new Array();                              //правильная комбинация
 
                private var place: MovieClip;
                private var activeBar: MovieClip = new MovieClip();                        //барельеф под курсором
                private var emptyBar: MovieClip;
                private var winClip: MovieClip;
 
                private var posY: Number = 120;                                            //координата У барельефов
                private var posX: Number = 0;                                                                                          //координата Х барельефов       
 
                private const newX: Number = 140;                                                                                        //координаты второго ряда барельефов       
                private const newY: Number = 220;
                private const deltaX: Number = 70;
                private const barsCount: int = 7;                                                                                        //число барельефов, которые надо расставить
                private const allBars: int = 14;
 
                private var timer: Timer = new Timer(50);
 
                private var i:int;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                        loadAssets();
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
                        stage.addEventListener(MouseEvent.CLICK, stageMouseClick);
                        timer.addEventListener(TimerEvent.TIMER, animate);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                }
 
                private function loadAssets():void
                {
                        var path: URLRequest = new URLRequest("assets.swf");
                        var context: LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
                        loader.load(path, context);
                }
 
                private function onLoad(e: Event):void
                {
                        loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoad);
                        var tmp: Class = getDefinitionByName("places") as Class;
                        place = new tmp();
                        addChild(place);
                        for (i = 0; i < barsCount; ++i)
                        {
                                tmp = getDefinitionByName("emptyBar") as Class;
                                emptyBar = new tmp();       
                                posX += deltaX;
                                emptyBar.x = posX;
                                emptyBar.addEventListener(MouseEvent.CLICK, emptyClick);
                                addChild(emptyBar);               
                        }
                        posX = 0;
                        for ( i = 1; i <= allBars; ++i)
                        {
                                var bar: Class = getDefinitionByName("bar" + i) as Class;
                                var tempBar: MovieClip = new bar();
                                bars.push(tempBar);
                                tempBar.y = posY;
                                tempBar.x = posX;
                                posX += deltaX;
                                if (i >= 9) posY = newY;
                                if (i == 9) posX = newX;
                                addChild(tempBar);
                                tempBar.addEventListener(MouseEvent.CLICK, mouseClick);
                                if (i <= barsCount) correctBars.push(tempBar);
                        }
                        tmp = getDefinitionByName("win") as Class;
                        winClip = new tmp();
                        addChild(winClip);
                        winClip.visible = false;
                }
 
                private function mouseMove(e: Event):void
                {
                        if (activeBar)
                        {
                                activeBar.x = mouseX;
                                activeBar.y = mouseY;
                        }       
                }
 
                private function mouseClick(e: Event):void          //клик по барельефу
                {
                        e.target is MovieClip
                        {
                                activeBar = e.target as MovieClip;
                        }
                        e.stopImmediatePropagation();
                }
 
                private function stageMouseClick(e: Event):void
                {
                        activeBar = null;
                }
 
                private function emptyClick(e: Event):void            //клик по месту, куда устанавливать барельеф
                {
                        if (activeBar)
                        {
                                activeBar.x = e.target.x;
                                activeBar.y = e.target.y;
                                puttedBars.push(activeBar);
                        }       
                        if (puttedBars.length == barsCount) checkForWin();  //прверка на правильность комбинации установленых барельефов
                }
 
                private function equals(arr1: Array, arr2: Array):Boolean     
                {
                        arr1.sort();
                        arr2.sort();
                        for (i = 0; i < arr1.length; ++i)
                        {
                                if (arr1[i] != arr2[i]) return false;
                        }
                        return true;
                }
 
                private function checkForWin():void
                {
                        if (equals(puttedBars, correctBars))
                        {
                                timer.start();
                                winClip.visible = true;
                                winClip.x = posX;
                                winClip.y = 2 * posY;
                                removeEventListener(MouseEvent.CLICK, emptyClick);
                                for (i = 0; i < bars.length; ++i)
                                {
                                        bars[i].mouseEnabled = false;
                                }
                        }       
                }
 
                private function animate(e: Event):void
                {
                        winClip.rotation += 10;
                }
        }
 
}


Gaen 29.07.2011 00:18

Если начинаете путаться в собственном коде, значит пора разбивать :)

Котяра 29.07.2011 00:29

Ну самое первое - это отделить логику от отрисовки и сервисных функций (вроде загрузки асстетов). MVC в помощь.

КорДум 29.07.2011 00:31

Цитата:

170 строк кода
Цитата:

MVC в помощь.
Котяра, какой MVC? о_О
Обычная композиция здесь подойдет, с обычным разделением логики и визуализации.

Котяра 29.07.2011 00:45

А почему бы и не мвц? С обычным разделением логики и визуализации.
И композиция - это не противопоставление мвц, а всего лишь один из кирпичиков.

КорДум 29.07.2011 00:51

Цитата:

И композиция - это не противопоставление мвц, а всего лишь один из кирпичиков.
В данном случае, мне кажется, MVC в таком виде, в каком все привыкли его видеть, будет излишним. А вот кирпичиком его воспользоваться будет в самый раз ;)

Котяра 29.07.2011 00:54

Ну все равно при разделении мы выделяем модель, выделяем вид, выделяем контроллер. Пусть они будут маленькими, но это от этого суть не меняется. Я наверное просто уже испорчен и по-другому не умею)

КорДум 29.07.2011 00:54

Без модели можно обойтись. MC+V, кажется, такое зовется =)


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

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