6 - ブロックをクリックして削除

by samegame forked from 5 - BevelFilterで質感を持たせる (diff: 16)
(問題点:ブロックをクリックして消したい。)
* 解決: MouseEvent.MOUSE_DOWNのイベント発行
* ブロック自体はSpriteなので、クリックされたかどうかは容易に判断が出来る
* ブロックをクリックしたらremoveChild()で削除
* 
* 問題点:周りの同じ色が消えない。
* ブロックから周りを判断するのは出来ないので二次元配列で何とかする
* それと、ブロックを消したら二次元配列にnullかなんかを入れないとだめ。
♥0 | Line 67 | Modified 2009-11-17 09:06:59 | MIT License
play

ActionScript3 source code

/**
 * Copyright samegame ( http://wonderfl.net/user/samegame )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/bgNE
 */

/**
 * (問題点:ブロックをクリックして消したい。)
 * 解決: MouseEvent.MOUSE_DOWNのイベント発行
 * ブロック自体はSpriteなので、クリックされたかどうかは容易に判断が出来る
 * ブロックをクリックしたらremoveChild()で削除
 * 
 * 問題点:周りの同じ色が消えない。
 * ブロックから周りを判断するのは出来ないので二次元配列で何とかする
 * それと、ブロックを消したら二次元配列にnullかなんかを入れないとだめ。
 */
package
{
	import flash.display.Sprite;
	
	[SWF(backgroundColor = "0x0")]
	public class Main extends Sprite
	{
		public function Main()
		{
			var panel:Panel = new Panel();
			addChild(panel);
		}
	}
}

import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.filters.BevelFilter;

class Panel extends Sprite // ブロックはパネルに貼る
{
	public static const WIDTH:int = 10; 	// ブロックの数 - 横
	public static const HEIGHT:int = 10; 	// ブロックの数 - 縦
	
	private var blocks:Array; // ブロックが入っている配列(二次元配列)
	
	public function Panel()
	{
		createBlocks();
	}
	
	private function createBlocks():void
	{
		blocks = new Array(WIDTH);
		
		for (var y:int = 0; y < HEIGHT; y++)
		{
			blocks[y] = new Array(HEIGHT);
			
			for (var x:int = 0; x < WIDTH; x++)
			{
				var block:Block = new Block();
				block.x = x * Block.WIDTH;
				block.y = y * Block.HEIGHT;
				addChild(block);
				
				blocks[y][x] = block;
			}
		}
	}
}

class Block extends Sprite
{
	public static const WIDTH:int = 30; 	// ブロックの横幅
	public static const HEIGHT:int = 30; 	// ブロックの縦幅
	
	public static const CW:int = 2;			// 補正幅 - ブロック同士がくっつかないように
	public static const CH:int = 2;			// 補正縦
	
	public static const RW:int = 15;		// drawRoundRect()のellipseWidth
	public static const RH:int = 15;		// drawRoundRect()のellipseHeight
	
	public function Block()
	{	
		graphics.beginFill(Color.COLORS[int(Math.random() * Color.COLORS.length)]); // ランダムで色を選ぶ
		graphics.drawRoundRect(CW, CH, WIDTH - CW, HEIGHT - CH, RW, RH);
		graphics.endFill();
		
		this.filters = [new BevelFilter(4, 45, 0xFFFFFF, 1, 0x0, 1, 20, 20, 1, 3, "inner")]; // ベベルフィルターでブロックに質感を持たせる
		
		addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); // ブロックをクリックしたらonMouseDown()を呼ぶ
	}
	
	private function onMouseDown(event:MouseEvent):void
	{
		this.parent.removeChild(this); // 親の名前が分からないのでthis.parentで代用する。自分自身をremoveChild()で消す。
	}
}

// ブロックの色を保持している
class Color
{
	public static const COLORS:Array = [0xED1A3D, 0x00B16B, 0x007DC5];
}

Forked