冲锋岛:原创拼图游戏(不规则形状分割)
即时获得麻球游戏开发的最新消息,关注游戏开发者热门讨论,请各位开发者申请加入麻球官方群:121304476
也可以follow catfly围脖:t.sina.com.cn/iscat

分享一个给冲锋岛做的拼图小游戏。
看到不少讲拼图游戏的帖子,但好像都是方块分割的,这里给大家看的是一个不规则形状分割的例子。

先来看看实际应用中的demo吧:

下面是测试拼图功能的demo:

This movie requires Flash Player 9

示例原文件下载

核心拼图功能代码在这个Jigsaw的类中,可以结合我提供的原文件进行编译!
实现了:

  1. 拖拽拼块
  2. 拼图判断
  3. 每次随机分配三个拼块
  4. 拼图过程中各种动画显示效果

package com.ui.jigsaw {
       import flash.events.Event;
       import flash.display.Sprite;
       import flash.events.MouseEvent;
       import flash.display.MovieClip;
       import flash.utils.getDefinitionByName;
       import com.gs.TweenLite;
       import flash.events.EventDispatcher;

       /**
       * @author rman
       * @version creat:04:37:372009-2-9
       */
       public class Jigsaw extends Sprite{
               //主影片
               private var __jigMain:Class;
               private var jigMain:Sprite;
               private var timeState:Boolean = true;
               //mask与ceil
               private var jigsaw:Sprite;
               private var maskContaint:Sprite;
               private var ceilContaint:Sprite;
               private var dragCeilContain:Sprite;
               private var dropDotContain:Sprite;
               private var xiaoren:MovieClip;
               private var nowDragCeil:Sprite;
               private var bigDropArea:Sprite;
               private var selNum:int = -1;
               private var noNewTempArr:Array = new Array();
               private var dragState:Boolean = false;
               private var jigNum:uint = 0;
               //about ceil
               private var ceilArr:Array = new Array();
               private var activeCeilArr:Array = new Array(0,1,2,3,4,5,6,7,8);

               public function Jigsaw(){
                        initView();

                        //加入主影片剪辑
                        jigMain = new __jigMain();
                        addChild(jigMain);
                        jigsaw = jigMain.getChildByName("jigsaw") as Sprite;

                        /* 获取maskContain与ceilContaint的引用
                        * maskContain: 找对的拼块所显示的对象
                        * ceilContaint: 随机出来的供选择的缩小比例拼块
                        * dragCeilContain: 选择拼块后,跟随鼠标的正常比例拼块*/

                        maskContaint = jigsaw.getChildByName("maskContaint") as Sprite;
                        ceilContaint = jigsaw.getChildByName("ceilContaint") as Sprite;
                        xiaoren = jigsaw.getChildByName("xiaoren") as MovieClip;
                        bigDropArea = jigsaw.getChildByName("bigDropArea") as Sprite;
                        dropDotContain = jigsaw.getChildByName("dropDotContain") as Sprite;
                        dragCeilContain = jigMain.getChildByName("dragCeilContain") as Sprite;

                        //init
                        initmaskContaint();
                        initDropDot();
                        initDragCeil();
                        getCeilArr();
                        upDataCeil();

                        //default jigsaw
                        defaultInDot();

                        addListeners();
                }

                /***********************************
                ** 初始化类函数,加入事件函数
                ***********************************/
                private function initView():void{
                        __jigMain = getDefinitionByName("main") as Class;
                }
                private function initmaskContaint():void{
                        for(var i:uint=0;i<maskContaint.numChildren;i++){
                                var s:Sprite = maskContaint.getChildByName("s"+i) as Sprite;
                                s.visible = false;
                        }
                }
                private function initDropDot():void{
                        for(var i:uint=0;i<maskContaint.numChildren;i++){
                                var dropTag:Sprite = new Sprite;
                                dropTag.name = "dropDot"+i;
                                var s:Sprite = maskContaint.getChildByName("s"+i) as Sprite;
                                var theDot:Sprite = makeArea(25,25);
                                dropTag.addChild(theDot);
                                dropDotContain.addChild(dropTag);
                                dropTag.x = s.x + s.width/2 - 12;
                                dropTag.y = s.y + s.height/2 - 12;
                        }
                }
                private function initDragCeil():void{
                        for(var i:uint=0;i<dragCeilContain.numChildren;i++){
                                var ceil:Sprite = dragCeilContain.getChildByName("drag"+i) as Sprite;
                                ceil.alpha = 1;
                                ceil.scaleX = 1;
                                ceil.scaleY = 1;
                                ceil.x = 0;
                                ceil.visible = false;
                        }
                }
                private function addListeners():void{
                        for(var i:uint=0;i<ceilContaint.numChildren;i++){
                                var ceil:Sprite = ceilContaint.getChildByName("c"+i) as Sprite;
                                ceil.buttonMode = true;
                                ceil.addEventListener(MouseEvent.MOUSE_DOWN, ceilDown);
                                ceil.addEventListener(MouseEvent.MOUSE_OVER, ceilOver);
                                ceil.addEventListener(MouseEvent.MOUSE_OUT, ceilOut);
                                ceil.mouseChildren = false;
                        }
                        for(var k:uint=0;k<dropDotContain.numChildren;k++){
                                var dropDot:Sprite = dropDotContain.getChildByName("dropDot"+k) as Sprite;
                                dropDot.mouseChildren = false;
                        }
                }

                /***********************************
                ** addListeners函数
                ***********************************/
                private function dropInBig():void{
                        //initDragCeil();
                        ceilMoveBack();
                        dragState = false;
                }
                private function defaultInDot():void{
                        var n:uint = Math.random() * 3 + 1;
                        if(n == 1){
                                n = 2;
                        }

                        for(var i:uint=0;i<n;i++){
                                var gotMask:MovieClip = maskContaint.getChildByName("s"+ceilArr[0]) as MovieClip;
                                //trace(ceilArr[0]);
                                selNum = ceilArr[0];
                                gotMask.visible = true;
                                gotMask.gotoAndPlay(2);

                                getCeilArr();
                                upDataCeil();

                                //checkJigNum
                                jigNum++;
                        }
                }
                private function dropInDot(dropDot:Sprite):void{
                        trace(dropDot.name);
                        var n:uint = dropDotContain.getChildIndex(dropDot);

                        //更新ceilContain
                        //trace("n:"+n+"selNum:"+selNum);
                        if(n == selNum && dragState){
                                initDragCeil();
                                var gotMask:MovieClip = maskContaint.getChildByName("s"+n) as MovieClip;
                                gotMask.visible = true;
                                gotMask.gotoAndPlay(2);

                                getCeilArr();
                                upDataCeil();

                                //checkJigNum
                                dropDot.visible = false;
                                jigNum++;
                                checkJigNum();
                        }else{
                                ceilMoveBack();
                        }
                        dragState = false;
                }
                private function ceilOver(evt:MouseEvent):void{
                        var ceil:MovieClip = evt.target as MovieClip;
                        ceil.gotoAndStop(2);
                }
                private function ceilOut(evt:MouseEvent):void{
                        var ceil:MovieClip = evt.target as MovieClip;
                        ceil.gotoAndStop(1);
                }
                private function ceilDown(evt:MouseEvent):void{
                        if(timeState){
                                dispatchEvent(new Event("startGame"));
                                timeState = false;
                        }

                        var ceil:Sprite = evt.target as Sprite;
                        var n:uint = ceilContaint.getChildIndex(ceil);
                        selNum = n;
                        dragState = true;
                        //trace(ceilArr[ceilArr.indexOf(selNum)]);

                        initDragCeil();
                        nowDragCeil = dragCeilContain.getChildByName("drag"+n) as Sprite;

                        nowDragCeil.addEventListener(MouseEvent.MOUSE_UP, nowDragUp);
                        nowDragCeil.visible = true;
                        nowDragCeil.x = mouseX - nowDragCeil.width/2;
                        nowDragCeil.y = mouseY - nowDragCeil.height/2;
                        nowDragCeil.startDrag();
                }
                private function nowDragUp(evt:MouseEvent):void{
                        nowDragCeil.stopDrag();
                        if(nowDragCeil.dropTarget){
                                var dropTag:Sprite = nowDragCeil.dropTarget.parent as Sprite;
                                //trace(dropTag.name.slice(0,7));
                                if(dropTag.name == "bigDropArea"){
                                        dropInBig();
                                }else if(dropTag.name.slice(0,7) == "dropDot"){
                                        dropInDot(dropTag);
                                }else{
                                        dropInBig();
                                }
                        }
                }

                /***********************************
                ** 一些实现jigsaw的方法
                ***********************************/
                private function ceilMoveBack():void{
                        if(dragState){
                                //moveBack 时nowDragCeil半透明,比例缩小一半
                                nowDragCeil.alpha = 0.5;
                                nowDragCeil.scaleX = 0.5;
                                nowDragCeil.scaleY = 0.5;

                                //计算出moveBack的目标x位置
                                var nowCeilIndex:uint = ceilArr.indexOf(selNum);
                                var backX:Number;
                                if(nowCeilIndex == 0){
                                        backX = 25;
                                }else{
                                        backX = nowCeilIndex%3 * 90;
                                }
                                TweenLite.to(nowDragCeil,0.2,{y:380,x:backX});
                                TweenLite.delayedCall(0.2, tLiteComplete);
                        }
                }
                private function tLiteComplete():void{
                        nowDragCeil.alpha = 0;
                        nowDragCeil.visible = false;
                }

                private function checkJigNum():void{
                        if(jigNum == 9){
                                dispatchEvent(new Event("winLevel"));
                                for(var i:uint=0;i<3;i++){
                                        disableCeil(i);
                                }
                        }
                }
                private function disableCeil(n:uint):void{
                        var ceil:Sprite = ceilContaint.getChildByName("c"+ceilArr[n]) as Sprite;
                        ceil.buttonMode = false;
                        ceil.removeEventListener(MouseEvent.MOUSE_DOWN, ceilDown);
                }

                /***********************************
                ** 更新ceilContaint子元素显示状态
                ***********************************/
                private function upDataCeil():void{
                        resetCeil();
                        upDataCeilAnim();
                }
                private function upDataCeilAnim():void{
                        for(var i:uint=0;i<3;i++){
                                var ceilafter:Sprite = ceilContaint.getChildByName("c"+ceilArr[i]) as Sprite;
                                ceilafter.x = i%3 * 80;
                                ceilafter.visible = true;
                        }
                }
                private function resetCeil():void{
                        for(var i:uint=0;i<ceilContaint.numChildren;i++){
                                var ceil:Sprite = ceilContaint.getChildByName("c"+i) as Sprite;
                                ceil.x = 0;
                                ceil.visible = false;
                        }
                }
                private function getCeilArr():void{
                        if(ceilArr.length>0){
                                var n:uint = activeCeilArr.indexOf(selNum);
                                activeCeilArr.splice(n,1);
                                randomArr();
                        }else{
                                randomArr();
                                //trace(activeCeilArr);
                        }
                }

                private function randomArr():void{
                        //tempArr 随 activeCeilArr 更新数据;
                        var tempArr:Array = new Array();
                        for(var index in activeCeilArr){
                                tempArr.push(activeCeilArr[index]);
                        }

                        //noNewTempArr 获取 activeCeilArr == 3 时的数据;
                        if(tempArr.length == 3){
                                trace("--------");
                                trace("begin mechanical arm");

                                for(var index2 in activeCeilArr){
                                noNewTempArr.push(activeCeilArr[index2]);
                                }
                        }

                        //ceilArr分两种情况更新数据
                        if(tempArr.length>2){
                                resetArr(tempArr);
                                trace(ceilArr);

                        }else if(tempArr.length == 2 || tempArr.length == 1){

                                var tempArr2:Array = new Array();
                                for(var index3 in noNewTempArr){
                                        tempArr2.push(noNewTempArr[index3]);
                                }
                                resetArr(tempArr2);
                                trace(ceilArr);
                        }
                }
                private function resetArr(arr:Array):void{
                        for(var i:uint=0;i<3;i++){
                                var arrIndex:uint = Math.random()*arr.length;

                                ceilArr[i] = arr[arrIndex];
                                arr.splice(arrIndex,1);
                        }
                }
                private function makeArea(w:uint,h:uint):Sprite {
                        var area:Sprite = new Sprite;
                        area.alpha=0;
                        area.graphics.beginFill(0x000000,1);
                        area.graphics.drawRect(0,0,w,h);
                        area.graphics.endFill();
                        return area;
                }
        }
}

猫推拼盘

One Response to “冲锋岛:原创拼图游戏(不规则形状分割)”

  1. stone 说:

    看起来很难的样子~~~ 先下载下来研究研究!  [引用]

Leave a Reply