`
王斌_code
  • 浏览: 33069 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

html5-卷轴游戏初试

 
阅读更多
自己试做一个卷轴游戏,其中有两个图片文件,未引入
<!DOCTYPE HTML>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title></title>
</head>
<body>
<div id="msg" style="position:absolute;top:300px;left:500px;"></div>
<canvas style="float:left;background:url(bg.jpg);" width="480" height="800" id="ctx"></canvas>
<script type="text/javascript">
var msg = document.getElementById("msg");
function showMsg(s){
  msg.innerHTML = s;
}

var WIDTH = 480;
var HEIGHT = 800;
var n = 0;
var FPS = 30;
var Game = function(){
  var main = {
    ku:[],
    init:function(){
      this.ctx = document.getElementById("ctx").getContext("2d");
      this.stage = this.ku["Stage"](this);
      this.map = this.ku["Map"](this);
      this.sprite = this.ku["Sprite"](this);
      this.controller = this.ku["Controller"](this);
      this.ctx.translate(0,800);//初始坐标变换
//加载图像
      this.bImage = new Image();
      this.bImage.src = "b.png";
    },
    start:function(){
      n++;
      this.step();
    },
    step:function(){
      this.stage.step();//舞台步进  
      var that = this;  
      this.timer = setTimeout(function(){that.step()},1000/FPS);  

    },
    pause:function(){
      clearTimeout(this.timer);
    },
    over:function(){
           delete step;
           this.stage.drawCurtain();
           this.ctx.fillText = ("你输了",300,400);
    },
    module:function(name,fun){
        this.ku[name] = fun;
    }

  };
  return main;
}();

Game.module("Stage",function(main){

    var stage = {
      drawCurtain:function(){
        var everyHeight= HEIGHT / main.map.everyRow;
        main.ctx.clearRect(0,-(main.sprite.oY) * everyHeight - HEIGHT - HEIGHT / 2,WIDTH,HEIGHT + HEIGHT);//此外要计算curtain的纵坐标
        //main.ctx.drawImage(main.bgImage,0,-(main.sprite.oY) * everyHeight - HEIGHT);
        
      },
      step:function(){
        this.drawCurtain();
        main.map.step();//地图步进
        main.sprite.step();//精灵步进
      }
    }

    return stage;
});

Game.module("Map",function(main){
    var everyRow = 10;//将一屏分成的行数,还要有将屏分成的列数,以数组元素的长度计
    var N = 0;//记录局部祯
    var map = {
      everyRow : everyRow,
      mapArr:[
        [0,1,2,0,0,0,0],
        [0,0,0,0,0,1,2],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [1,2,0,1,2,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,1,2,0,0,1,2],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,1,2],
         [0,1,2,0,0,0,0],
        [0,0,0,0,0,1,2],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [1,2,0,1,2,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,1,2,0,0,1,2],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,1,2],
          [0,1,2,0,0,0,0],
        [0,0,0,0,0,1,2],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [1,2,0,1,2,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,1,2,0,0,1,2],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,1,2],
           [0,1,2,0,0,0,0],
        [0,0,0,0,0,1,2],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [1,2,0,1,2,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,1,2,0,0,1,2],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,1,2]
],
      hasPull:0,
      step:function(){
       if(n == 1) this.draw(0);
        if(this.hasPull && N < this.needFrames){//若有下拉地图且未完成所要祯数
          main.ctx.translate(0,this.everyPullHeight); //下拉地图 注:此处下拉有误差,导致结果不精确,最后并没有完成所要高度,最后一祯给以修正
          var everyHeight= HEIGHT / main.map.everyRow;
          N ++;
        }
        
      },
      draw:function(start){
        var everyWidth = WIDTH / this.mapArr[0].length;
        var everyHeight= HEIGHT / everyRow;
        for(var i = start;i < this.mapArr.length;i++){
          for(var j = 0;j < this.mapArr[i].length;j++){
            tempX = j * everyWidth;
            tempY = (i - start + 1 ) * everyHeight;
            if(this.mapArr[i][j] == 1){
              main.ctx.fillRect( tempX,-tempY,everyWidth,everyHeight);
              //main.ctx.drawImage(main.bImage,tempX,-tempY);
            }
          }
        }
      },
      mapPullDown:function(needFrames,pullHeight){//下拉地图
        var everyWidth = WIDTH / this.mapArr[0].length;
        var everyHeight= HEIGHT / everyRow;
        this.everyPullHeight = pullHeight / needFrames; 
        this.hasPull = 1;
        this.needFrames = needFrames;
        N = 0;
      }
    }
    return map;
});

Game.module("Sprite",function(main){
    var R = 20;
    var G = 950;//重力加速度 px/s^2
    var V = -910;//起始速度  px/s
    var t = -V/G;// 一个跳动作 上/下 要多少时间(s)
    var needFrames = Math.floor(t * FPS);//完成跳动作 上/下 需要多少祯
    var N = 0;//记录帧数
    var sprite = {
      x:200,
      y:-70,
      vNow:V,//当前速度 上为-,下为+
      vLeft:0,//水方向速度
      oY:0,//当前记录原点是数组的哪个y下标
      needPullDownHeight:0,
      step:function(){
        this.jump();
      },
      draw:function(){
        main.ctx.beginPath();  
        main.ctx.arc(this.x,this.y,R,0,2*Math.PI,true);  
        main.ctx.fill();  
      },
      jump:function(){
        var flag = 0;
        var everyHeight= HEIGHT / main.map.everyRow;
        if(this.y > -this.oY * everyHeight){
          main.over();
          return;
        }
        if(this.vNow > 0 && this.check() ) {//如果速度为下,且检测到碰撞
          N = 0;
          this.vLeft = 0;
          this.vNow = V;
          main.map.mapPullDown(20,this.needPullDownHeight);
        }
        this.vNow += G * (1/FPS);
        var dY =  this.vNow * 1/FPS; 
        var dX = this.vLeft / FPS;
        this.y += dY;
        this.x += dX;
        N ++;
        this.draw();
      },
      check:function(){//检测碰撞
        var everyWidth = WIDTH / main.map.mapArr[0].length;
        var everyHeight= HEIGHT / main.map.everyRow;
        var tX = Math.floor(this.x / everyWidth);
        var tY = Math.floor((-this.y - R) / everyHeight);
        if(main.map.mapArr[tY][tX] == 1) {//若发生碰撞
          if(((-this.y - R) /everyHeight - tY) < 0.8){//碰撞为上部
            this.needPullDownHeight = (tY - this.oY ) * everyHeight;
            this.oY = tY;//记原点为tY
            return 1;
          }
        }
      }
    }
    return sprite;
});

Game.module("Controller",function(main){  
    window.addEventListener('keydown',function(e){  
      if(e.keyCode == 39) {
       if(main.sprite.vLeft >= 250)  main.sprite.vLeft = 250; 
       else main.sprite.vLeft += 50;
      } 
      if(e.keyCode == 37) {
       if(main.sprite.vLeft <= -250)  main.sprite.vLeft = -250; 
       else main.sprite.vLeft -= 50;
      } 
      if(e.keyCode == 38) Game.pause();  
    },false);
        window.addEventListener('keyup',function(e){  
      if(e.keyCode == 39) {main.sprite.vLeft ; } 
      if(e.keyCode == 37) main.sprite.x -= 1;  
      if(e.keyCode == 38) Game.pause();  
    },false);
});
Game.init();
Game.start();
</script>	
</body>
</html>

分享到:
评论

相关推荐

    仿游戏地图--卷轴式实现

    标题“仿游戏地图--卷轴式实现”涉及的是游戏开发中的一个重要概念,即卷轴式地图设计。在2D游戏中,卷轴式地图是一种常见的场景移动方式,它允许玩家通过滚动屏幕来探索广阔的游戏世界。这种技术最早在8位和16位...

    类游戏地图--卷轴式实现

    卷轴式游戏地图是2D游戏开发中的一个重要组成部分,它为玩家提供了广阔的游戏场景,允许玩家通过滚动屏幕来探索世界。在"类游戏地图--卷轴式实现"这个项目中,包含了两个不同版本的工程源代码,分别适配于古老的...

    行业文档-设计装置-卷轴式教学书写纸.zip

    行业文档-设计装置-卷轴式教学书写纸.zip

    行业文档-设计装置-卷轴砂纸.zip

    卷轴砂纸是一种广泛应用于打磨和抛光工艺的工具,尤其在木工、金属加工、汽车修理等行业中不可或缺。此压缩包文件“行业文档-设计装置-卷轴砂纸.zip”包含了一份名为“卷轴砂纸.pdf”的文档,很可能是关于卷轴砂纸的...

    行业文档-设计装置-卷轴式书架.zip

    卷轴式书架是一种独特的设计装置,主要用于存储和展示书籍,尤其适用于空间有限或追求独特设计感的环境。这种设计灵感来源于古代的卷轴,将传统书架的形式与现代技术相结合,创造出一种既实用又富有艺术性的存储解决...

    行业文档-设计装置-卷轴型英语教学课卷装置.zip

    5. **空间利用**:卷轴型设计节省了教室空间,相比于传统投影设备或白板,更加便携和紧凑,适应各种教学环境。 6. **环保理念**:与传统纸质教材相比,这种装置可能采用可重复使用的材料,减少纸张浪费,符合可持续...

    PPT模板-卷轴

    模板

    html5-canvas-trav:简单的 HTML5 Canvas 2D 横向卷轴游戏

    在“html5-canvas-trav”这个项目中,我们看到的是一个基于 HTML5 Canvas 的2D横向卷轴游戏的实现。这个游戏利用了 JavaScript 的强大功能,特别是其在 Canvas 上绘制和动画处理的能力,为用户提供了流畅的游戏体验...

    行业文档-设计装置-卷轴式替换内层童装.zip

    卷轴式替换内层童装设计装置是一种创新的服装生产设备,主要应用于童装的内层材料更换,以适应不同季节、环境或个人需求。这种设计装置在提高生产效率的同时,也注重了产品的个性化和可持续性。 首先,我们要理解...

    行业文档-设计装置-卷轴书架.zip

    卷轴书架是一种创新的设计装置,它将传统的书架形态与卷轴的元素相结合,创造出独特的存储和展示书籍的方式。这种设计通常具有节省空间、易于操作和视觉吸引力强等特点,适用于各种室内环境,如图书馆、书房、办公室...

    javascript经典特效---弹簧卷轴.rar

    在这个“javascript经典特效---弹簧卷轴.rar”压缩包中,包含了一个使用JavaScript实现的弹簧卷轴特效。这个特效使得网页元素在滚动时呈现出如同弹簧般弹跳的效果,增加了一种生动有趣的用户体验。 弹簧卷轴特效的...

    行业文档-设计装置-卷轴式太阳能手电筒.zip

    卷轴式太阳能手电筒是一种创新的便携式照明设备,它将太阳能技术与独特的卷轴设计相结合,为户外活动、紧急情况或无电力供应的地方提供了可靠的光源。这份行业文档详细探讨了这种装置的设计原理、制造过程以及其在...

    网络游戏-具有卷轴组的游戏机.zip

    网络游戏,特别是那些包含卷轴组元素的游戏机设计,是当今数字娱乐产业中不可或缺的一部分。卷轴组的概念在游戏设计中通常指的是水平或垂直移动的图像条,这些图像条上包含了游戏的各种元素,如角色、敌人、道具等。...

    行业资料-电子功用-卷轴屏幕电脑的介绍分析.rar

    5. **操作系统适配**:为了适应这种可变尺寸的屏幕,操作系统需要进行相应的优化,以支持不同尺寸下的界面布局和触摸交互。 6. **电源管理**:考虑到可能的频繁开关,卷轴屏幕电脑的电源管理系统需要高效,确保电池...

    电子政务-卷轴式柔性红外线电热字画.zip

    "行业分类-电子政务-卷轴式柔性红外线电热字画.pdf"这份文档很可能详述了这种技术在电子政务领域的具体应用案例、技术原理、实施步骤以及可能带来的社会效益。例如,它可能会探讨如何通过电子政务平台推广这一创新...

    电信设备-卷轴式移动终端.zip

    5. **耐用性和可靠性**:由于涉及频繁的伸缩动作,卷轴式移动终端必须具备很高的耐用性和可靠性。材料选择、制造工艺以及耐久性测试都是保证设备长久使用的关键环节。 6. **人机交互**:随着屏幕面积的变化,人机...

    行业文档-设计装置-卷轴式可调距书立.zip

    卷轴式可调距书立是一种创新的设计装置,主要用于整理和支撑书籍,使其在阅读时保持稳定并方便调整间距,适应不同大小的书籍。这种设计不仅考虑了实用性和功能性,还融入了美观与便捷性,使得阅读体验更加舒适。本文...

    行业文档-设计装置-卷轴式易调型书架.zip

    卷轴式易调型书架是一种创新的设计装置,它结合了传统书架的功能与现代设计的灵活性,旨在提供更高效、便捷的图书存储和检索方式。这种书架的设计理念是解决空间利用、书籍整理和调整方便等问题,尤其适用于图书馆、...

    Archer Hero HTML5 Game -弓箭手英雄 HTML5 Construct 横版射击2d游戏JS

    Archer Hero HTML5 Game -弓箭手英雄 HTML5 Construct横版射击2d游戏JS HTML5平台冒险/动作游戏,弓箭手必须穿越怪物山谷,在那里他遇到许多挑战。收集每个阶段的所有星星。 《弓箭手英雄》是一款超级有趣且具有挑战...

    [GDC 2015] Scroll Back - 2D 卷轴游戏的摄影机理论与实务

    [GDC 2015] Scroll Back - 2D 卷轴游戏的摄影机理论与实务 在线版本:http://blog.csdn.net/akof1314/article/details/46882501

Global site tag (gtag.js) - Google Analytics