免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2267 | 回复: 1
打印 上一主题 下一主题

html5游戏--初试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-09 17:22 |只看该作者 |倒序浏览
html5游戏--初试












我觉得,html5很有前景,移动终端智能化、普及是一个大趋势,html5的应用有跨平台这一大的优势,传统的应用很依赖终端的系统,同样一个应用,html5也能实现,它就可以在所有的智能终端下使用,而且又有本地存储,离线使用等特性,这使得它成为未来的主流
        用html5开发游戏是一件很激动人心的事,好的,开始我的html5游戏之路吧
        先不看别人怎么写的,先去看一下html5给我们提供什么东西,然后说说我的想法吧
        经过阅读html5 Canvas API,发现,提供的东西不多,无非是一些数学图形画法,有点、线、矩形等,然后还有一个外加载图像的功能,不过有一个激动人心的东西,就是它也提供像素级处理,这个强大,因为直接对像素处理可以进行复杂的图像变换,比强像ps里面的滤镜效果,除此之外,还有一些样式控制,状态控制。这个Canvas让我想到了和Ps的里的对比,只是让我们直观了解下Canvas
        首先,Canvas里的beginPath等就是Ps里的路径,stroke就像是描边,fill就是油漆桶填充,Gradient就是渐变,bezierCurveTo就是钢笔绘贝塞尔曲线
        做动画,首先想到的是,像html的div移动一样,不断改变div的css值就行了,后来发现,Canvas是绘图的,不是做动画的,它没有图层的概念,你将某个图片放到画布上,它就是整一个图片了,你不可能控制这个图片的移动了。后来想,那就不移动它,再重新画一张就行了

        以Flash的模式来用Canvas做游戏动画
        舞台、祯、元件这些概念用在Canvas上
        想一想Flash的逐祯动画的制作过程
        一个小丑的移动过程:每一祯都是一幅图像,每一幅图像中,小丑向前移动一步,Flash控制每隔很短的时间显示一祯,这样就形成了一个动画
        对就Canvas里就可以这么做,一个舞台对象,舞台上有各种小丑(元件),一祯一祯的显示,这一祯显示完了就把舞台清空,然后重新绘制下一祯
        Flash里边涉及两个问题:
        一条主控时间线,控制舞台的显示,然后对于每个元件,可能还会一个自己的时间线,就是当元件是动画的时候
        那么在Canvas里,就可以对应着这样的设计模式
        构造一个舞台对像Stage,将各个元件放在舞台上,不要时间主线,Stage有一个擦空原来舞台,根据Stage的各元件状态重绘舞台的方法,每一个元件要做动画的时候就生成一个自己的时间线,比如小丑要移动的时候,可以在任何时候要求舞台Stage重绘舞台,这样,可能会在某个时刻,没有一个元件要求重绘舞台,那么Canvas的祯频就是0,这样的帧频是动态变化的

Javascript代码
  1. 1.var Stage = {};   
  2. 2.Stage.paint(){   
  3. 3.  //根据舞台上每个小丑当前时刻的状态,重绘舞台   
  4. 4.}   
  5. 5.function Sprite(){   
  6. 6.  this.go = function(){   
  7. 7.    setInterval(goAhead,100);   
  8. 8.    function goAhead(){   
  9. 9.      //一些状态改变代码.......   
  10. 10.      Stage.paint();//要求舞台重绘   
  11. 11.    }   
  12. 12.  }   
  13. 13.}   
  14. 14.function Sprite2(){   
  15. 15.  This.go = function(){   
  16. 16.    setInterval(goAhead,100);   
  17. 17.    function goAhead(){   
  18. 18.      //一些状态改变代码.......   
  19. 19.      Stage.paint();//要求舞台重绘   
  20. 20.    }   
  21. 21.  }   
  22. 22.}  
  23. var Stage = {};
  24. Stage.paint(){
  25.   //根据舞台上每个小丑当前时刻的状态,重绘舞台
  26. }
  27. function Sprite(){
  28.   this.go = function(){
  29.     setInterval(goAhead,100);
  30.     function goAhead(){
  31.       //一些状态改变代码.......
  32.       Stage.paint();//要求舞台重绘
  33.     }
  34.   }
  35. }
  36. function Sprite2(){
  37.   This.go = function(){
  38.     setInterval(goAhead,100);
  39.     function goAhead(){
  40.       //一些状态改变代码.......
  41.       Stage.paint();//要求舞台重绘
  42.     }
  43.   }
  44. }
复制代码
另外一种设计模式是,只有一个时间线,每隔固定时间显示一祯,就是每隔一定时间舞台Stage步进一祯,步进的时候舞台上所有元件同时步进一次,任何元件要产生动画的时候,加入到这个时间主线中,跟着Stage步进而步进,这样的帧频是固定的,即使在不产生动画的情况下,Stage也是在不停地重绘着
Javascript代码
  1. 1.var Stage = {};   
  2. 2.Stage.players = {   
  3. 3.  //...将小丑添加至舞台   
  4. 4.};   
  5. 5.Stage.step(){   
  6. 6.  for(i in Stage.players){   
  7. 7.    Stage.players.step();//舞台上每个小丑步进   
  8. 8.  }   
  9. 9.  setTimeout(this.step,100);//舞台每隔一定时间步进   
  10. 10.}   
  11. 11.function Sprite(){   
  12. 12.  this.step = function(){   
  13. 13.    //......步进   
  14. 14.  }   
  15. 15.}  
  16. var Stage = {};
  17. Stage.players = {
  18.   //...将小丑添加至舞台
  19. };
  20. Stage.step(){
  21.   for(i in Stage.players){
  22.     Stage.players.step();//舞台上每个小丑步进
  23.   }
  24.   setTimeout(this.step,100);//舞台每隔一定时间步进
  25. }
  26. function Sprite(){
  27.   this.step = function(){
  28.     //......步进
  29.   }
  30. }
  31.       写了一个简单的控制小丑移动的程序
  32. ]
复制代码
Javascript代码
  1. 1.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">   
  2. 2.<html lang="en">   
  3. 3.<head>   
  4. 4.    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">   
  5. 5.    <title></title>   
  6. 6.</head>   
  7. 7.<body>   
  8. 8.<canvas id='canvas' width="800" height="800"></canvas>   
  9. 9.<script type='text/javascript' src='jquery.js'></script>   
  10. 10.<script type='text/javascript'>   
  11. 11.var kit = {};   
  12. 12.var FPS = 30;   
  13. 13.kit.imgArr = ["img/player.gif","img/bg.png"];   
  14. 14.kit.load = function(){   
  15. 15.  this.img = [];   
  16. 16.  for(i in this.imgArr){   
  17. 17.  this.img[i] = new Image();   
  18. 18.  this.img[i].src = this.imgArr[i];   
  19. 19.  }   
  20. 20.}   
  21. 21.kit.load();   
  22. 22.var ctx = document.getElementById("canvas").getContext("2d");   
  23. 23.var controller = {};//控制对象   
  24. 24.controller.stage = {};//舞台对象   
  25. 25.controller.stage.players = {//舞台上的小丑们   
  26. 26.          scen:new Scen(),   
  27. 27.  player1:new Sprite()//一个小精灵   
  28. 28.}   
  29. 29.controller.stage.paint = function(){//绘制桢   
  30. 30.  ctx.fillStyle = "#fff";//清除前桢   
  31. 31.  ctx.fillRect(0,0,800,800);   
  32. 32.  for(every in this.players){   
  33. 33.    this.players[every].paint();//小丑们添加动作到舞台   
  34. 34.  }   
  35. 35.}   
  36. 36.controller.stage.endPaint = function(){   
  37. 37.  ctx.fillStyle = "#fff";//清除前桢   
  38. 38.  ctx.fillRect(0,0,800,800);   
  39. 39.  for(every in this.players){   
  40. 40.    this.players[every].endPaint();//小丑们添加动作到舞台   
  41. 41.  }   
  42. 42.}   
  43. 43.controller.walk = function(){//让精灵前进吧   
  44. 44.  var that = this;   
  45. 45.  clearInterval(kit.playerTime);   
  46. 46.  function go(){   
  47. 47.    that.stage.players.player1.walk();//精灵自己走一步吧   
  48. 48.    that.stage.paint();//绘制此桢   
  49. 49.  }   
  50. 50.  kit.playerTime = setInterval(go,1000/FPS);   
  51. 51.}   
  52. 52.  
  53. 53.controller.back = function(){//让精灵后退吧   
  54. 54.  var that = this;   
  55. 55.  clearInterval(kit.playerTime);   
  56. 56.  function back(){   
  57. 57.    that.stage.players.player1.back();//精灵自己走一步吧   
  58. 58.    that.stage.paint();//绘制此桢   
  59. 59.  }   
  60. 60.  kit.playerTime = setInterval(back,1000/FPS);   
  61. 61.}   
  62. 62.controller.jump = function(){   
  63. 63.  var that = this;   
  64. 64.  clearInterval(kit.playerTime);   
  65. 65.  var count = 0;   
  66. 66.  function jump(){   
  67. 67.    count++;     
  68. 68.    that.stage.players.player1.jump();   
  69. 69.      that.stage.paint();   
  70. 70.      if(count < 50){   
  71. 71.        setTimeout(jump,1000/FPS);   
  72. 72.      }   
  73. 73.  
  74. 74.  }   
  75. 75.  jump();   
  76. 76.}   
  77. 77.function Sprite(){//一个精灵类   
  78. 78.  this.stageCount = 0;//记录精灵向舞台添加的次数   
  79. 79.  this.nowDot = [30,202];//精灵现在的坐标   
  80. 80.  this.towards = 0;   
  81. 81.  this.frame = [];   
  82. 82.  this.frame[0] = [   
  83. 83.    [163,0,28,60,0,0,28,60]   
  84. 84.  ];   
  85. 85.  this.frame[1] = [   
  86. 86.    [140,0,22,60,0,0,22,60],   
  87. 87.    [112,0,28,60,0,0,28,60],   
  88. 88.    [81,0,31,60,0,0,31,60]   
  89. 89.  ];   
  90. 90.  this.frame[2] = [   
  91. 91.    [0,0,22,60,0,0,22,60],   
  92. 92.    [22,0,28,60,0,0,28,60],   
  93. 93.    [50,0,31,60,0,0,31,60]   
  94. 94.  ];   
  95. 95.  this.frame[3] = [   
  96. 96.  ];   
  97. 97.  var i = 0;   
  98. 98.  this.walk = function(){//精灵向前走   
  99. 99.    this.nowDot[0]++;   
  100. 100.    this.towards = 1;   
  101. 101.    this.stageCount++;   
  102. 102.  }   
  103. 103.  this.back = function(){//精灵向后走   
  104. 104.    this.nowDot[0]--;   
  105. 105.    this.towards = 2;   
  106. 106.    this.stageCount++;   
  107. 107.  }   
  108. 108.  this.jump = function(){   
  109. 109.    this.nowDot[1]--;   
  110. 110.    this.stageCount++;   
  111. 111.  }   
  112. 112.  this.paint = function(){//精灵添加动作到舞台   
  113. 113.    var i = this.stageCount/4  % this.frame[1].length;   
  114. 114.    i = parseInt(i);   
  115. 115.    var t = this.frame[this.towards];   
  116. 116.     ctx.drawImage(kit.img[0],t[i][0],t[i][1],t[i][2],t[i][3],this.nowDot[0],this.nowDot[1],t[i][6]*2,t[i][7]*2);   
  117. 117.  }   
  118. 118.  this.endPaint = function(){   
  119. 119.    i = 0;   
  120. 120.    var t = this.frame[0];   
  121. 121.    ctx.drawImage(kit.img[0],t[i][0],t[i][1],t[i][2],t[i][3],this.nowDot[0],this.nowDot[1],t[i][6]*2,t[i][7]*2);   
  122. 122.  }   
  123. 123.}   
  124. 124.function Scen(){   
  125. 125.  this.paint = function (){   
  126. 126.    ctx.drawImage(kit.img[1],0,0);   
  127. 127.  }   
  128. 128.  this.endPaint = this.paint;   
  129. 129.}   
  130. 130.var state = 0;   
  131. 131.$(document).keydown(function(e){   
  132. 132.    if(state > 0) return;   
  133. 133.    if(e.keyCode == 37) {   
  134. 134.      controller.back();   
  135. 135.      state ++;   
  136. 136.    }   
  137. 137.    if(e.keyCode == 39){   
  138. 138.      controller.walk();   
  139. 139.      state++;   
  140. 140.    }   
  141. 141.    if(e.keyCode == 38){   
  142. 142.      controller.jump();   
  143. 143.      state++;   
  144. 144.    }   
  145. 145.});   
  146. 146.$(document).keyup(function(e){   
  147. 147.    state = 0;   
  148. 148.    clearInterval(kit.playerTime);   
  149. 149.    controller.stage.endPaint();   
  150. 150.});   
  151. 151.</script>   
  152. 152.</body>   
  153. 153.</html>  
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-24 20:22 |只看该作者
谢谢分享  希望于楼主多多交流
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP