Try #4 dungeon

by Cheshir forked from Alternative (diff: 235)
В очередной раз попытаемся создать редактор для подземелий... в этот раз более графический.
♥0 | Line 233 | Modified 2015-03-04 02:47:27 | MIT License
play

ActionScript3 source code

/**
 * Copyright Cheshir ( http://wonderfl.net/user/Cheshir )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/zMN0
 */

// forked from Cheshir's Alternative
// forked from Cheshir's Observer and simple Console
package {
    import flash.system.ApplicationDomain;
    import flash.system.SecurityDomain;
    import flash.system.LoaderContext;
    import flash.events.IOErrorEvent;

    import flash.display.Loader;
    import flash.display.Bitmap;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.filters.GlowFilter;
    import flash.text.TextField;
    import flash.display.Sprite;

    public class FlashTest extends Sprite {
        public static var myConsole:Console;
        private var galaxyHolder:Sprite;
        
        private var drawDunge:DungeonDrawing;
        
        public function FlashTest() {
            // write as3 code here..
            myConsole = new Console(stage);
            galaxyHolder = new Sprite();
            
            this.graphics.beginFill(0x7c9b81);
            this.graphics.drawRect(0,0,600,600);
            addChild(galaxyHolder);
      //      myConsole.addComand('-cl',myObserver.removeAll, 'clear obserber');
            myConsole.help();
      //    Ooooo Yeaaa... it work... but was problem whis securityDomain
            var context:LoaderContext = new LoaderContext();
            context.checkPolicyFile = true;
            context.securityDomain = SecurityDomain.currentDomain;
            context.applicationDomain = ApplicationDomain.currentDomain;
            var url:URLRequest = new URLRequest('http://cheshir.zabix.net/footlocker/dungeonTile.png');
            var img:Loader = new Loader();
            img.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
            img.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            img.load(url, context);
        }
        private function ioErrorHandler(e:IOErrorEvent):void{
            myConsole.log('error '+e.text);
        }

        private function loaded(e:Event):void
        {
            var bitmap:Bitmap = e.target.content;
            //bitmap.y = 140;
            //bitmap.scaleY = bitmap.scaleX = 2; // Так ну оригинал больше пока не нужен, мы разобрали его на запчасти...
            //galaxyHolder.addChild(bitmap);
            
            // Хочу отобразить тайл отдельно... длинный коридор
            var tileLongCoridor:TileDungeon = new TileDungeon(77,38,0,0,bitmap);
            placeTo(40,340,tileLongCoridor);
            // Теперь короткий коридор
            var tile3Coridor:TileDungeon = new TileDungeon(38,38,77,0,bitmap);
            placeTo(110,340,tile3Coridor);
            // Еще у нас есть коридор на 2 клетки... 
            var tile2Coridor:TileDungeon = new TileDungeon(24,38,103,0,bitmap);
            placeTo(152,340,tile2Coridor);
            // Нужен ли мне коридор на одну клетку? ... аааа...
            var tile1Coridor:TileDungeon = new TileDungeon(12,38,103,0,bitmap);
            placeTo(182,340,tile1Coridor);
            // Развилка...
            var tileFork:TileDungeon = new TileDungeon(38,38,152,0,bitmap);
            placeTo(220,340,tileFork);
            // Поворот...
            var tileTurn:TileDungeon = new TileDungeon(38,38,190,0,bitmap);
            placeTo(270,340,tileTurn);
            // Наконец... Тупик - одна из самых важных частей подземелья!
            var deadEnd:TileDungeon = new TileDungeon(38,12,152,38,bitmap);
            placeTo(40,390,deadEnd);
            // Лестница! Вторая важная часть!
            var steps:TileDungeon = new TileDungeon(38,38,190,38,bitmap);
            placeTo(110,390,steps);
            // Комната! последняя часть простых подземелий
            var room:TileDungeon = new TileDungeon(64,64,0,38,bitmap);
            placeTo(180,410,room);
            
            drawDunge = new DungeonDrawing([tileLongCoridor.copy(), tile3Coridor.copy(),
            tile2Coridor.copy(), tile1Coridor.copy(), tileFork.copy(), tileTurn.copy(),
            deadEnd.copy(), steps.copy(), room.copy()]);
            placeTo(0,140,drawDunge);
            
            e.target.removeEventListener(Event.COMPLETE, loaded);
        }
        private function placeTo(x:Number, y:Number, some:*):void{
            some.x = x; some.y = y;
            galaxyHolder.addChild(some);
        }
    }
}
import flash.events.MouseEvent;
import flash.filters.GlowFilter;
import flash.geom.Matrix;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.events.Event;
import flash.utils.Dictionary;
import flash.ui.Keyboard;
import flash.events.FocusEvent;
import flash.text.TextFieldType;
import flash.events.TextEvent;
import flash.events.KeyboardEvent;
import flash.display.Stage;
import flash.text.TextField;
import flash.display.Sprite;

Class {
    class DungeonDrawing extends Sprite {
        public var dungeonParticles:Array;    // Хочу чтобы крепость представляла собой
        public function DungeonDrawing(particles:Array) {    // Древовидную - списковую структуру...
            // И чтобы сразу все визуализировалось ага... закатай губу...
            // Подземелье начинается с лестницы, и тупика...
            dungeonParticles = particles;
            
            var stepsStart:DungeonParticle = new DungeonParticle(100,100,'0,1,1|0,1,2|0,1,1',dungeonParticles[7],90);
            addChild(stepsStart.visual);
            var deadEndStart:DungeonParticle = new DungeonParticle(0,0,'1,1|2,1|1,1',dungeonParticles[6],-90);    // x=126 y=100
            addChild(deadEndStart.visual);
            //deadEndStart.connectTo(stepsStart);
            var steps2:DungeonParticle = new DungeonParticle(0,0,'1,1,0|2,1,0|1,1,0',dungeonParticles[7].copy(),-90);
            addChild(steps2.visual);
            steps2.connectTo(stepsStart);
        }
    }
}
Class {
    class DungeonParticle {    // Окей, это будет объект данных... сейчас все тайлы подземелья прямоугольные, а что если я захочу сделать...
        // Например тайл буквой Г ? // Или я захочу сделать сложную комнату... что более вероятно... 
        // ну ладно... пусть будет прямоугольное Ограничение...
        public var passData:Array = [];
        public var visual:TileDungeon;
        
        public function DungeonParticle(x:int, y:int, passDat:String, visual:TileDungeon, rotation:Number) {    // Да... двери.. или места пристроек?
            this.visual = visual;
            this.visual.rotation = rotation;
            this.visual.x = x; this.visual.y = y;
            for each(var rowY:String in passDat.split('|') ) {
                this.passData.push(rowY.split(','));
            }
        }
        
        public function turnTo90():void{
            visual.rotation += 90;
            // А потом перезаписать массив проходимости
            
        }
        public function connectTo(particle:DungeonParticle):void{
            // В эту функцию передаем уже расположенный Particle а позиционируем этот...
            
            // Ищем дверной проем в массиве проходимости старого элемента == 2
            var tx:int = 0;
            var ty:int = 0;
            for (var i:int = 0; i<particle.passData.length; i++){ 
                for(var j:int = 0; j<particle.passData[i].length; j++){
                    if(particle.passData[i][j]=='2'){
                        tx = j; ty = i;
                    }
                }
            }
            // Нужно совместить дверной проем новой комнаты с дверным проемом старой комнаты...
            this.visual.x = particle.visual.x + 6 + tx*13;
            this.visual.y = particle.visual.y + 6 + ty*13;
            this.visual.graphics.beginFill(0x00ff00);
            this.visual.graphics.drawCircle(6,6,3);
            // И вообще-то это нужно сделать не просто так, а по умному.
            particle.visual.graphics.beginFill(0xff0000);    // Так.. мне нужно убедиться, что я все правильно делаю..
            particle.visual.graphics.drawCircle(6+tx*13,6+ty*13,3);    // Если я рисую в локальных координатах.. то сейчас должно быть...
            particle.visual.graphics.beginFill(0x00ff00);
            particle.visual.graphics.drawCircle(6,6,3);
            FlashTest.myConsole.log(tx+"=tx  ty="+ty);
        }
    }
}

Class {
    class TileDungeon extends Sprite {
        public var tile:Bitmap;
        private var w:Number;
        private var h:Number;
        public function TileDungeon(w:Number, h:Number, tx:Number, ty:Number, Data:Bitmap){
            this.w = w; this.h = h;
            tile = new Bitmap(new BitmapData(w,h,true,0));
            tile.x = -w/2; tile.y = -h/2;
            var m:Matrix = new Matrix(1,0,0,1, -tx,-ty);
            tile.bitmapData.draw(Data, m);
            addChild(tile);
            this.buttonMode = true;
            addEventListener(MouseEvent.CLICK,select);
            addEventListener(FocusEvent.FOCUS_OUT,deselect);
        }
        public function copy():TileDungeon{
            return new TileDungeon(this.w,this.h,0,0,tile);
        }
        public override function set rotation(num:Number):void{
            // Хаха... как сменить центр вращения? вернее нет, нужно чтобы тайл перемещался левым верхним углом в нулевые
           // координаты после поворота... ого го... смахивает на заплатку уже... 
            tile.rotation = num;
            if(tile.rotation==90){
                tile.x = w; tile.y = 0;
            } else if(tile.rotation==0){
                tile.x = 0; tile.y = 0;
            } else if(tile.rotation==-90){
                tile.x = 0; tile.y = h;
            } else if(tile.rotation==180||tile.rotation==-180){
                tile.x = w; tile.y = h;
            }
            tile.alpha = 0.6;
        }
        public override function get rotation():Number{
            return tile.rotation;
        }
        private function select(e:MouseEvent):void{
            this.filters = [new GlowFilter(0xffff00)];
        }
        private function deselect(e:FocusEvent):void{
            this.filters = [];
        }
    }
}


Class
{
    class Console extends Sprite {
        private var consoleField:TextField = new TextField();
        
        private var descript:Array = ['help', 'clear console'];
        
        private var diction:Dictionary = new Dictionary();
        
        public function Console(stage:Stage) {
            consoleField.background = true;
            consoleField.type = TextFieldType.INPUT; 
            consoleField.backgroundColor = 0x333333;
            consoleField.alpha = .6;
            consoleField.textColor = 0xf2f9ff;
            consoleField.width = stage.stageWidth;
            consoleField.scaleX = consoleField.scaleY = 1.4;
            stage.addChild(consoleField);
            consoleField.addEventListener(FocusEvent.FOCUS_IN, clear);
            consoleField.addEventListener(KeyboardEvent.KEY_UP, upKey);
            diction['-h'] = {func: help, descript: 'help function trace'};
            diction['-c'] = {func: clear, descript: 'clear console zone'};
        }
        public function log(str:Object):void {
            if(!str is String){
                str.toString();
            }
            consoleField.appendText(str+'\n');
        }
        
        public function addComand(comand:String, toCall:Function, desc:String="no descript"):void{
            diction[comand] = {func: toCall, descript: desc};
        }

        private function upKey(e:KeyboardEvent):void{
            if(e.keyCode == Keyboard.ENTER){
                // parse
                var key:String = '';
                for(var i:int = 1; i<=4; i++){
                    key = consoleField.text.charAt(consoleField.text.length-i)+key;
                    if(diction[key] != null){
                        (diction[key].func as Function).call();
                        return;
                    }
                }
            }
        }
        
        public function clear(event:FocusEvent = null):void{
            consoleField.text = '';
        }
        
        public function help():void {
            log('This is help - default');
            for (var key:Object in diction) 
            { 
                log(key +"\t is "+ diction[key].descript); 
            } 

        }

    }

}