javascript拼图游戏

           <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
    <title></title>
	<style type='text/css'>
	div,h3{ margin:0 auto; list-style:none;}
	.wrapper{ width:950px; height:950px; position:relative; float:left; margin-top:8px}
	.wrapper .layer{ position:absolute;}
	</style>
  </head>
  <body>
    
	<input type='text' size='80' id='url' value='http://www.chhblog.com/upload/1/images/demo/798b8af56b4a41a5b2115cbdb5ce06de.jpg'/>
	<input type='radio' value='3' id='norm1' name='norm' checked/>
	<label for='norm1'>3x3</label>
	<input type='radio' value='4' id='norm2' name='norm'/>
	<label for='norm2'>4x4</label>
	<input type='button' value='自定义图片' οnclick='startGame();'/>
	<img id='imgData' style='display:none'/>
	<div class='wrapper' id='wrapper'>
	</div>
    
	<script type='text/javascript'>
	(function(){
	var magic = '$ROOT';
	var root = window[magic] = {};
	var uidCount = 0;

	var UIBase = window["UIBase"] = function()
	{
		var self = this;
		
		var setGlobal = function(id ,obj)
		{
			root[id] = obj;
			return magic + '[\''+ id +'\']';
		}

		var unsetGlobal = function(id)
		{
			delete root[id];
		}

		var formatHtml = function (tpl){
			return (tpl
				.replace(/##/g, self.id)
				.replace(/\$\$/g, self._globalKey));
		}    
		
		var initUIBase = function (){
			self.id = '$UI'+ (++uidCount) ;
			self._globalKey = setGlobal(self.id , self );
		}
		
		this.render = function (holder){
			var html = this.renderHtml();
			var jquery = $(html);
			$("#"+holder).append(jquery);
		}
		
	  
		this.renderReplace = function(target)
		{
		   target.replaceWith(this.renderHtml()); 
		}
		
			
		this.getDom = function (){
		   return $(document.getElementById(this.id));
		}
		
		this.getHtmlTpl = function (){
			return '';
		}
		
		this.renderHtml = function (){
			return formatHtml(this.getHtmlTpl());
		}
		
		this.dispose = function (){
			var box = this.getDom();
			box.remove();
			unsetGlobal(this.id);
		}
		
		initUIBase();
	}})()
	
	var Drag = function(pop)
	{
		var element = pop.getElement();
		var title = pop.getDragBar();
		var elementX,elementY, pointX, pointY;
		var currLeft , currTop;
		var self = this;
		
		var mouseDown = function(e)
		{
			 title.css('cursor','move');
			 $(document).bind('mousemove',mouseMove);
			 $(document).bind('mouseup',mouseUp)		 
			 elementX = currLeft = parseFloat(element.css('left'));
			 elementY = currTop = parseFloat(element.css('top'));
			 pointX = e.pageX;
			 pointY = e.pageY;		 
			 e.stopPropagation();
			 e.preventDefault();
			 if(typeof(self.onDown) == 'function') self.onDown(self);
		}
		
		var mouseMove = function(e)
		{
			currLeft = elementX + e.pageX - pointX;
			currTop = elementY + e.pageY - pointY
			element.css('left',currLeft);
			element.css('top',currTop);
			e.stopPropagation();
			e.preventDefault();
			if(typeof(self.onMove) == 'function') self.onMove(self);
		}
		
		var mouseUp = function(e)
		{
			title.css('cursor','default');
			$(document).unbind('mousemove',mouseMove);
			$(document).unbind('mouseup',mouseUp);
			e.stopPropagation();
			e.preventDefault();
			if(typeof(self.onUp)=='function') self.onUp(self);		
		}
		
		this.onUp = function(){};
		this.onMove = function(){};
		this.onDown = function(){};
		
		this.getLeft = function(){return currLeft};
		this.getTop = function(){return currTop};	
		
		this.bind = function()
		{
		   title.bind('mousedown',mouseDown);
		}
		
		this.unbind = function()
		{
		   title.unbind('mousedown', mouseDown);
		}
	}

	 
	 var Layer = function( num , bgPosition , size , bgUrl)
	 {
	    UIBase.call(this);
		
	    var self = this;
		var end ;
		var drag ;
		
		this.onMove = function(sender , currPoint){}
		this.onUp = function(sender , currPoint){}
		this.onDown = function(sender , currPoint){}
		
		this.getNum = function(){
		    return num;
		}
		
		this.setEnd = function(point)
		{
		    end = point;
		}
		
		this.getEnd = function()
		{
		    return end;
		}
		
		this.gotoEnd = function()
		{
		    this.getDom().animate( end , 400 );
		}
		
		this.getHtmlTpl = function()
		{
		    return '<div num='+ this.getNum() +' id="##" class="layer" style="background-image:url('+ bgUrl +') ;background-position:'+ bgPosition.left  +'px '+ bgPosition.top+'px; width:'+ size.width +'px ; height : '+ size.height +'px"></div>';
		}
		
		this.unbindDragEvent = function()
		{
		    drag.unbind();
		}
		
		this.render = function(holder)
		{			
		    $('#'+holder).append($(this.renderHtml()));
			this.getDom().css(end);
			
			var getPoint = function(drag)
			{
			    var point = {
				    left : drag.getLeft(),
					top : drag.getTop()
				}
				return point;
			}
			
		    drag = new Drag({
			    getElement:function(){return self.getDom();},
				getDragBar: function(){ return self.getDom();}
			});
			
			drag.onMove = function(drag)
			{
			    var point = getPoint(drag);
				self.onMove(self , point);
			}

			drag.onUp = function(drag)
			{
			    var point = getPoint(drag);
				self.onUp(self , point);
			}
			
			drag.onDown = function(drag)
			{
			    var point = getPoint(drag);
				self.onDown(self, point);
			}
			
			drag.bind();	
		}
	 }
	 
	 
	 var Puzzle = function(imgUrl , imgSize , norm)
	 {
	     var layers = new Array ;
		 var isVictory = false;

		 var onMove = function(sender , currPoint)
		 {
		    var ref ;
		    for(var i = 0 ; i < layers.length ; i ++)
			{
			    var layer = layers[i];
			    var lp = layer.getEnd();
				var cp = currPoint;
				var transverse = cp.left - lp.left;
				var vertical = cp.top - lp.top;
				transverse = Math.abs(transverse);
				vertical = Math.abs(vertical);
				if(layer != sender && transverse <= 8 && transverse >=0 && vertical <=8 && vertical >=0)
                {
				    layer.setEnd(sender.getEnd());
                    layer.gotoEnd();
					sender.setEnd(lp);
					ref = layer;
					break;
                }				
			}
			if(ref) swapLayer(sender , ref);
		 }
		 
		 var swapLayer = function(layer1 , layer2)
		 {
		     var getIndex = function(layer)
			 {
			    for(var i = 0 ; i < layers.length ; i ++)
				{
				    if(layers[i] == layer) return i;
				}
			 }
			 
			 var index1 = getIndex(layer1);
			 var index2 = getIndex(layer2);
			 
			 layers[index1] = layer2;
			 layers[index2] = layer1;
		 }
		 
		 var checkVictory = function()
		 {
		     isVictory = true;
		     for(var i = 0 ; i < layers.length ; i ++)
			 {
			     if(layers[i].getNum() != i) isVictory = false;
			 }
			 if(isVictory)
			 {
			     alert('拼图成功');
				 for(var i = 0 ; i < layers.length ; i ++)
				 {
				     layers[i].unbindDragEvent();
				 }
			 }
		 }
		 
		 var onUp = function(sender , currPoint)
		 {
		    sender.gotoEnd();
			checkVictory();
		 }
		 
		 var onDown = function(sender , currPoint)
		 {
		    for(var i = 0 ; i < layers.length ; i ++)
			{
			    layers[i].getDom().css('z-index',0);
			}
			sender.getDom().css('z-index',1);
		 }
		 
		 
		 this.initialize = function()
		 {
			var getPoint = function(i)
			{
				var left = i % norm * layerWidth;
				var top =  Math.floor(i / norm) * layerHeight;
				return { left : left , top :  top }
			}		 
			 
			var layerWidth = imgSize.width / norm;
			var layerHeight = imgSize.height / norm;
			
			for(var i = 0 ; i < Math.pow(norm,2) ; i ++)
			{
			    var point = getPoint(i);
                var bgPosition = {left : - point.left , top : - point.top};
				var size = {width : layerWidth , height : layerHeight};
                var layer = new Layer(i, bgPosition , size, imgUrl);		
                layer.onMove = onMove;
                layer.onUp = onUp;	
                layer.onDown = onDown;							
                layers.push(layer);					
			}
            
			layers.sort(function(){
			    return Math.ceil(Math.random() - Math.random());
			})
			
			for(var i = 0 ; i < layers.length ; i ++)
			{
                var point = getPoint(i);
                layers[i].setEnd(point);				
    			layers[i].render('wrapper');
			}
		 }
	 }
	 

	 function startGame()
	 {
	     $('#wrapper').empty();
	     var url = $('#url').val();
		 var norm = $('input[@name=norm]:checked').val();
		 var img = document.getElementById('imgData');
		 img.onload = function()
		 {
		     var width = $(this).width();
			 var height = $(this).height();
			 var g = new Puzzle(url , {width : width , height : height}, norm);
			 g.initialize();
		 }
		 img.src = '';
		 img.src = url;
	 }
	 
	 startGame();
	 
	</script> 
  </body>
</html>
        
演示地址: 点击打开链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值