flash on 2015-2-24
Сеточный метод? Почему бы и нет?
1 делим пространство на равные регионы
2 выбираем соседние регионы чтобы сделать в них комнаты
♥0 |
Line 139 |
Modified 2015-02-27 22:09:18 |
MIT License
archived:2017-03-20 01:58:07
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--;
}
}
}
}