TryAndErrorMethode
forked from flash on 2015-2-24 (diff: 91)
Нет, я передумал, сеточный метод слишком регулярный... больше рандома!
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 );
}
}
}