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

lightsout

昔あった電子玩具のライツアウトを作ってみました。
クリックしたパネルと上下左右のパネルの色が反転します。
すべて点灯させるか消すとクリアです。
Get Adobe Flash player
by toburau 27 Apr 2010
/**
 * Copyright toburau ( http://wonderfl.net/user/toburau )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/hEUo
 */

// 昔あった電子玩具のライツアウトを作ってみました。
// クリックしたパネルと上下左右のパネルの色が反転します。
// すべて点灯させるか消すとクリアです。
package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;

	[SWF(frameRate="30", width="465", height="465", backgroundColor="0x000000")]

	public class Project9 extends Sprite {

		public function Project9() {
			for(var i:int=0; i<MAPSIZE*MAPSIZE; i++) {
				var mapx:int = i%MAPSIZE;
				var mapy:int = i/MAPSIZE;
				g_Map[i] = new Panel(i);
				g_Map[i].x = mapx * (XSIZE+GAP);
				g_Map[i].y = mapy * (YSIZE+GAP);
				addChild(g_Map[i]);
			}
			addEventListener(MouseEvent.CLICK, onMouseClick);
			g_Mode = MODE_TITLE;

			g_Message = createTextField(100, SCREEN_HEIGHT/3, SCREEN_WIDTH, 32, 0x00ff80);
			g_Message.text = "Click to Start";
			addChild(g_Message);
		}

		// マウスがクリックされたとき
		private function onMouseClick(e:MouseEvent):void {
			if(g_Mode == MODE_TITLE)
			{
				g_Message.text = "";
				g_Mode = MODE_PLAY;
				removeChild(g_Message);
				// ランダムに反転して問題を作成
				var n:int = Math.round(Math.random()*10) + 10;
				for(var j:int=0; j<n; j++)
				{
					var pos:int = Math.floor(Math.random()*MAPSIZE*MAPSIZE);
					g_Map[pos].push();
				}
				return;
			}
			else if(g_Mode == MODE_CLEAR)
			{
				g_Message.text = "Click to Start";
				g_Mode = MODE_TITLE;
				return;
			}

			// クリア判定
			for(var i:int = 0; i<MAPSIZE*MAPSIZE-1; i++) {
				if(g_Map[i].isVisible() != g_Map[i+1].isVisible()) {
					return;
				}
			}
			
			g_Message.text = "Clear !!";
			g_Mode = MODE_CLEAR;
			addChild(g_Message);
		}
	} 
}

import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.filters.GlowFilter;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;

const SCREEN_WIDTH:int = 465;
const SCREEN_HEIGHT:int = 465;
const SCREENX:int = 465; // マップピクセルXサイズ
const SCREENY:int = 465; // マップピクセルYサイズ
const MAPSIZE:int = 5; // マップ1辺個数
const GAP:int = 5; // 隣のパネルとの間隔
const XSIZE:int = (SCREENX-GAP*(MAPSIZE-1))/MAPSIZE;
const YSIZE:int = (SCREENY-GAP*(MAPSIZE-1))/MAPSIZE;
// マップデータ
var g_Map:Array = new Array(MAPSIZE*MAPSIZE);
// モード(0:Title,1:Play,2:Clear)
const MODE_TITLE:int = 0;
const MODE_PLAY:int = 1;
const MODE_CLEAR:int = 2;
var g_Mode:int = MODE_TITLE;
var g_Message:TextField = new TextField;

// 1つのパネル
class Panel extends Sprite {
	private var _OffCol:int = 0x808080;
	private var _OnCol:int = 0x00FF00;
	private var _Round:int = 15;
	private var _OnPanel:Sprite = new Sprite();
	private var _PanelNo:int = 0;

	public function Panel(i:int) {
		_PanelNo = i;
		graphics.beginFill(_OffCol);
		graphics.drawRoundRect(0, 0, XSIZE, YSIZE, _Round);
		graphics.endFill();
		_OnPanel.graphics.beginFill(_OnCol);
		_OnPanel.graphics.drawRoundRect(0, 0, XSIZE, YSIZE, _Round);
		_OnPanel.graphics.endFill();
		_OnPanel.filters=[new GlowFilter(0x00FF00,1.0,16.0,16.0,2,2,false,false)];
		_OnPanel.visible = false;
		addChild(_OnPanel);
		addEventListener(MouseEvent.CLICK, onClick);
	}
	// Visible取得
	public function isVisible():Boolean { 
		return _OnPanel.visible;
	}
	// Push
	public function push():void {
		setReverse();
		setNeighbor();
	}
	// クリックされたときの処理
	private function onClick(e:MouseEvent):void {
		if(g_Mode != MODE_PLAY) return;
		push();
	}
	// 反転
	public function setReverse():void {
		_OnPanel.visible = !_OnPanel.visible;
	}
	// 4近傍の反転
	private function setNeighbor():void {
		var mapx:int = _PanelNo%MAPSIZE;
		var mapy:int = _PanelNo/MAPSIZE;
		var up:int = mapy-1;
		if(up >= 0) {
			g_Map[up*MAPSIZE+mapx].setReverse();
		}
		var down:int = mapy+1;
		if(down < MAPSIZE) {
			g_Map[down*MAPSIZE+mapx].setReverse();
		}
		var left:int = mapx-1;
		if(left >= 0) {
			g_Map[mapy*MAPSIZE+left].setReverse();
		}
		var right:int = mapx+1;
		if(right < MAPSIZE) {
			g_Map[mapy*MAPSIZE+right].setReverse();
		}
	}
}

// TextFieldの作成。ABAさんのBallBlastより
function createTextField(x:int, y:int, width:int, size:int, color:int,
					 align:String = TextFormatAlign.LEFT):TextField
{
	var fm:TextFormat = new TextFormat;
	fm.font = "_typewriter"; fm.bold = true;
	fm.size = size; fm.color = color;
	fm.align = align;
	var fi:TextField = new TextField;
	fi.defaultTextFormat = fm;
	fi.x = x; fi.y = y; fi.width = width;
	fi.selectable = false;
	return fi;
}