论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS编程教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

连连看设计思路与源码[三]-显示与操作(as3.0)

文章类别:Flash AS编程 | 发表日期:2008-10-6 18:14:03


[DEMO]连连看试玩 
连连看设计思路与源码[一]-地图类   连连看设计思路与源码[二]-寻路算法   连连看设计思路与源码[三]-显示与操作

源代码下载

地图有了,算法也有了.那么现在就是如何把这些给结合起来并显示出来了.

我们游戏中的每一个图案,我们可以把他抽象为一个方块类 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];                   
            }
        }

由于代码较多,所以不能面面都讲到,如果大家对代码有什么不明白的地方或者有更好的算法建议,欢迎在些发表评论探讨.最后奉上代码:

源代码下载

视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058