源代码下载
地图有了,算法也有了.那么现在就是如何把这些给结合起来并显示出来了.
我们游戏中的每一个图案,我们可以把他抽象为一个方块类 Block类.因为他是可以被点击的,所以我们可以直接用一个SimpleButton来实现,SimpleButton它有四个属性可以设置按钮各种状态的显示对象.
我们的算法在什么时候调用呢?什么每点一次Block就得调用一次呢?其实是没有必要的,必须得上次已经有点过一次图案了,那么再点击另外一个图案 时才需要调用算法来进行寻路检测,因此我们必须要记录上一次到底是点了哪一个按钮,以及本次到底点了哪个按钮?我在程序里分别使用了两个数组来记录这两个 数据,上一次按下的记录为lastClick:Array,本次按的为nowClick:Array,如果游戏刚开始还没有点击过任何一个图案或者刚消完 一对图案,那么此时的上一个点击就为空了,所以就设为[-1,-1],所以只要判断上一次点击的不是[-1,-1],而且现在按的不跟上一次按的一样,就 是调用算法的时候了.
本人对数组有种特别的感情,因为数组有一个好处,就是他的副本跟他本身在内存中指的都是同一个地址,这有点类似于C++中的指针,所以,我们只需要 修改其中的一个,就可以全部都修改到,所以我们在实例化一个Block实例的时候,传了一个nowClick的副本给他,然后在每一次点击图案的时候,对 副本进行改值,此时,nowClick本身的值也跟着给改了.
以下是Block类的全代码.
/*
Author: Alan.Lin
Blog:http://www.conanlwl.net
连连看方块类 Block
_nowClick: 当前点击坐标附给数组
_type: 图标类型
_rows: 当前行数
_cols: 当前列数
*/
package net.conanlwl
{
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.filters.ConvolutionFilter;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.filters.ColorMatrixFilter;
import flash.events.Event;
public class Block extends Sprite
{
public var type:uint;
public var rows:uint;
public var cols:uint;
private var button:SimpleButton;
private var nowClick:Array;
public static const BLOCKWIDTH:uint = 32;
public function Block(_nowClick:Array,_type:uint=0,_rows:uint=0,_cols:uint=0){
type=_type;
rows=_rows;
cols=_cols;
nowClick = _nowClick;
button = new SimpleButton();
button.x=button.y=0;
button.addEventListener(MouseEvent.CLICK,onClick);
setState(0);
addChild(button);
}
public function setState(state:uint):void
{
var bit:Bitmap = new Bitmap(GameSource.PngArray[type-1]);
if(state>0){
//灰阶
//bit.filters=[new ColorMatrixFilter([0.3086,0.6094,0.0820,0,0,0.3086,0.6094,0.0820,0,0,0.3086,0.6094,0.0820,0,0,0,0,0,1,0])];
//暴光
bit.filters=[new ColorMatrixFilter([-1,0,0,0,255,0,-1,0,0,255,0,0,-1,0,255,0,0,0,1,0])];
}
button.upState = button.overState = button.downState = button.hitTestState = bit;
}
private function onClick(e:MouseEvent):void{
setState(1);
nowClick[0] = rows;
nowClick[1] = cols;
dispatchEvent(new Event("ClickMe"));
}
}
}
在显示方面,我新建了一个精灵类mapLayer:Sprite来专门显示整个游戏地图,这样子,也便于对整个地图的显示与隐藏的操作,例如你想要 做一个暂停的功能,那么当按暂停的时候,我们必须把地图给隐藏起来.这时只要对mapLayer进行操作就可以了.以下是地图显示的代码
private function drawMap():void{
if(getChildByName("mapLayer")!=null)
removeChild(getChildByName("mapLayer"));
mapLayer = new Sprite();
mapLayer.name = "mapLayer";
addChild(mapLayer);
for(var i:uint=0;i<mapArray.length;i++){
for(var j:uint=0;j<mapArray[i].length;j++){
var b:Block = new Block(nowClick,mapArray[i][j],i,j);
b.x = j*32;
b.y = i*32;
b.name = "b_" + i + "_" + j;
b.addEventListener("ClickMe",onClick);
mapLayer.addChild(b);
}
}
}
最后就是对图案监听所分派的事件onClick的代码实现了:
private function onClick(e:Event):void{
if(lastClick[0]!=-1 && lastClick[1]!=-1){
if(findShortRoad(lastClick[1],lastClick[0],nowClick[1],nowClick[0]))
{
drawLine();
//延时连线显示的时间
var timer:Timer = new Timer(200,1);
timer.addEventListener(TimerEvent.TIMER,onTimer);
timer.start();
function onTimer(e:TimerEvent):void{
drawMap();
removeChild(roadPointImage);
}
mapArray[lastClick[0]][lastClick[1]]=0;
mapArray[nowClick[0]][nowClick[1]]=0;
lastClick[0]=lastClick[1]=-1;
///游戏模式
switch(gameState){
case "but1"://失去重心
map.change_AllUp();
break;
case "but2"://向左走
map.change_AllLeft();
break;
case "but3"://向右走
map.change_AllRight();
break;
case "but4"://地心引力
map.change_AllDown();
break;
case "but5"://开天辟地
map.change_MiddleToTopBottom();
break;
case "but6"://天地合一
map.change_TopBottomToMiddle();
break;
case "but7"://兵分两路
map.change_CenterToLeftRight();
break;
case "but8"://左右夹攻
map.change_LeftRightToCenter();
break;
case "but9"://分久必合
map.change_LeftRightToCenter();
map.change_TopBottomToMiddle();
break;
case "but10"://合久必分
map.change_CenterToLeftRight();
map.change_MiddleToTopBottom();
break;
default://普通模式
break;
}
//查解
if(!map.gameFinished()){
while(!hasRoad()){
map.cutCard();//洗牌
drawMap();
}
}
else{
DrawTitle();
}
}
else
{
if(lastClick[0]!=nowClick[0] || lastClick[1] != nowClick[1])
(Block(mapLayer.getChildByName("b_" + lastClick[0] + "_" + lastClick[1]))).setState(0);
lastClick[0]=nowClick[0];
lastClick[1]=nowClick[1];
}
}
else
{
lastClick[0]=nowClick[0];
lastClick[1]=nowClick[1];
}
}
由于代码较多,所以不能面面都讲到,如果大家对代码有什么不明白的地方或者有更好的算法建议,欢迎在些发表评论探讨.最后奉上代码:
源代码下载
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |