In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

マップエディタ(オートタイル)

マップ素材は以下からお借りして使用しています
DotWorld http://whss.biz/~tsukasa/
Get Adobe Flash player
by talte 30 Jan 2010
/**
 * Copyright talte ( http://wonderfl.net/user/talte )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/1kSS
 */

/*
  マップ素材は以下からお借りして使用しています
   DotWorld http://whss.biz/~tsukasa/
*/
package
{
	import flash.display.Sprite
	import flash.display.Bitmap
	import flash.display.BitmapData
	import flash.events.Event
	import flash.events.MouseEvent
	import flash.display.Loader
	import flash.display.LoaderInfo
	import flash.system.LoaderContext
	import flash.net.URLLoader
	import flash.net.URLRequest
	import flash.geom.Point
	import flash.geom.Rectangle
    
	public class autotile extends Sprite
	{
		private var field:Bitmap // 表示されるマップ
		private var chip:Bitmap  // マップチップ画像
		
		private var mapdata:Array  // マップのデータ配列
		private var map_width:int  // マップの幅
		private var map_height:int // マップの高さ
		
		private var mousedown:Boolean = false // マウスが押されているか
		private var chip_select:int // 選択されているチップ
		
		function autotile()
		{
			this.addEventListener(Event.ADDED_TO_STAGE, this.onLoad) // 初期化
		}
		
		// 初期化
		private function onLoad(event:Event):void
		{
			// マップ画像読み込み
			var url:String = "http://assets.wonderfl.net/images/related_images/0/0f/0f7d/0f7df367b7a9f8d90d808d415c91affc1ec5ab6e"
			var loader:Loader = new Loader
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.onComplete)
			loader.load(new URLRequest(url), new LoaderContext(true))
		}
		
		// マップ読み込み完了
		private function onComplete(event:Event):void
		{
			// マップチップ画像
			var loader:Loader = LoaderInfo(event.target).loader
			this.chip = Bitmap(loader.content)
			
			// 以下マップが読み込めたので初期化開始
			
			// マップ表示の初期化
			var bmpData:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight)
			this.field = new Bitmap(bmpData)
			this.addChild(this.field)
			
			// マップデータの初期化
			this.map_width = (stage.stageWidth + 31) / 32
			this.map_height = (stage.stageHeight + 31) / 32
			var len:int = this.map_width * this.map_height // 幅×高さ分必要
			this.mapdata = new Array
			for (var i:int = 0; i < len; i++)
			{
				this.mapdata[i] = 0; // 最初はすべて0のチップ
			}
			
			// マップ表示初期化描画
			var rect:Rectangle = new Rectangle(0, 0, 32, 32)
			var point:Point = new Point(0, 0)
			for (i = 0; i < this.map_width; i++)
			{
				for (var j:int = 0; j < this.map_height; j++)
				{
					// 全座標描画
					point.x = i * 32
					point.y = j * 32
					this.field.bitmapData.copyPixels(this.chip.bitmapData, rect, point)
				}
			}
			
			// マウスのイベント登録
			stage.addEventListener(MouseEvent.MOUSE_DOWN, this.onMouseDown)
			stage.addEventListener(MouseEvent.MOUSE_UP, this.onMouseUp)
			stage.addEventListener(MouseEvent.MOUSE_MOVE, this.onMouseMove)
		}
		
		// クリックした
		private function onMouseDown(event:MouseEvent):void
		{
			var x:int = event.stageX / 32
			var y:int = event.stageY / 32 // マウスのチップ位置
			
			this.mousedown = true // マウスクリック状態
			this.chip_select = 1 - this.map(x, y) // 今回は2種類のチップを反転
			
			this.setmap(x, y) // マップ更新
		}
		
		// クリックを離した
		private function onMouseUp(event:MouseEvent):void
		{
			this.mousedown = false // マウスクリック解除
		}
		
		// マウスが動いた
		private function onMouseMove(event:MouseEvent):void
		{
			if(this.mousedown) // マウスクリック中
			{
				var x:int = event.stageX / 32
				var y:int = event.stageY / 32 // マウス位置
				
				this.setmap(x, y) // マップ更新
			}
		}
		
		// チップ番号取得用
		private function map(x:int, y:int):int
		{
			// マップ範囲外は特別な番号を返す
			if (x < 0 || x >= this.map_width || y < 0 || y >= this.map_height)
			{
				return -1
			}
			return this.mapdata[x + y * this.map_width] // データの格納位置
		}
		
		// マップ更新
		private function setmap(x:int, y:int):void
		{
			var pos:int = x + y * this.map_width // データの格納位置
			
			// 変更されていたら描画も
			if (this.mapdata[pos] != this.chip_select)
			{
				this.mapdata[pos] = this.chip_select
				this.drawmap(x, y)
			}
		}
		
		// マップ描画
		private function drawmap(x:int, y:int):void
		{
			var rect:Rectangle = new Rectangle(0, 0, 16, 16) // 16×16ずつ描画
			var point:Point = new Point(0, 0)
			
			// 更新範囲はチップの半分のサイズで周りを含めた4×4
			for (var i:int = 0; i < 4; i++)
			{
				for (var j:int = 0; j < 4; j++)
				{
					// 自身の座標
					var ox:int = x + ((i + 1) / 2 - 1)
					var oy:int = y + ((j + 1) / 2 - 1) // (-1)/2対策
					// 自身のチップを決めるための周辺の座標用
					var tx:int = ox + (i % 2 == 0 ? 1 : -1) // 例えば描画対象チップが右下半分ならその右のチップを確認
					var ty:int = oy + (j % 2 == 0 ? 1 : -1) // またその下や右下のチップも確認
					
					// 描画するチップを決める
					var sel:int // 選択チップ
					var n:int = this.map(ox, oy) // 自身のチップ番号
					// 今回は簡単にするためただ分ける
					if (n == 1) // 今回は池
					{
						var v:int = this.map(tx, oy) // 横
						var h:int = this.map(ox, ty) // 縦
						var vh:int = this.map(tx, ty) // 斜め
						
						// 例えば左上なら、左、左上、上がすべて池
						if (v == n && h == n && vh == n)
						{
							sel = 5
						}
						// 左と上が池
						else if (v == n && h == n)
						{
							sel = 2
						}
						// 左だけ
						else if (v == n)
						{
							sel = 3
						}
						// 上だけ
						else if (h == n)
						{
							sel = 4
						}
						// 左上のみ、もしくはなし
						else
						{
							sel = 1
						}
					}
					else
					{
						sel = 0 // 今回は草のみ
					}
					
					// 描画の位置
					point.x = 16 * (x * 2 - 1 + i)
					point.y = 16 * (y * 2 - 1 + j)
					// チップの切り取る場所
					rect.x = 16 * (sel * 2 + (i % 2 == 0 ? 1 : 0))
					rect.y = 16 * (j % 2 == 0 ? 1 : 0) // これも左上とか右下とかで調整
					
					// 描画
					this.field.bitmapData.copyPixels(this.chip.bitmapData, rect, point)
				}
			}
		}
	}
}