TryAndErrorMethode

by Cheshir forked from flash on 2015-2-24 (diff: 91)
Нет, я передумал, сеточный метод слишком регулярный... больше рандома!
♥0 | Line 80 | Modified 2015-02-25 22:03:09 | 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/2lKY
 */

// forked from Cheshir's flash on 2015-2-24
/*
Нет, я передумал, сеточный метод слишком регулярный... больше рандома!
*/
package {
    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 visual:Sprite = new Sprite();
        
        private var level:MapLevel = new MapLevel();
        
        public function FlashTest() {
            // write as3 code here..
            map = new Bitmap(new BitmapData(100,100,false,0));//, 'auto', true);
            map.scaleX = 4;
            map.scaleY = 4;
            addChild(map);
            addChild(visual);
            addChild(log);
            log.autoSize = "left";
            log.textColor = 0xffffff;
            log.text = "width "+map.bitmapData.width+" and height "+map.bitmapData.height;
            drawVisual();
            stage.addEventListener(MouseEvent.CLICK, drawDoor);
        }
        private function drawDoor(e:MouseEvent):void{
            map.bitmapData.setPixel(mouseX/4, mouseY/4, 0xff0000);
        }
        
        private function drawVisual():void{
           for each(var room:Object in level.rooms){
               drawRoom(room);
           }
        }
        private function drawRoom(room:Object):void{
            for(var tx:int=room.x; tx<room.width+room.x; tx++){
                for(var ty:int=room.y; ty<room.height+room.y; ty++){
                    map.bitmapData.setPixel(tx,ty,0x7F5533);
                }
            }
        }
    }
}
import flash.geom.Point;
Class {
    class MapLevel extends Point {
        /* итак размещаем комнату максимального размера, если не удалось, уменьшаем размер
        пробуем разместить если не получается разместить наименьшую из комнат, тогда 
        выбираем другое место и пробуем снова */
        public var maxRoomSize:int = 16;
        public var minRoomSize:int = 6;
        
        public var widthMap:int = 100;
        public var heightMap:int = 100;
        
        public var rooms:Array = [];    // Список всех размещенных комнат
        
        public function MapLevel() {
            for(var i:int=0; i<8; i++) {
                placeRoom( maxRoomSize );
            }
            for( i=0; i<16; i++) {
                placeRoom( maxRoomSize - minRoomSize );
            }
            for( i=0; i<32; i++) {
                placeRoom( minRoomSize );
            }
        }
        private function placeRoom(size:Number):void {
            var newRoom:Object = { x:int(1+widthMap*Math.random()/1.3), y:int(1+heightMap*Math.random()/1.3), 
            height:int(minRoomSize+size*Math.random()), width:int(minRoomSize+size*Math.random()), connected:false};
            // Теперь нужно проверить разместится ли эта комната на карте... в выбранном месте
            // Пересечение со всеми остальными комнатами и границами карты...
            for each(var room:Object in rooms){
                if(intersects(newRoom, room)){
                    return;
                }
            }
            rooms.push( newRoom );
        }
        
        
        // Проверим прямоугольники на пересечения
        private function intersects(a:Object, b:Object):Boolean {
            var bY_1:int = b.y + b.height;
            var aY_1:int = a.y + a.height;
            var aX_1:int = a.x + a.width;
            var bX_1:int = b.x + b.width;
            return !( a.y > bY_1 || aY_1 < b.y || aX_1 < b.x || a.x > bX_1 );
        }
    }
}