DigAndGrid

by Cheshir
♥0 | Line 126 | Modified 2015-02-26 23:51:26 | 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/iIVi
 */

package {
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        
        private var level:MapLevel = new MapLevel();
        
        public function FlashTest() {
            // write as3 code here..
            addChild(level.getGreed(42,42));
        }
    }
}
import flash.display.DisplayObject;
import flash.display.BlendMode;
import flash.geom.ColorTransform;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.MouseEvent;
import flash.display.Sprite;

Class {
    class MapLevel extends Sprite {
    public var coridor6:int = 2;    // 2 коридора длинной 6 клеток
    public var coridor3:int = 4;    // 4 коротких коридора
    public var coridor2:int = 2;    // 2 очень коротких коридора
    public var coridor1:int = 1;    // 1 перемычка
    public var turn:int = 4;    // Количество поворотов влияет на запутанность подземелья?
    
    // Нельзя купить еще развилку пока недостаточно окончаний 
    public var fork:int = 2;      // Вероятно можно рассчитать количество окончаний подземелья из количества развилок...
    // Мне кажется или количество тупиков равно количеству развилок * 2 ?
    // Это окончания коридоров...
    public var deadEnd:int = 1;    // не уверен что следует количественно ограничивать тупики... а вот комнаты можно
    public var steps:int = 1;    // Количество лестниц - будет равным количеству этажей - самая дорогая деталь...
    public var rooms:int = 2;    // Комнаты 2...
    
    private var tileSize:int = 10;
    private var myGrid:Sprite;
    
    private var NRoom:Sprite;
    private var elementsPanel:ElementsPanel;
    
        public function MapLevel(){
            /* Я ведь могу позволить игрокам создавать свои крепости?
            Почему нет? В комнатах генерятся монстры, в тупиках можно найти предметы. 
            
            Короче вместо рандомной генерации я выбираю творчество игроков... 
            И развитие крепости вглубь чтобы делать забег по крепости, а потом улучшать ее чтобы сдеалать следующий забег */
            NRoom = new Sprite();
            drawNRoom(0xccffcc);
        }
        public function getGreed(w:int, h:int):Sprite {
            var greed:Sprite = new Sprite();
            greed.graphics.lineStyle(1,0xB5692F);
            greed.graphics.beginFill(0xC68E3B);
            var cellSize:int = tileSize;
            for(var i:int=0; i<=w; i++){
                greed.graphics.moveTo( i*cellSize, 0 );
                greed.graphics.lineTo( i*cellSize, h*cellSize );
            }
            for(i = 0; i<=h; i++){
                greed.graphics.moveTo( 0, i*cellSize );
                greed.graphics.lineTo( w*cellSize, i*cellSize  );
            }
            greed.graphics.drawRect(0,0,w*cellSize,h*cellSize);
            myGrid = greed;
         //   myGrid.addEventListener(MouseEvent.MOUSE_DOWN, startDr);
         //   myGrid.addEventListener(MouseEvent.MOUSE_UP, stopDr);
            myGrid.addEventListener(MouseEvent.MOUSE_MOVE, replaceNRoom);
            myGrid.addEventListener(MouseEvent.CLICK, createTile);
            myGrid.addChild(makePergament(w*tileSize, h*tileSize));
            myGrid.addChild(NRoom);
            elementsPanel = new ElementsPanel(myGrid)
            return myGrid;
        }
        private var tiles:Array = [];
        private function createTile(e:MouseEvent):void {
            if(canPlaceTile){
                myGrid.graphics.beginFill(0xffffff);
                myGrid.graphics.drawRect(NRoom.x-tileSize,NRoom.y-tileSize,NRoom.width,NRoom.height);
            }
            tiles.push({ x : NRoom.x + tileSize, y : NRoom.y + tileSize,    // WTF ?
             width : 10, heigth : 10 });        // something went wrong
        }
        private var canPlaceTile:Boolean = true;
        private function replaceNRoom(e:MouseEvent):void {
            NRoom.x = Math.floor(mouseX/tileSize)*tileSize;
            NRoom.y = Math.floor(mouseY/tileSize)*tileSize;
            canPlaceTile = true;
            drawNRoom(0xccffcc);
            // Здесь же я могу проверить не пересекается ли тайл со старыми значениями... Если хоть одна клетка тайла
            // Пересекается с занятой клеткой... тогда запрещаем сие действие
            for each(var oldTile:Object in tiles){
                if( intersects( oldTile.y, NRoom.y+NRoom.height, oldTile.y+oldTile.heigth, NRoom.y, oldTile.x+oldTile.width, NRoom.x, oldTile.x, NRoom.x+NRoom.width ) ){
                    canPlaceTile = false;
                    drawNRoom(0xffcccc);
                    return;
                }
            }
        }
        private function startDr(e:MouseEvent):void {
            myGrid.startDrag();
        }
        private function stopDr(e:MouseEvent):void {
            myGrid.stopDrag();
        }
        private function drawNRoom(color:uint):void{
            NRoom.graphics.clear();
            NRoom.graphics.beginFill(color,0.4);
            NRoom.graphics.lineStyle(1,color);
            NRoom.graphics.drawRect(-10,-10, tileSize*3, tileSize*3);
        }
        // Проверим прямоугольники на пересечения
        private function intersects(aY:Number, bY_1:Number, aY_1:Number, bY:Number, aX_1:Number, bX:Number, aX:Number, bX_1:Number):Boolean {
            return !( aY > bY_1 || aY_1 < bY || aX_1 < bX || aX > bX_1 );
        }
        private function makePergament(w:Number, h:Number):Bitmap{
            var b:Bitmap = new Bitmap(new BitmapData(w,h,true,0));
            b.bitmapData.perlinNoise(w, h, 3, 12345, true, true, 7, true);
            b.transform.colorTransform = new ColorTransform(1, 1, 1, 0.3, 255, 225, 50, 50);
            //b.blendMode = BlendMode.ADD;
            return b;
        }
    }
    class ElementsPanel extends Sprite {
        public var elements:Array = [];
        public function ElementsPanel(parent:Sprite) {
            this.y = parent.height - 50;
            parent.addChild(this);
            initElements();
        }
        private function initElements():void{
            var undoBtn:Sprite = new Sprite();
            undoBtn.graphics.lineStyle(1,0xB5692F);
            undoBtn.graphics.beginFill(0xC68E3B);
            undoBtn.graphics.drawCircle(30,0,20);
            addChild(undoBtn);
        }
    }
    
    class AddElementCommand {
        public function AddElementCommand(){
            
        }
        public function execute(deadEnd:Object, newElement:Object):void{    // Добавить элемент
            
        }
        public function undo():void{    // Отменить команду
            
        }
    }
}