AS3-LightOut
来个LightOut小游戏,至于LightOut是啥,可以看这里:http://en.wikipedia.org/wiki/Lights_Out_%28game%29
如果该页面被和谐,那可以看下@dfdou的简单介绍,LightOut是一个开/关游戏,游戏的目的很简单,在5x5的的方阵里,把全部的图换成亮着的状态就过关了,Demo里是白色方块代表亮起状态。
规则是点击一个方块,在方块4周的4个方块和方块本身的状态会发生改变,是亮起就变成关掉,是关掉就变成亮起~
Demo在这里:
下边来讲下代码部分,比较简单,3个类搞定。
LightOut.as:
[js]
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class LightOut extends Sprite {
private var _lv = 0;
private var _map:Map;
public function LightOut() {
init();
}
private function init():void {
_map = new Map(_lv);
addChild(_map);
addEventListeners();
}
private function addEventListeners():void {
addEventListener(MouseEvent.MOUSE_DOWN, changeLight);
}
private function changeLight(e:MouseEvent):void
{
var tx:int = mouseX / Config.TILE_SIZE < < 0;
var ty:int = mouseY / Config.TILE_SIZE << 0;
var numRows:int = _map.getMapData().length;
var numCols:int = _map.getMapData()[0].length;
for (var i:int = 0; i < numRows; i++) {
for (var j:int = 0; j < numCols; j++) {
if (Math.abs(i - tx) + Math.abs(j - ty) <= 1) {
if (_map.getMapData()[j][i] == 0) {
_map.setMapData(j,i,1);
}else {
_map.setMapData(j,i,0);
}
}
}
}
}
}
}
[/js]
Config.as,用来配置常数和地图。
[js]
package
{
/**
* ...
* @author DFdou
*/
public class Config
{
public static const TILE_SIZE = 25;
public static const LIGHT_ON = 1;
public static const LIGHT_OFF = 0;
public static const MAP:Array = [
[
[0, 1, 0, 1, 0],
[0, 1, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 0, 1, 0],
[0, 1, 0, 1, 0]
],
];
}
}
[/js]
Map.as,直接从Sokoban那拷过来的,基本上差不多@.@
[js]
package
{
import flash.display.Sprite;
import flash.events.Event;
/**
* ...
* @author DFdou
*/
public class Map extends Sprite
{
private var _lv:uint;//关卡
private var _mapData:Array = [];//map数据
public function Map(lv:uint=0)
{
_lv = lv;
initMapData(lv);
}
private function initMapData(lv:uint = 0) {
for (var i = 0; i < Config.MAP[lv].length; i++) {
_mapData[i] = [];
for (var j = 0; j < Config.MAP[lv][i].length; j++) {
_mapData[i][j] = Config.MAP[lv][i][j];
}
}
drawMap();
}
private function drawMap() {
var tile:Tile;
for (var i = 0; i < _mapData.length; i++) {
for (var j = 0; j < _mapData[i].length; j++) {
tile = new Tile();
tile.x = j * Config.TILE_SIZE;
tile.y = i * Config.TILE_SIZE;
tile.gotoAndStop(_mapData[i][j]+1);
addChild(tile);
}
}
}
private function repaintMap() {
clearMap();
drawMap();
}
private function clearMap() {
while (numChildren > 0) {
removeChildAt(0);
}
}
private function checkSuccess() {
if(isSuccess()){
trace("Success");
//nextLevel();
}
}
private function isSuccess():Boolean {
var success:Boolean = true;
var numRow:int = _mapData.length;
var numCols:int = _mapData[0].length;
for (var i = 0; i < numRow; i++) {
for (var j = 0; j < numCols; j++) {
success = success && (_mapData[i][j] == Config.LIGHT_ON);
}
}
return success;
}
public function setMapData(py:int, px:int, type:int) {
_mapData[py][px] = type;
repaintMap();
checkSuccess();
}
public function getMapData():Array {
return _mapData;
}
}
}
[/js]
感觉也没什么好讲的地方,就这样吧,有问题请留言,别客气~
May 13th, 2010 - 16:49
[Reply]
草羽 Reply:
2010-5-27 at 12:17 pm
@DFdou, 玩不过…………
[Reply]
May 16th, 2010 - 16:45
博主你好,一直都很关注你的教程。
可惜我是新手,试了一下,做出3个类,主flash文件指向LightOut,编译不通过。不太清楚如何才能编译成你演示的那个demo。
如果你能放上源文件,感激不尽。
[Reply]
DFdou Reply:
2010-5-17 at 1:08 pm
@新手, 具体报什么错误?源文件,给个邮箱地址我发给你吧~
[Reply]
May 17th, 2010 - 13:10
忽然发现没做胜利判断,在这个地方~
private function changeLight(e:MouseEvent):void
22. {
23. var tx:int = mouseX / Config.TILE_SIZE < < 0;
24. var ty:int = mouseY / Config.TILE_SIZE << 0;
25. var numRows:int = _map.getMapData().length;
26. var numCols:int = _map.getMapData()[0].length;
27.
28. for (var i:int = 0; i < numRows; i++) {
29. for (var j:int = 0; j < numCols; j++) {
30. if (Math.abs(i – tx) + Math.abs(j – ty) <= 1) {
31. if (_map.getMapData()[j][i] == 0) {
32. _map.setMapData(j,i,1);
33. }else {
34. _map.setMapData(j,i,0);
35. }
36. }
37. }
38. }
//胜利判断部分
39. }
[Reply]
May 27th, 2010 - 12:19
终于玩过了…………
[Reply]
DFdou Reply:
2010-5-27 at 1:25 pm
@草羽,
为啥我玩了下觉得是无解的……
[Reply]
草羽 Reply:
2010-5-29 at 9:41 am
@DFdou, 耐心点,就玩过啦~~