jQuery制作拼图小游戏

 更新时间:2015年01月12日 11:15:12   投稿:hebedich  
这篇文章主要介绍了jQuery制作拼图小游戏,思路与源码都分享给大家,需要的朋友可以参考下

源代码思路分析:

【一】如何生成图片网格,我想到两种方法:

   (1)把这张大图切成16张小图,然后用img标签的src

   (2)只有一张大图,然后每个元素的背景图用css的background-position进行切割定位,这样就需要16个数组[0,0],[-150,0],[-300,0]..........(我采用这种)

【二】图片背景定位数组与布局定位数组

  在选择了使用CSS定位切图,就需要生成数据。

     需要的css背景 定位数组为:[0,0],[-150,0],[-300,0],[-450,0],

                [0,-150],[-150,-150],[-300,-150],[-450,-150],

                [0,-300],[-150,-300],[-300,-300],[-450,-300],

                [0,-450],[-150,-450],[-300,-450],[-450,-450]

     它们当中都用到了[0,-150,-300,-450]其中的值(就是我定义图片高,宽150的倍数值),所以就利用这个值通过for(){}自动生成数组

复制代码 代码如下:

      //this.nCol在这里是4 --- 因为我的拼图是4*4
         // this.nArea是150,是每张图片的宽,高(600px/4)--大图是600*600
            var l = [],
                p = [];
            for(var n=0;n<this.nCol;n++){
                l.push(n*(this.nArea+1));     //生成[0,151,302,453] 网格的布局定位数组,因为我的效果需要边框(图中的绿色边框),所以与css背景定位数组就不一样了
                p.push(-n*this.nArea);         // 生成了[0,-150,-300,-450]就是上面说的,CSS背景定位值
            }
            for(var i=0;i<this.nLen;i++){   // this.nLen 是为 16  
                var t = parseInt(i/this.nCol),
                        k = i - this.nCol*t,
                        aP = [],
                        aL = [];
                    aP.push(p[k],p[t],i); //这里我给css背景定位数组额外加了i,是为第3步判断用的,不需要拿来设置css属性的,我把它设置为标签的属性里[bg-i]
                    aL.push(l[k],l[t]);
                    this.aBgp[i] = aP;
                    this.aLayout[i] = aL;               
            }

【三】判断是否完成

        第二个元素(div)应用了css背景定位  this.aBgp[1] (值为[-150,0,1]) ,而随机分配的布局定位假如是this.aLayout[3] (这里的3是随机生成的)(值为[453,0]),那么left:453px,top:0;

       挪动这个元素,改变的是它的letf,top值,而不是本身结构的顺序,获取这个元素的left,top的值(假如是挪到left:151px,top:0),然后拿来与this.aLayout[1]的值[151,0](里面的1索引,就是本身标签属性的[bg-i]=1也是this.aBgp[1] 的索引)判断,相等就说明这个元素挪动后的位置是正确。

详细代码:

复制代码 代码如下:

/*
    version:2.0
    */
    function GyPuzzleGame(option){
        this.target = $(option.target);
        this.data = option.data; //图片数据
        this.opt = option;
        this.nLen = option.count; //多少张拼图
        this.aColLayout = option.aColLayout || [0,151,302,453];//布局横向数组
        this.aRowLayout = option.aRowLayout || [0,151];//布局竖向数组
        this.aColBgp = option.aColBgp || [0,-150,-300,-450];//布局横向数组
        this.aRowBgp = option.aRowBgp || [0,-150];//布局竖向数组
        this.nCol = this.aColLayout.length;
        this.nRow = this.aRowLayout.length;
        this.aLayout = []; //布局数组
        this.aBgp = []; //css背景定位数组
        this.init();
    }
    GyPuzzleGame.prototype = {
        getRand:function(a,r){
            var arry = a.slice(0),
                newArry = [];
            for(var n=0;n<r;n++){
                var nR = parseInt(Math.random()*arry.length);
                newArry.push(arry[nR]);
                arry.splice(nR,1);
            }
            return newArry;
        },
        setPos:function(){
            for(var i=0;i<this.nLen;i++){               
                var t = parseInt(i/this.nCol),
                    l = i - this.nCol*t,
                    aP = [],
                    aL = [];
                aP.push(this.aColBgp[l],this.aRowBgp[t],i);
                aL.push(this.aColLayout[l],this.aRowLayout[t]);
                this.aBgp[i] = aP;
                this.aLayout[i] = aL;               
            }
        },
        isPass:function(item){
            var _that = this,
                is = 0;
            item.each(function(){
                var l = parseInt($(this).css('left')),
                    t = parseInt($(this).css('top')),
                    i = parseInt($(this).attr('data-bgi'));
                if(l==_that.aLayout[i][0]&&t==_that.aLayout[i][1]){
                    is ++;   
                }               
            });
            return is;
        },
        createDom:function(){
            var layout = this.getRand(this.aLayout,this.nLen);
            // console.log(layout);
            for(var n=0;n<this.nLen;n++){
                var t = parseInt(n/this.nCol),
                    l = n - this.nCol*t;
                var html = $('<div data-bgi="'+this.aBgp[n][2]+'" class="puzzle_list"></div>').
                css({'left':layout[n][0]+'px',
                    'top':layout[n][1]+'px',
                    'background-image':'url('+this.data+')',
                    'background-position':this.aBgp[n][0]+'px'+' '+this.aBgp[n][1]+'px'
                });
                this.target.append(html);
            }
        },
        move:function(){
            var $div = this.target.find('.puzzle_list'),
                _that = this;
            var    hasElem = function(){
                    var t = false;
                    $div.each(function(){
                        if($(this).hasClass("on")){
                            t = true;
                        }
                    });
                    return t;
                };
            // click
            $div.click(function(){
                var $this = $(this);   
                if(hasElem()&&!$this.hasClass("on")){
                    var index = $('.on').index();
                    if($div.eq(index).is(':animated')||$this.is(':animated')){
                        return false;
                    }
                    var l = $div.eq(index).position().left,
                        t = $div.eq(index).position().top,
                        myl = $this.position().left,
                        myt = $this.position().top;
                    $(this).animate({'left':l,'top':t});
                    $div.eq(index).css({'z-index':'1'}).animate({'left':myl,'top':myt},function(){
                            $(this).removeClass("on");
                            $(this).find('span').remove();
                            $(this).css({'z-index':'0'});
                            if(_that.isPass($div) == _that.nLen){
                                if(typeof _that.opt.success == 'function'){
                                    _that.opt.success({target:_that.target});
                                }
                            }
                    });
                }
                else {
                    if($this.hasClass("on")){
                        $this.removeClass("on");
                        $this.find('span').remove();
                    }
                    else {
                        $this.addClass("on").append("<span></span>");
                    }
                }
            });
        },
        init:function(){
            // 设置CSS背景定位与元素布局数组
            this.setPos();
            // 创建元素
            this.createDom();
            // 挪动图片
            this.move();
        }
    }
//实例调用
    new GyPuzzleGame({
        'data':'images/03.jpg',
        'target':'#pA',
        'count':8,
        'success':function(opt){
            opt.target.append('<div class="puzzle_mask"></div><div class="puzzle_pass">恭喜过关</div>');
        }
    });

相关文章

  • 分享我的jquery实现下拉菜单心的

    分享我的jquery实现下拉菜单心的

    jquery库给我们带来了很多方便的地方,使用jquery实现一个简单的下拉菜单已经是很简单了,但也有不同的实现方法。今天自己使用jquery写了一个下拉菜单,参考了Xiaofeng Wang的SexyDropDownMenu2010,其中还是有一些东西感觉值得记录一下。
    2015-11-11
  • jquery中$each()方法的使用指南

    jquery中$each()方法的使用指南

    jQuery 中的each函数 很方便,$.each ()函数封装了十分强大的遍历功能,它可以遍历一维数组、多维数组、DOM , JSON 等等,在javaScript 开发过程中使用$each可以大大的减轻我们的工作量,这里贴一个简单的模仿each的函数,只能处理数组类型的对象。
    2015-04-04
  • jQuery.Ajax()的data参数类型详解

    jQuery.Ajax()的data参数类型详解

    这篇文章主要介绍了jQuery.Ajax()的data参数类型详解,需要的朋友可以参考下
    2017-07-07
  • jQuery得到多个值只能用取Class ,不能用取ID的方法

    jQuery得到多个值只能用取Class ,不能用取ID的方法

    下面小编就为大家带来一篇jQuery得到多个值只能用取Class ,不能用取ID的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • jquery 弹出登录窗口实现代码

    jquery 弹出登录窗口实现代码

    结构定义了两个层,一个为半透明的背景层,一个是弹出层主要结构,都设为浮动position:absolute;背景层遮掉所有body内容很容 易做到。
    2009-12-12
  • jQuery实现的支持IE的html滑动条

    jQuery实现的支持IE的html滑动条

    本文给大家分享的是一段使用jQuery实现支持IE的html滑动条代码,效果非常不错,这里推荐给大家,希望大家能够喜欢。
    2015-03-03
  • JQuery控制div外点击隐藏而div内点击不会隐藏的方法

    JQuery控制div外点击隐藏而div内点击不会隐藏的方法

    这篇文章主要介绍了JQuery控制div外点击隐藏而div内点击不会隐藏的方法,涉及show、hide及stopPropagation等方法的使用技巧,需要的朋友可以参考下
    2015-01-01
  • jquery京东商城双11焦点图多图广告特效代码分享

    jquery京东商城双11焦点图多图广告特效代码分享

    这篇文章主要介绍了jquery京东商城双11焦点图多图广告特效,一个精致的焦点图会吸引用户的注意力,让用户产生浏览网站的兴趣至关重要,现在小编推荐给大家一款特别棒的焦点图,感兴趣的小伙伴可以参考下。
    2015-09-09
  • jQuery 淡入/淡出效果函数用法分析

    jQuery 淡入/淡出效果函数用法分析

    这篇文章主要介绍了jQuery 淡入/淡出效果函数用法,结合实例形式分析了jQuery 淡入/淡出功能fadeIn()、fadeOut()、fadeToggle()及fadeTo()函数基本功能、使用方法与操作注意事项,需要的朋友可以参考下
    2020-05-05
  • 基于jQuery实现弹出可关闭遮罩提示框实例代码

    基于jQuery实现弹出可关闭遮罩提示框实例代码

    这篇文章主要介绍了基于jQuery实现弹出可关闭遮罩提示框实例代码的相关资料
    2016-07-07

最新评论