flash on 2015-2-24

by Cheshir
Сеточный метод? Почему бы и нет?
1 делим пространство на равные регионы
2 выбираем соседние регионы чтобы сделать в них комнаты
♥0 | Line 139 | Modified 2015-02-27 22:09:18 | 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/f1Cf
 */

/*
Сеточный метод? Почему бы и нет?
    1 делим пространство на равные регионы
    2 выбираем соседние регионы чтобы сделать в них комнаты
*/
package {
    import flash.geom.Point;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        private var log:TextField = new TextField();
        
        private var map:Bitmap;
        
        private var diggers:Array = [];
        
        public function FlashTest() {
            // write as3 code here..
            map = new Bitmap(new BitmapData(stage.stageWidth/4, stage.stageHeight/4,false,0));//, 'auto', true);
            map.scaleX = 4;
            map.scaleY = 4;
            addChild(map);
            addChild(log);
            log.textColor =0xffffff;
            stage.addEventListener(MouseEvent.CLICK, createDigger);
            addEventListener(Event.ENTER_FRAME, dig);
          //  stage.frameRate = 60;
        }
        private var pointsRoom:Array = [];
        public function removeDiggers():void{
            diggers = [];
            pointsRoom = [];
            // найти тупики и создать комнаты
            for(var tx:int=0; tx<map.bitmapData.width; tx++){
                for(var ty:int=0; ty<map.bitmapData.height; ty++){
                    if(isDeadEnd(tx, ty)){
                        pointsRoom.push(isDeadEnd(tx, ty));
                    }
                }
            }
            log.text = String('dead ends '+pointsRoom.length+' will be rooms');
            for each(var point:Point in pointsRoom){
                createRoom(point.x, point.y);
            }
        }
        public function isDeadEnd(x:int, y:int):Point{
            if(map.bitmapData.getPixel(x,y) > 10){    // Уже коридор...
                var free:int = 0;
                if(map.bitmapData.getPixel(x-1,y)<10){    // left
                    free++;
                }
                if(map.bitmapData.getPixel(x+1,y)<10){ // right
                    free++;
                }
                if(map.bitmapData.getPixel(x,y-1)<10){    // up
                    free++;
                }
                if(map.bitmapData.getPixel(x,y+1)<10){ // down
                    free++;
                }
                if(free>=3){    // dead end
                    return new Point(x-1,y-1);    // left and up
                }
            }
            return null;
        }
        public function createDigger(e:MouseEvent):void{
            //stage.removeEventListener(MouseEvent.CLICK, createDigger);
            var digger:Digger = new Digger(mouseX/4, mouseY/4, 6+6*Math.random());
            digger.direction = int(Math.random()*4);
            var digger2:Digger = new Digger(mouseX/4, mouseY/4, 6+6*Math.random());
            digger2.direction = int(Math.random()*4);
            diggers.push(digger, digger2);    // ))) ? Lisp ?
            //map.bitmapData.setPixel(mouseX, mouseY, 0x7F3300);
        }
        private var colorDig:uint = 0x9F3300;
        private var diggersMax:int = 21;
        private var diggersDead:int = 0;
        public function dig(e:Event):void{
            //colorDig+=20;//=colorDig*Math.random();
            log.text = String(diggers.length);
            // Копатели могут двигаться и раскапывать коридоры...
            for each(var digger:Digger in diggers){ // Сделать шаг для копателя
                // Если энергия не кончилась...
                if(digger.energy>0){ // Тогда копаем и двигаемся
                    if(digger.state=="coridor"){
                        map.bitmapData.setPixel(digger.x, digger.y, colorDig);    // Копаем...
                        digger.update();
                        digger.energy--;
                    }
                } else { // Меняем тип работ / пораждаем нового диггера / Былинно отказываемся работать
                    var r:Number = Math.random()*7;
                    if(r<2){
                        digger.energy = 3;
                        digger.direction = int(Math.random()*4);    // Смена направления коридора
                    } else if(r<4) {
                        digger.energy = 6+Math.random()*6;
                        digger.dead();    // Былинный отказ
                        diggersDead++;
                    } else if(r<6 && diggers.length<diggersMax){
                        diggers.push(new Digger(digger.x, digger.y, 6+6*Math.random()));
                    }
                }
            }
            if(diggersDead >= diggersMax){
                //removeEventListener(Event.ENTER_FRAME, dig);
                diggersDead=0;
                removeDiggers();
            }
        }
        public function createRoom(x:int, y:int):void{    // 9 cell room...
            for(var tx:int = x; tx < 3+x; tx++){
                for(var ty:int = y; ty < 3+y; ty++){
                    map.bitmapData.setPixel(tx, ty, colorDig);
                }
            }
        }
    }
}
import flash.events.Event;
Class {
    class Digger {
        public var x:int = 0;
        public var y:int = 0;
        public var energy:int = 6;
        public var state:String = "coridor";
        public var direction:int = 0;
        public function Digger(x:int, y:int, energy:int){
            this.x = x;
            this.y = y;
            this.energy = energy;
        }
        private var isDead:Boolean = false;
        public function dead():void{
            isDead = true;       
        }
        public function update():void{
            if(isDead){
                return;
            }
            if(direction == 0){
                this.x++;
            } else if(direction == 1){
                this.x--;
            } else if(direction == 2){
                this.y++;
            } else if(direction == 3){
                this.y--;
            }
        }
    }
}

Forked