`
128kj
  • 浏览: 601522 次
  • 来自: ...
社区版块
存档分类
最新评论

HTML5 推箱子游戏过关演示动画

阅读更多
点击下面链接可看动画:
http://www.108js.com/article/article3/zip1/exam/a.html

效果图:

代码:
 var canvas = document.getElementById("gameBox");
  var context = canvas.getContext("2d");
var imglen = 14; //需预加载的图片数量
/*游戏主对象*/
var FlGame = {
    grade : 2, //关卡
    loadImgLen : 0, //已加载的图片数量
    imgList : {},//缓存所有图像
    map : [],//地图数据
    timer : null, //计时器
    girlPos : [], //女孩的位置
    girlDirec : "down", //女孩当前的朝向(默认正面朝下)
    girlFrame : 0, //女孩动画第N帧,共两帧
    MoveTimes:0,//移动次数 
    UseTime:0,
    lastTime:0,
    msg: document.getElementById("msg"),
    setp:-1,//移动步数
    result:[],//过关答案
    init : function(){ //入口
        this.result=getSuccess(this.grade).split("");
        this.getMap(this.grade);
        this.draw();
        this.lastTime= Date.now();
        this.run();
   
    },
    getMap : function(_mapIndex){
        this.map = getMap(_mapIndex);
    },
    draw : function(){ //绘制主对象
        this.clearCanvas();
        this.drawMap();
        this.drawGirl();
        this.showMoveInfo();
    },

    // 游戏主循环
    run : function(){ //运行帧
          var now = Date.now();
          var dt = (now - this.lastTime) / 1000.0;
          this.update(dt);//更新
          this.draw();
         this.lastTime = now;
         var that = this;
        
         this.timer =  setTimeout(function(){
           that.run();
         },1000)    
    },

    // 更新游戏对象
    update: function(dt) {
     this.UseTime += dt;
     this.readText(dt);
    },

    readText:function(dt){
      var sc=this.getSetp();
      if(sc=="d"){
         this.girlPos[0]+=1;
         this.girlPos[1]+=0;
         this.girlDirec ="down";

         this.MoveTimes++;
      }
     if(sc=="u"){
         this.girlPos[0]+=-1;
         this.girlPos[1]+=0;
         this.girlDirec ="up";
         this.MoveTimes++;
      }
      if(sc=="l"){
         this.girlPos[0]+=0;
         this.girlPos[1]+=-1;
         this.girlDirec ="left";
         this.MoveTimes++;
      }
     if(sc=="r"){
         this.girlPos[0]+=0;
         this.girlPos[1]+=+1;
         this.girlDirec ="right";
         this.MoveTimes++;
      }

      if(sc=="D"){
         this.girlPos[0]+=1;
         this.girlPos[1]+=0;
         this.girlDirec ="down";
         this.MoveTimes++;
       if(this.map[this.girlPos[0]][this.girlPos[1]]==6)//人的位置是带花的花盆
            this.map[this.girlPos[0]][this.girlPos[1]] = 4;//留下花
        else
            this.map[this.girlPos[0]][this.girlPos[1]] = 3;

        if( this.map[this.girlPos[0]+1][this.girlPos[1]] ==4)
          this.map[this.girlPos[0]+1][this.girlPos[1]] = 6;
        else
            this.map[this.girlPos[0]+1][this.girlPos[1]] = 5;

      }

       if(sc=="U"){
         this.girlPos[0]+=-1;
         this.girlPos[1]+=0;
         this.girlDirec ="up";
         this.MoveTimes++;
        if(this.map[this.girlPos[0]][this.girlPos[1]]==6)//人的位置是带花的花盆
            this.map[this.girlPos[0]][this.girlPos[1]] = 4;//留下花
        else
            this.map[this.girlPos[0]][this.girlPos[1]] = 3;
        if( this.map[this.girlPos[0]-1][this.girlPos[1]] ==4)
            this.map[this.girlPos[0]-1][this.girlPos[1]] = 6;
         else
            this.map[this.girlPos[0]-1][this.girlPos[1]] = 5;
      }
        if(sc=="R"){
         this.girlPos[0]+=0;
         this.girlPos[1]+=1;
         this.girlDirec ="right";
         this.MoveTimes++;
        if(this.map[this.girlPos[0]][this.girlPos[1]]==6)//人的位置是带花的花盆
              this.map[this.girlPos[0]][this.girlPos[1]] = 4;//留下花
        else
            this.map[this.girlPos[0]][this.girlPos[1]] = 3;


         if( this.map[this.girlPos[0]][this.girlPos[1]+1] ==4)
            this.map[this.girlPos[0]][this.girlPos[1]+1] = 6;
         else
            this.map[this.girlPos[0]][this.girlPos[1]+1] = 5;

      }
      if(sc=="L"){
         this.girlPos[0]+=0;
         this.girlPos[1]+=-1;
         this.girlDirec ="left";
         this.MoveTimes++;
         if(this.map[this.girlPos[0]][this.girlPos[1]]==6)//人的位置是带花的花盆
            this.map[this.girlPos[0]][this.girlPos[1]] = 4;//留下花
        else
            this.map[this.girlPos[0]][this.girlPos[1]] = 3;
        if( this.map[this.girlPos[0]][this.girlPos[1]-1] ==4)
            this.map[this.girlPos[0]][this.girlPos[1]-1] = 6;
         else
            this.map[this.girlPos[0]][this.girlPos[1]-1] = 5;

      }

   },
   getSetp:function(){
      this.setp++;
     if(this.setp==this.result.length) {
         return 0;
     }
     return this.result[this.setp];
   },
   drawMap : function(){
        var mapBg = context.createPattern(this.imgList.map_bg,"repeat");
        context.save();
        context.fillStyle = mapBg;
        context.fillRect(0,0,667,519);
        context.restore();
        for(var i=0;i<this.map.length;i++){
          for(var j=0;j<this.map[i].length;j++){
             if(this.map[i][j]!=1){
                var x = (j+1)*1+j*36;
                var y = (i+1)*1+i*36;
                if(this.map[i][j]==9){//人物位置,在人的位置要绘底图
                     this.map[i][j] = 3;
                     if(this.girlPos.length==0){ //初始化时,取一次人物的初始坐标
                          this.girlPos = [i,j];
                     }
                }
                var mapFlag = this.map[i][j];
                context.drawImage(this.imgList["map_"+mapFlag],x,y);
            }
         }
      }
    },
    drawGirl :function(){ //女孩,direc方向
        this.girlFrame = this.girlFrame==0?1:0;
        var i = this.girlPos[0];
        var j = this.girlPos[1];
        var x = (j+1)*1+j*36+3;
        var y = (i+1)*1+i*36-4;
        context.drawImage(this.imgList["npc_"+this.girlDirec+"_"+this.girlFrame],x,y);
    },
   
    showMoveInfo:function()
    {  
	this.msg.innerHTML="第"+(this.grade)+"关 移动次数:"+this.MoveTimes+" 用时:"+Math.floor(this.UseTime);
   },
   stop : function(){ //停止
        clearInterval(this.timer);
    },
    clearCanvas : function(){ //清空画布
        canvas.width=0;
        canvas.width=667;
    },
   
    imgOnload : function(img){
        FlGame.loadImgLen++;
        FlGame.imgList[img.picname] = img;
        if(FlGame.loadImgLen==imglen){
            FlGame.init();//所有图片加载后启动动画
        }
    }
};
//加载所属图片
(function(){
    var imgList = { //加载的清单
        map_bg:"images/map_bg.png",
        map_2:"images/map_2.jpg",
        map_3:"images/map_3.jpg",
        map_4:"images/map_4.jpg",
        map_5:"images/map_5.jpg",
        map_6:"images/map_6.jpg",
        npc_down_0:"images/npc_down_0.png",
        npc_down_1:"images/npc_down_1.png",
        npc_up_0:"images/npc_up_0.png",
        npc_up_1:"images/npc_up_1.png",
        npc_left_0:"images/npc_left_0.png",
        npc_left_1:"images/npc_left_1.png",
        npc_right_0:"images/npc_right_0.png",
        npc_right_1:"images/npc_right_1.png"
    };
    for(name in imgList){
        var img = new Image();
        img.src = imgList[name];
        img.picname = name;
        img.onload =function(){ FlGame.imgOnload(this);}
        img.onerror = function(e){
            alert("资源加载时发生错误!"+this.src);
        }
    }
})();


全部代码请下载。
热情奉献:HTML5 Canvas绘图与动画学习59例源码
http://www.108js.com/example.html
  • 大小: 101.9 KB
1
0
分享到:
评论
1 楼 肖泽文 2014-04-28  
太好了,谢谢你。。有中文注释!

相关推荐

    H5版本的推箱子小游戏源码

    随着HTML5技术的发展,H5版本的推箱子小游戏应运而生,使得这款游戏可以在网页上直接游玩,无需安装任何软件或插件。本文将深入探讨H5版本推箱子小游戏的源码结构、实现原理以及相关的技术知识点。 首先,源码中的`...

    经典网页版HTML5推箱子小游戏代码

    在这个"经典网页版HTML5推箱子小游戏"中,开发者利用HTML5的Canvas元素创建了一个互动游戏。Canvas是一个基于矢量图形的画布,允许开发者通过JavaScript来绘制动态图像。 Canvas API提供了丰富的绘图功能,包括画线...

    HTML5_box 推箱子游戏.zip

    在这个“HTML5_box 推箱子游戏.zip”压缩包中,包含了一个使用HTML5技术开发的推箱子小游戏。推箱子游戏源于经典的逻辑益智游戏,玩家需要在一个有障碍物的网格环境中,通过推动箱子到达指定位置,同时要确保自己...

    HTML5 推箱子小游戏源码.zip

    "HTML5 推箱子小游戏源码.zip" 是一个包含推箱子游戏完整源代码的压缩包,适用于学习HTML5游戏开发或者想要自定义一款推箱子游戏的开发者。 推箱子游戏是一款经典的逻辑益智游戏,玩家需要通过移动箱子到达指定位置...

    推箱子游戏素材 箱子图 背景图 人物图

    推箱子游戏,作为一种经典的逻辑益智游戏,深受玩家喜爱,其设计原理和图像素材对于游戏开发者来说至关重要。在这个压缩包中,包含了制作推箱子游戏所需的各类图像资源,包括箱子图、背景图和人物图,这些都是构成...

    html 推箱子.rar

    在这个“html 推箱子.rar”压缩包中,可能包含的是用HTML编写的推箱子游戏的源代码。 首先,我们来探讨HTML在构建推箱子游戏中的应用。HTML通过不同的标签定义了网页的基本元素,如`&lt;div&gt;`用于创建容器,`&lt;img&gt;`...

    HTML5实现的推箱子小游戏源代码

    在这个"HTML5实现的推箱子小游戏源代码"中,我们可以深入理解HTML5如何与JavaScript结合,创建一个具有挑战性的益智游戏。 首先,我们来看标题中的关键词"推箱子"。推箱子是一款经典的逻辑游戏,玩家需要操作主角...

    c# 推箱子 游戏 源码

    推箱子游戏是一款经典的逻辑益智游戏,源自日本的“ Sokoban ”,玩家需要操作一个角色在二维网格中推动箱子到指定位置。本项目是使用C#编程语言实现的推箱子游戏,对于初学者来说,这是一个很好的学习实例,能够...

    FPGA实现推箱子游戏.7z

    在这个项目中,FPGA被用来创建一个硬件级别的游戏引擎,执行推箱子游戏的逻辑运算,这可能包括游戏规则的检查、玩家动作的处理以及游戏状态的更新。 推箱子游戏,又称“ Sokoban”,是一个二维平面的益智游戏,玩家...

    html5结合javaScript开发推箱子游戏

    《HTML5结合JavaScript开发推箱子游戏》 在现代网页游戏中,HTML5与JavaScript的结合已经成为了主流技术栈,它们能够创造出丰富的交互体验和引人入胜的视觉效果。本项目中,我们将深入探讨如何利用这两种技术开发一...

    HTML5版推箱子游戏源码.rar

    HTML5版推箱子游戏源码,这款游戏主要是基于HTML5中的Canvas来实现,界面做的同样很优秀,玩法和PC版的推箱子一样。属于过关游戏,可自动跳关,或重过关,游戏玩法:用键盘上的上、下、左、右键移动小人,把箱子全部...

    第11章 推箱子游戏.ppt

    推箱子小游戏的开发原理ppt, 推箱子游戏功能如下: ...让玩家通过按上下左右键控制工人 推箱子,当箱子们都推到了目的地后出现过关信息,并显示下一关。推错了玩家按空格键重新玩过这关。直到过完全部关卡。

    推箱子游戏代码.zip

    5. **关卡设计**:推箱子游戏通常包含多个关卡,每个关卡都有不同的地图布局。关卡设计可能通过读取外部文件来实现,每个文件对应一个关卡的配置。 6. **状态管理**:保存和加载游戏进度的功能,方便玩家在不同时间...

    c#实现推箱子游戏 推箱子代码

    5. **回溯算法**:推箱子游戏可能存在多个解,甚至无解的情况。为了确保玩家可以完成关卡,可能需要实现一种回溯算法,如深度优先搜索(DFS),当发现无法达到目标时,撤销上一步操作,尝试其他路径。 6. **游戏...

    基于FPGA的推箱子游戏设计与实现.pdf

    本文详细介绍了基于FPGA技术实现推箱子游戏的设计与开发流程,通过该案例,阐述了FPGA在游戏设计中的具体应用,并展示了硬件设计与软件编程相结合的开发模式。以下为详细知识点: 1. FPGA与推箱子游戏设计 FPGA...

    推箱子游戏c语言实现

    推箱子游戏,也被称为“ Sokoban ”,是一款经典的逻辑益智游戏,源自20世纪80年代。在这个游戏中,玩家需要操作一个角色(通常是一个小人)在二维网格环境中移动,将箱子推到特定的目标位置。游戏的核心在于,箱子...

    推箱子游戏源码资源

    推箱子游戏源码资源是一个包含了全面开发信息的压缩包,主要针对的是iOS平台。这个资源提供了游戏"推箱子"的完整源代码,旨在帮助开发者学习和理解游戏开发过程,特别是对于移动平台的游戏开发。推箱子游戏,又称为 ...

    基于VS2010推箱子游戏

    推箱子游戏是一款经典的逻辑益智游戏,源自日本的“ Sokoban ”,在全球范围内广受欢迎。基于Visual Studio 2010(VS2010)开发推箱子游戏,可以帮助初学者了解游戏开发的基本流程和相关技术。在这个项目中,我们将...

    html5推箱子源码

    在这个"html5推箱子源码"中,我们可以看到开发者利用HTML5的特性创建了一个经典的逻辑游戏——推箱子。推箱子游戏是一个单人益智游戏,玩家需要操纵一个角色在网格布局的迷宫中推动箱子到指定位置,同时避免被困。 ...

    HTML5 Canvas推箱子小游戏

    总的来说,HTML5 Canvas推箱子小游戏展示了Canvas的强大功能以及游戏开发的基本原理,包括图形绘制、事件处理、物理规则模拟、数据结构应用和动画制作等,是学习和实践HTML5游戏开发的一个良好起点。

Global site tag (gtag.js) - Google Analytics