发新话题
打印

[教材] 再写拼图

本帖已经被作者加入个人空间

再写拼图

今天没多少事,心血来潮,做了一个拼图游戏。高手们就不用往下看了,浪费你的宝贵时间。  新手们可以往下看看,如果对你有所益,请回复一句,也算是对在下发帖的一点肯定。
效果在下面,最好是下载播放效果更好些
拼图的方法有多种,flash8以前使用的是图片在flash内部先分割为几块,再进行拼图游戏制作
由于flash8有了位图类,所以,可以通过它来制作拼图游戏,这样就省去了分割之事(实际上只是将分割之苦交与程序去完成,还是需要分割的, )。
闲话少说,言归正传。
1.打开flash,设置其长与宽分别是940*400,背景为黑色的"拼拼美女.fla"文件,见图1。
2.准备几张图片,长与宽不要差大多了就行。(我用了6张,500*345左右的),将它们分别导入到flash里,见图2。 打开库面板,分别为图片链接名为image1,image2,... image6,见图3。
3."拼拼美女.fla"文件共有3帧,见图4。
第一帧上的代码是:
复制内容到剪贴板
代码:
stop();
//==   库中图片链接名
var imag_array:Array = ["image1", "image2", "image3", "image4", "image5", "image6"];
//````  打乱排列 ```````````````````````````````````````
imag_array.sort(function () {
        return Math.round(Math.random()) ? 1 : -1;
});
//=== walk  决定是否拼完了所有图片
var walk:Boolean = true;
//===   缓动类,图片产生运动特效 水平 垂直和旋转运动
import mx.transitions.Tween;
import mx.transitions.easing.*;
function img_mc_tween(target:MovieClip, xstart:Number, xend:Number, ystart:Number, yend:Number) {
        var myTweenx:Tween = new Tween(target, "_x", Strong.easeOut, xstart, xend, 1, true);
        var myTweeny:Tween = new Tween(target, "_y", Strong.easeOut, ystart, yend, 1, true);
        var myTweenr:Tween = new Tween(target, "_rotation", Strong.easeOut, 0, 360, 1, true);
}
//===   loading 检测
onEnterFrame = function () {
        var l:Number = _root.getBytesLoaded();
        var t:Number = _root.getBytesTotal();
        var p:Number = Math.round(l/t)*100;
        load_txt.text = "loading: "+p+"%";
        if (l == t) {
                delete onEnterFrame;
                this.play();
        }
};
第2帧上是空的,留着它是为第3帧上的代码服务的
第3帧上的代码:
复制内容到剪贴板
代码:
stop();
//导入位图等类
import flash.display.BitmapData;
import flash.filters.*;
import flash.geom.Rectangle;
import flash.geom.Point;
//   初始切割水平与垂直数,以及递增量
if (index == undefined && num == undefined) {
        index = 0;
        var n:Number = 4;
        num = n;
} else {
        //  最多水平与垂直数切割12刀
        if (num<14) {
                num += 2;
        }
        //  取库中图片                                               
        index += 1;
        if (index>Number(imag_array.length-1)) {
                timeBar_mc._visible = false;
                时间条背景._visible = false;
                walk = false;
                gameOver_txt.text = "你是拼图高手!";
                now_txt.text = "";
                gameover();
        }
}
now_txt.text = index+1+" / "+imag_array.length;
var finish_array:Array = new Array(num*num);
var bmp:BitmapData = BitmapData.loadBitmap(imag_array[index]);
var filter:BevelFilter = new BevelFilter(2, 45);
var w:Number = bmp.width/num;
var h:Number = bmp.height/num;
//====================
//===  样图  ======================================================================
showImage = this.createEmptyMovieClip("showImage", -5);
showImage.attachBitmap(bmp, -4);
showImage.filters = [new ConvolutionFilter(3, 3, [-2, -1, 0, -1, 1, 1, 0, 1, 2]), new ColorMatrixFilter([-1, 0, 0, 0, 255, 0, -1, 0, 0, 255, 0, 0, -1, 0, 255, 0, 0, 0, 1, 0])];
//浮雕  底片效果,颜色反转
var x0:Number = Stage.width/2-showImage._width/2;
showImage._x = x0;
showImage._y = 10;
showImage._alpha = 40;
var w0:Number = showImage._width;
var init_array:Array = [];
//==============  各张小图片的坐标   ======================================================
var xy_array:Array = [];
for (var i:Number = 0; i<num; i++) {
        for (var j:Number = 0; j<num; j++) {
                xy_array.push([x0+i*w, j*h]);
        }
}
//====================  画背景方格  ===================================================
this.createEmptyMovieClip("viewLine_mc", -1);
with (viewLine_mc) {
        lineStyle(1, 0x669933, 80);
        moveTo(0, 0);
        lineTo(w, 0);
        lineTo(w, h);
        lineTo(0, h);
        lineTo(0, 0);
        _visible = false;
}
for (var i:Number = 0; i<num*num; i++) {
        init_array.push([i, 1]);
        viewLine_mc.duplicateMovieClip("view"+i, i, {_x:xy_array[i][0], _y:10+xy_array[i][1]});
}
//===================
//=====  图片分割   ======================================================================================
for (var i:Number = 0; i<num*num; i++) {
        this["b"+i] = new BitmapData(w, h);
        this["b"+i].copyPixels(bmp, new Rectangle(xy_array[i][0]-x0, xy_array[i][1], w, h), new Point(0, 0));
        this["mc"+i] = this.createEmptyMovieClip("mc"+i, this.getNextHighestDepth());
        this["mc"+i].attachBitmap(this["b"+i], this.getNextHighestDepth());
        this["mc"+i].no = 0;
        this["mc"+i]._x = xy_array[i][0];
        this["mc"+i]._y = 10+xy_array[i][1];
        this["mc"+i].filters = [filter];
        //======  图片产生运动特效
        img_mc_tween(this["mc"+i], 10+xy_array[i][0], random(2) == 1 ? 10+random(160-w/2) : x0+w0+10+random(160-w/2), 10+xy_array[i][1], 10+random(bmp.height-h));
        //=====
        this["mc"+i].onPress = function() {
                d = this.getDepth();
                this.swapDepths(_root.getNextHighestDepth());
                this.startDrag();
        };
        this["mc"+i].onRelease = this["mc"+i].onReleaseOutside=function () {
                var n = this._name.substr(2, 3);
                var temNum:Number = 0;
                if (this.hitTest(_root["view"+n])) {
                        this._x = _root["view"+n]._x;
                        this._y = _root["view"+n]._y;
                        // ==  对象属性变1,表示放对了
                        this.no = 1;
                        finish_array[n] = [n, 1];
                        //  判断是否结束
                        for (var i:Number = 0; i<num*num; i++) {
                                if (finish_array[i][1] != undefined) {
                                        temNum += Number(finish_array[i][1]);
                                }
                                //====  如果两个二元数组中的元素一一对应了 ,游戏结束,重新出图                                                                                                   
                                if (temNum == num*num && init_array[i][0] == finish_array[i][0] && init_array[i][1] == finish_array[i][1]) {
                                        gameover();
                                }
                        }
                } else {
                        //======  图片产生运动特效
                        img_mc_tween(this, this._x, random(2) == 1 ? 10+random(160-w/2) : x0+w0+10+random(160-w/2), this._y, 10+random(bmp.height-h));
                }
                this.swapDepths(d);
                this.stopDrag();
        };
}
//=======  时间表
var s:Number = 0;
timeBar_mc._xscale = 100;
function runTimer() {
        s += 1;
        //300 =五分钟
        timeBar_mc._xscale = 100-100*(s/300);
        //=====                                                                                                                             
        if (timeBar_mc._xscale<=1) {
                gameover();
        }
}
var ID:Number;
if (walk) {
        ID = setInterval(runTimer, 1000);
}
//====  gameover                                                         
function gameover() {
        clearInterval(ID);
        for (var i:Number = 0; i<num*num; i++) {
                _root.bmp.dispose();
                _root["b"+i].dispose();
                _root["mc"+i].removeMovieClip();
                viewLine_mc.removeMovieClip();
                _root["view"+i].removeMovieClip();
        }
        timeBar_mc._xscale = 0;
        if (walk) {
                gotoAndPlay(2);
        }
}
[ 本帖最后由 sxl001 于 2007-12-26 01:10 编辑 ]

附件

拼拼美女.swf (179.87 KB)

2007-12-25 21:02, 下载次数: 194

拼拼美女.fla (218 KB)

2007-12-25 21:02, 下载次数: 443

欢迎到前往我的小站看看    手机:13528609051

TOP

老师好

太高深了看不懂 笑纳了 师傅我什么时候能象您那样啊

TOP

支持~!   那图片转的很有意思  哈哈哈
FLASH Everyday

TOP

太感谢了

谢谢楼主

TOP

太感谢了

好好学习一下

TOP

高手
<!----------------我一脚踏进棺材,而你却离我很近!------------------>

TOP

感谢兄弟提供基础实例!

TOP

太厉害了

TOP

TOP

请问一下,学成那样,需要多少时间,纯时间!谢谢

TOP

请问一下,你做那个拼图做了多长时间!

TOP

高手!代码写得非常简练!
不过有个小bug:通关后下面显示当前第几关的数字会继续累加,结果就是比总关数多1;
修改为
now_txt.text = (walk?index+1:index) +" / "+imag_array.length;
就可以了。
另外如果时间到了还没拼完,没有按失败处理,而是继续到下一关。看来得自己写多个函数处理这种情况了,呵呵~

TOP

我只会做简单的动作,代码那个东东看的我头疼,崇拜楼主

TOP

,,,厉害,,,  ,,,,,,,,,,,,,,

楼主好人,,, ,,,,,,
泡家  http://space.flash8.net/space/?635905

TOP

厉害,,,  ,,,,,,,,,,,,,,
我没有天份。。但有后天的自信、顽固、拼搏、坚持。。。。。。FLASH技术交流群:56785596

TOP

苏大哥你真棒

TOP

学习了

TOP

学习了~~~

TOP

好,收藏了.呵呵

TOP

真N呀!
一直在做最最最基础的工作......

TOP

搂住教材发的好哇,我支持阿
做什么都不要紧,总而言之一定要赢

TOP

谢谢 楼主   学习了

TOP

占位学习,随便求个FLASH cs3迅雷下载地址。

TOP

做我就不行了,玩还可以
轻点挤轻点挤~~别踩我的脚丫~~

TOP

很不错啊~
小站不断更新中……
www.hopboy.com
www.adobebar.cn

TOP

我转到博博好好学习~~
有点难~

TOP

学习啊,谢谢楼主

TOP

发新话题