打灰机的游戏

睡不着想打灰机就做了个打灰机的小游戏,拿上来消遣消遣
就监听左右方向键和空格键,你们懂的~~

打灰机.zip

开发环境是Chrome13
下面是代码

  1. <html>
  2. <head>
  3. <style>
  4. body {
  5. margin:0px;
  6. padding:0px;
  7. font-family:微软雅黑;
  8. background-color:#aaa;
  9. text-align:center;
  10. }
  11. </style>
  12. <script type="text/javascript">
  13. /*http://2629783.blog.51cto.com/2619783/495283*/
  14. var canvas = null; //vanvas结点
  15. var ctx = null; //getContext对象
  16. var i = 0;
  17. var j = 0;
  18. var t = null; //定时器
  19. var keyLock = false; //键盘锁定,防止左右键同时按下
  20. var left = 287; //初始时绿色大方快距canvas左边距离
  21. var targets = new Array(); //存放打击目标的数组(横纵坐标)
  22. var bullets = new Array(); //存放子弹的数组(横纵坐标)
  23. function init(){//初始化
  24. canvas = document.getElementById('myCanvas');
  25. if (canvas && canvas.getContext) {
  26. ctx = canvas.getContext('2d');
  27. /*初始化targets数组*/
  28. for (i = 0; i < 25; i++) {
  29. targets.push(new Array(3+i*23,3));
  30. targets.push(new Array(3+i*23,26));
  31. targets.push(new Array(3+i*23,49));
  32. targets.push(new Array(3+i*23,72));
  33. }
  34. /*在canvas中画出目标*/
  35. ctx.fillStyle = '#ddd';
  36. for(i = 0; i < targets.length; i++){
  37. ctx.fillRect(targets[i][0], targets[i][1], 20, 20);
  38. }
  39. /*在canvas中画出两个绿色方块*/
  40. ctx.fillStyle = '#0f0';
  41. ctx.fillRect(left, 400, 15, 10);
  42. ctx.fillRect(left+7, 370, 1, 40);
  43. /*添加键盘监听事件*/
  44. document.addEventListener('keydown', keydown, false);
  45. document.addEventListener('keyup', keyup, false);
  46. /*开始执行draw操作*/
  47. setInterval(draw,50);
  48. } else {
  49. return false;
  50. }
  51. }
  52. function draw(){
  53. /*刷新子弹位置*/
  54. for(i = 0; i < bullets.length; i++){
  55. ctx.fillStyle = '#f00';
  56. ctx.clearRect(bullets[i][0], bullets[i][1], 1, 5);
  57. bullets[i][1] -= 5;
  58. ctx.fillRect(bullets[i][0], bullets[i][1], 1, 5);
  59. /*如果子弹超出边界,则删除,节省内存资源*/
  60. if (bullets[i][1] < 0) {
  61. ctx.clearRect(bullets[i][0], bullets[i][1], 1, 5);
  62. bullets.splice(i, 1);
  63. continue;
  64. }
  65. /*如果击中目标,则子弹和目标一起删除*/
  66. for (j = 0; j < targets.length; j++) {
  67. if ((bullets[i][0]+1) >= targets[j][0] && bullets[i][0] <= (targets[j][0]+20) && bullets[i][1] >= targets[j][1] && bullets[i][1] <= (targets[j][1]+20)) {
  68. ctx.clearRect(targets[j][0], targets[j][1], 20, 20);
  69. ctx.clearRect(bullets[i][0], bullets[i][1], 1, 5);
  70. targets.splice(j, 1);
  71. bullets.splice(i, 1);
  72. break;
  73. }
  74. }
  75. }
  76. }
  77. /*空格键发射子弹,不涉及键盘锁;左右方向键控制左右滑动,按下时加锁,弹起时解锁,防止左右键同时按下情况*/
  78. function keydown(event){
  79. if (32 == event.keyCode) {
  80. shoot();
  81. return false;
  82. }
  83. if (keyLock) {
  84. return false;
  85. }
  86. keyLock = true;
  87. if (37 == event.keyCode) {
  88. move('left');
  89. } else if(39 == event.keyCode) {
  90. move('right');
  91. }
  92. }
  93. /*左右方向键弹起事件:解锁,清除定时器*/
  94. function keyup(event){
  95. if (37 == event.keyCode || 39 == event.keyCode) {
  96. keyLock = false;
  97. clearInterval(t);
  98. }
  99. }
  100. /*射击,就是向bullets中压入新坐标*/
  101. function shoot() {
  102. bullets.push(new Array(left+7,360));
  103. }
  104. /*控制左移和右移*/
  105. function move(dir){
  106. t = setInterval(function(){
  107. if ('left' == dir && left > 0) {
  108. ctx.clearRect(left, 400, 15, 10);
  109. ctx.clearRect(left+7, 370, 1, 40);
  110. left -= 3;
  111. ctx.fillStyle = '#0f0';
  112. ctx.fillRect(left, 400, 15, 10);
  113. ctx.fillRect(left+7, 370, 1, 40);
  114. } else if ('right' == dir && (left+15) < 580) {
  115. ctx.clearRect(left, 400, 15, 10);
  116. ctx.clearRect(left+7, 370, 1, 40);
  117. left += 3;
  118. ctx.fillStyle = '#0f0';
  119. ctx.fillRect(left, 400, 15, 10);
  120. ctx.fillRect(left+7, 370, 1, 40);
  121. }
  122. }, 30);
  123. }
  124. </script>
  125. </head>
  126. <body οnlοad="init()">
  127. <div style="width:580px;margin:auto;padding:0px;background:#333;"><canvas id="myCanvas" width="580px" height="450px">
  128. your browser dose not support the canvas tag
  129. </canvas></div>
  130. </body>
  131. </html>

原文地址:http://bbs.lampbrother.net/read-htm-tid-100938.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值