Try #4 dungeon
forked from Alternative (diff: 235)
В очередной раз попытаемся создать редактор для подземелий... в этот раз более графический.
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/zMN0
*/
// forked from Cheshir's Alternative
// forked from Cheshir's Observer and simple Console
package {
import flash.system.ApplicationDomain;
import flash.system.SecurityDomain;
import flash.system.LoaderContext;
import flash.events.IOErrorEvent;
import flash.display.Loader;
import flash.display.Bitmap;
import flash.events.Event;
import flash.net.URLRequest;
import flash.filters.GlowFilter;
import flash.text.TextField;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public static var myConsole:Console;
private var galaxyHolder:Sprite;
private var drawDunge:DungeonDrawing;
public function FlashTest() {
// write as3 code here..
myConsole = new Console(stage);
galaxyHolder = new Sprite();
this.graphics.beginFill(0x7c9b81);
this.graphics.drawRect(0,0,600,600);
addChild(galaxyHolder);
// myConsole.addComand('-cl',myObserver.removeAll, 'clear obserber');
myConsole.help();
// Ooooo Yeaaa... it work... but was problem whis securityDomain
var context:LoaderContext = new LoaderContext();
context.checkPolicyFile = true;
context.securityDomain = SecurityDomain.currentDomain;
context.applicationDomain = ApplicationDomain.currentDomain;
var url:URLRequest = new URLRequest('http://cheshir.zabix.net/footlocker/dungeonTile.png');
var img:Loader = new Loader();
img.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
img.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
img.load(url, context);
}
private function ioErrorHandler(e:IOErrorEvent):void{
myConsole.log('error '+e.text);
}
private function loaded(e:Event):void
{
var bitmap:Bitmap = e.target.content;
//bitmap.y = 140;
//bitmap.scaleY = bitmap.scaleX = 2; // Так ну оригинал больше пока не нужен, мы разобрали его на запчасти...
//galaxyHolder.addChild(bitmap);
// Хочу отобразить тайл отдельно... длинный коридор
var tileLongCoridor:TileDungeon = new TileDungeon(77,38,0,0,bitmap);
placeTo(40,340,tileLongCoridor);
// Теперь короткий коридор
var tile3Coridor:TileDungeon = new TileDungeon(38,38,77,0,bitmap);
placeTo(110,340,tile3Coridor);
// Еще у нас есть коридор на 2 клетки...
var tile2Coridor:TileDungeon = new TileDungeon(24,38,103,0,bitmap);
placeTo(152,340,tile2Coridor);
// Нужен ли мне коридор на одну клетку? ... аааа...
var tile1Coridor:TileDungeon = new TileDungeon(12,38,103,0,bitmap);
placeTo(182,340,tile1Coridor);
// Развилка...
var tileFork:TileDungeon = new TileDungeon(38,38,152,0,bitmap);
placeTo(220,340,tileFork);
// Поворот...
var tileTurn:TileDungeon = new TileDungeon(38,38,190,0,bitmap);
placeTo(270,340,tileTurn);
// Наконец... Тупик - одна из самых важных частей подземелья!
var deadEnd:TileDungeon = new TileDungeon(38,12,152,38,bitmap);
placeTo(40,390,deadEnd);
// Лестница! Вторая важная часть!
var steps:TileDungeon = new TileDungeon(38,38,190,38,bitmap);
placeTo(110,390,steps);
// Комната! последняя часть простых подземелий
var room:TileDungeon = new TileDungeon(64,64,0,38,bitmap);
placeTo(180,410,room);
drawDunge = new DungeonDrawing([tileLongCoridor.copy(), tile3Coridor.copy(),
tile2Coridor.copy(), tile1Coridor.copy(), tileFork.copy(), tileTurn.copy(),
deadEnd.copy(), steps.copy(), room.copy()]);
placeTo(0,140,drawDunge);
e.target.removeEventListener(Event.COMPLETE, loaded);
}
private function placeTo(x:Number, y:Number, some:*):void{
some.x = x; some.y = y;
galaxyHolder.addChild(some);
}
}
}
import flash.events.MouseEvent;
import flash.filters.GlowFilter;
import flash.geom.Matrix;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.events.Event;
import flash.utils.Dictionary;
import flash.ui.Keyboard;
import flash.events.FocusEvent;
import flash.text.TextFieldType;
import flash.events.TextEvent;
import flash.events.KeyboardEvent;
import flash.display.Stage;
import flash.text.TextField;
import flash.display.Sprite;
Class {
class DungeonDrawing extends Sprite {
public var dungeonParticles:Array; // Хочу чтобы крепость представляла собой
public function DungeonDrawing(particles:Array) { // Древовидную - списковую структуру...
// И чтобы сразу все визуализировалось ага... закатай губу...
// Подземелье начинается с лестницы, и тупика...
dungeonParticles = particles;
var stepsStart:DungeonParticle = new DungeonParticle(100,100,'0,1,1|0,1,2|0,1,1',dungeonParticles[7],90);
addChild(stepsStart.visual);
var deadEndStart:DungeonParticle = new DungeonParticle(0,0,'1,1|2,1|1,1',dungeonParticles[6],-90); // x=126 y=100
addChild(deadEndStart.visual);
//deadEndStart.connectTo(stepsStart);
var steps2:DungeonParticle = new DungeonParticle(0,0,'1,1,0|2,1,0|1,1,0',dungeonParticles[7].copy(),-90);
addChild(steps2.visual);
steps2.connectTo(stepsStart);
}
}
}
Class {
class DungeonParticle { // Окей, это будет объект данных... сейчас все тайлы подземелья прямоугольные, а что если я захочу сделать...
// Например тайл буквой Г ? // Или я захочу сделать сложную комнату... что более вероятно...
// ну ладно... пусть будет прямоугольное Ограничение...
public var passData:Array = [];
public var visual:TileDungeon;
public function DungeonParticle(x:int, y:int, passDat:String, visual:TileDungeon, rotation:Number) { // Да... двери.. или места пристроек?
this.visual = visual;
this.visual.rotation = rotation;
this.visual.x = x; this.visual.y = y;
for each(var rowY:String in passDat.split('|') ) {
this.passData.push(rowY.split(','));
}
}
public function turnTo90():void{
visual.rotation += 90;
// А потом перезаписать массив проходимости
}
public function connectTo(particle:DungeonParticle):void{
// В эту функцию передаем уже расположенный Particle а позиционируем этот...
// Ищем дверной проем в массиве проходимости старого элемента == 2
var tx:int = 0;
var ty:int = 0;
for (var i:int = 0; i<particle.passData.length; i++){
for(var j:int = 0; j<particle.passData[i].length; j++){
if(particle.passData[i][j]=='2'){
tx = j; ty = i;
}
}
}
// Нужно совместить дверной проем новой комнаты с дверным проемом старой комнаты...
this.visual.x = particle.visual.x + 6 + tx*13;
this.visual.y = particle.visual.y + 6 + ty*13;
this.visual.graphics.beginFill(0x00ff00);
this.visual.graphics.drawCircle(6,6,3);
// И вообще-то это нужно сделать не просто так, а по умному.
particle.visual.graphics.beginFill(0xff0000); // Так.. мне нужно убедиться, что я все правильно делаю..
particle.visual.graphics.drawCircle(6+tx*13,6+ty*13,3); // Если я рисую в локальных координатах.. то сейчас должно быть...
particle.visual.graphics.beginFill(0x00ff00);
particle.visual.graphics.drawCircle(6,6,3);
FlashTest.myConsole.log(tx+"=tx ty="+ty);
}
}
}
Class {
class TileDungeon extends Sprite {
public var tile:Bitmap;
private var w:Number;
private var h:Number;
public function TileDungeon(w:Number, h:Number, tx:Number, ty:Number, Data:Bitmap){
this.w = w; this.h = h;
tile = new Bitmap(new BitmapData(w,h,true,0));
tile.x = -w/2; tile.y = -h/2;
var m:Matrix = new Matrix(1,0,0,1, -tx,-ty);
tile.bitmapData.draw(Data, m);
addChild(tile);
this.buttonMode = true;
addEventListener(MouseEvent.CLICK,select);
addEventListener(FocusEvent.FOCUS_OUT,deselect);
}
public function copy():TileDungeon{
return new TileDungeon(this.w,this.h,0,0,tile);
}
public override function set rotation(num:Number):void{
// Хаха... как сменить центр вращения? вернее нет, нужно чтобы тайл перемещался левым верхним углом в нулевые
// координаты после поворота... ого го... смахивает на заплатку уже...
tile.rotation = num;
if(tile.rotation==90){
tile.x = w; tile.y = 0;
} else if(tile.rotation==0){
tile.x = 0; tile.y = 0;
} else if(tile.rotation==-90){
tile.x = 0; tile.y = h;
} else if(tile.rotation==180||tile.rotation==-180){
tile.x = w; tile.y = h;
}
tile.alpha = 0.6;
}
public override function get rotation():Number{
return tile.rotation;
}
private function select(e:MouseEvent):void{
this.filters = [new GlowFilter(0xffff00)];
}
private function deselect(e:FocusEvent):void{
this.filters = [];
}
}
}
Class
{
class Console extends Sprite {
private var consoleField:TextField = new TextField();
private var descript:Array = ['help', 'clear console'];
private var diction:Dictionary = new Dictionary();
public function Console(stage:Stage) {
consoleField.background = true;
consoleField.type = TextFieldType.INPUT;
consoleField.backgroundColor = 0x333333;
consoleField.alpha = .6;
consoleField.textColor = 0xf2f9ff;
consoleField.width = stage.stageWidth;
consoleField.scaleX = consoleField.scaleY = 1.4;
stage.addChild(consoleField);
consoleField.addEventListener(FocusEvent.FOCUS_IN, clear);
consoleField.addEventListener(KeyboardEvent.KEY_UP, upKey);
diction['-h'] = {func: help, descript: 'help function trace'};
diction['-c'] = {func: clear, descript: 'clear console zone'};
}
public function log(str:Object):void {
if(!str is String){
str.toString();
}
consoleField.appendText(str+'\n');
}
public function addComand(comand:String, toCall:Function, desc:String="no descript"):void{
diction[comand] = {func: toCall, descript: desc};
}
private function upKey(e:KeyboardEvent):void{
if(e.keyCode == Keyboard.ENTER){
// parse
var key:String = '';
for(var i:int = 1; i<=4; i++){
key = consoleField.text.charAt(consoleField.text.length-i)+key;
if(diction[key] != null){
(diction[key].func as Function).call();
return;
}
}
}
}
public function clear(event:FocusEvent = null):void{
consoleField.text = '';
}
public function help():void {
log('This is help - default');
for (var key:Object in diction)
{
log(key +"\t is "+ diction[key].descript);
}
}
}
}