• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > 小强的HTML5移动开发之路(7)——坦克大战游戏1

小强的HTML5移动开发之路(7)——坦克大战游戏1

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含HTML5,移动开发,坦克大战游戏等相关知识,匿名希望在学习及工作中可以帮助到您
上一篇中我们介绍了关于Canvas的基础知识,用Canvas绘制各种图形和图片,在上一篇的基础上我们来做一个基于HTML5的坦克大战游戏,下面我们开始吧

一、用Canvas画出我们的坦克

我们设计的坦克结构如下图所示,如果有的朋友有更好的设计,希望分享和交流一下。

703.png

如上图所示,我们的坦克基本上是由三个矩形和一个圆形一个线段组成,每个部件的尺寸进行了标记,单位为px,下面我们用上一篇中讲到的知识来画出我们的坦克,注意:我们在画坦克的时候应该选择一个参考点,这里我们选择的是坦克的左上角,如图所示。

<!DOCTYPE html>  
<html>  
<head>  
<meta charset="utf-8"/>  
</head>  
<body>  
<h1>html5-坦克大战</h1>  
<!--坦克大战的战场-->  
<canvas id="tankMap" width="400px" height="300px" style="background-color:black"></canvas>  
<script type="text/javascript">  
    //得到画布  
    var canvas1 = document.getElementById("tankMap");  
      
    //定义一个位置变量  
    var heroX = 80;  
    var heroY = 80;  
      
    //得到绘图上下文  
    var cxt = canvas1.getContext("2d");  
    //设置颜色  
    cxt.fillStyle="#BA9658";  
    //左边的矩形  
    cxt.fillRect(heroX,heroY,5,30);  
    //右边的矩形  
    cxt.fillRect(heroX+17,heroY,5,30);  
    //画中间的矩形  
    cxt.fillRect(heroX+6,heroY+5,10,20);  
    //画出坦克的盖子  
    cxt.fillStyle="#FEF26E";  
    cxt.arc(heroX+11,heroY+15,5,0,360,true);  
    cxt.fill();  
    //画出炮筒  
    cxt.strokeStyle="#FEF26E";  
    cxt.lineWidth=1.5;  
    cxt.beginPath();  
    cxt.moveTo(heroX+11,heroY+15);  
    cxt.lineTo(heroX+11,heroY);  
    cxt.closePath();  
    cxt.stroke();  
      
      
</script>  
</body>  
</html>

704.png

二、怎么让坦克动起来?

在研究怎么让坦克动起来之前,我们先来研究一下怎么让一个小球通过键盘操作使其动起来。

首先我们给<body>标签添加一个监听函数

<body onkeydown="test()">

监听函数

//现在按键盘上ASDW移动小球  
//说明:当我们按下一个键,实际上触发了一个onkeydown事件  
function test(){  
    var code = event.keyCode;  //键盘上字幕的ASCII码  
    switch(code){  
        case 87:  
            ballY--;  
            break;  
        case 68:  
            ballX++;  
            break;  
        case 83:  
            ballY++;  
            break;  
        case 65:  
            ballX--;  
            break;  
    }  
    //重新绘制  
    drawBall();  
}

我们可以在外部定义两个全局的变量分别表示x轴和y轴的坐标,然后通过改变ballX和ballY的值来改变小球的位置,我们用键盘的WDSA键来控制,这样出来的效果非常奇怪,如下图:

705.png

我们在绘制的时候没有将以前位置的小球擦除掉,在每次重新绘制前应该先擦除一下,下面将全部代码贴出来:

<!DOCTYPE html>  
<html>  
<head>  
<meta charset="utf-8"/>  
</head>  
<!--当按键后,去调用test-->  
<body onkeydown="test()">  
<h1>小球上下左右移动</h1>  
<canvas id="test" width="400px" height="300px" style="background-color:black">  
</canvas>  
<script type="text/javascript">  
  
    //得到画布  
    var canvas1 = document.getElementById("test");  
      
    //定义一个位置变量  
    var ballX = 80;  
    var ballY = 80;  
      
    //得到绘图上下文  
    var cxt = canvas1.getContext("2d");  
    drawBall();  
    function drawBall(){  
        //画出一个红色的圆球  
        cxt.beginPath();  //要注意闭合路径  
        cxt.fillStyle="#FF0000";  
        cxt.arc(ballX,ballY,10,0,360,true);  
        cxt.closePath();  
        cxt.fill();  
    }  
      
    //现在按键盘上ASDW移动小球  
    //说明:当我们按下一个键,实际上触发了一个onkeydown事件  
    function test(){  
        var code = event.keyCode;  //键盘上字幕的ASCII码  
        switch(code){  
            case 87:  
                ballY--;  
                break;  
            case 68:  
                ballX++;  
                break;  
            case 83:  
                ballY++;  
                break;  
            case 65:  
                ballX--;  
                break;  
        }  
        //把画布清理  
        cxt.clearRect(0,0,400,300);  
        //重新绘制  
        drawBall();  
    }  
</script>  
</body>  
</html>

三、让我们的坦克动起来


我们的坦克如果只是朝一个方向移动的话就非常容易了,只要将上面代码中的画小球改成画坦克就OK了,在让坦克移动之前我们首先应该考虑的是怎么让坦克绕着自己的中心朝各个方向转动的问题。好的,再将上面的图贴出来分析一下。

706.png

详细的计算过程我就不啰嗦了,想必大家的数学都很好,按照上图的比例计算好各个组件的坐标和位置,旋转后坦克画法如下:

//设置颜色  
cxt.fillStyle="#BA9658";  
//上边的矩形  
cxt.fillRect(tank.x-4,tank.y+4,30,5);  
//下边的矩形  
cxt.fillRect(tank.x-4,tank.y+17+4,30,5);  
//画中间的矩形  
cxt.fillRect(tank.x+5-4,tank.y+6+4,20,10);  
//画出坦克的盖子  
cxt.fillStyle="#FEF26E";  
cxt.arc(tank.x+15-4,tank.y+11+4,5,0,360,true);  
cxt.fill();  
//画出炮筒  
cxt.strokeStyle="#FEF26E";  
cxt.lineWidth=1.5;  
cxt.beginPath();  
cxt.moveTo(tank.x+15-4,tank.y+11+4);  
if(tank.direct==1){         //只是炮筒的方向不同  
    cxt.lineTo(tank.x+30-4,tank.y+11+4);  
}else{  
    cxt.lineTo(tank.x-4,tank.y+11+4);  
}  
cxt.closePath();  
cxt.stroke();

好了现在我们发现坦克朝向左边和右边仅仅只有炮筒的方向不同,同理朝向上边和下边也仅仅只有炮筒的方向不同,这时候我们可以将四个方向分为两种情况,再在各个小情况中做处理。同时用OO的思想将代码进行了封装,代码如下:

<!DOCTYPE html>  
<html>  
<head>  
<meta charset="utf-8"/>  
</head>  
<body onkeydown="getCommand();">  
<h1>html5-坦克大战</h1>  
<!--坦克大战的战场-->  
<canvas id="tankMap" width="400px" height="300px" style="background-color:black"></canvas>  
<script type="text/javascript">  
    //定义一个Hero类(后面还要改进)  
    //x表示坦克的横坐标  
    //y表示纵坐标  
    //direct表示方向  
    function Hero(x,y,direct){  
        this.x=x;  
        this.y=y;  
        this.speed=1;  
        this.direct=direct;  
        //上移  
        this.moveUp=function(){  
            this.y-=this.speed;  
            this.direct=0;  
        }  
        //右移  
        this.moveRight=function(){  
            this.x+=this.speed;  
            this.direct=1;  
        }  
        //下移  
        this.moveDown=function(){  
            this.y+=this.speed;  
            this.direct=2;  
        }  
        //左移  
        this.moveLeft=function(){  
            this.x-=this.speed;  
            this.direct=3;  
        }  
    }  
  
  
    //得到画布  
    var canvas1 = document.getElementById("tankMap");  
    //得到绘图上下文  
    var cxt = canvas1.getContext("2d");  
      
    //我的tank  
    //规定0向上、1向右、2向下、3向左  
    var hero = new Hero(40,40,0);  
    drawTank(hero);  
    //绘制坦克  
    function drawTank(tank){  
        //考虑方
  


 

您可能想查找下面的文章:

  • HTML5知识点总结
  • HTML5的本地存储
  • HTML5本地存储之IndexedDB
  • Html5实现文件异步上传功能
  • Html5新标签datalist实现输入框与后台数据库数据的动态匹配
  • 详解HTML5 window.postMessage与跨域
  • HTML5拖放API实现拖放排序的实例代码
  • 解决html5中video标签无法播放mp4问题的办法
  • HTML5新特性 多线程(Worker SharedWorker)
  • Html5新增标签有哪些

相关文章

  • 2018-12-03推荐10款常用的图片压缩上传用法,欢迎下载!
  • 2018-12-03Canvas跨域的解决方案介绍
  • 2018-12-03JS动画比CSS3动画性能谁更好?
  • 2018-12-03详解HTML5移动端音频与视频问题及解决方案
  • 2017-08-06推荐WEB开发者最佳HTML5和CSS3代码生成器
  • 2018-12-03基于HTML5 SVG可互动的3D标签云jQuery插件
  • 2017-08-06HTML5 语音搜索只需一句代码
  • 2018-12-03H5动画--canvas绘制圆环百分比进度的实例
  • 2018-12-03HTML5本地数据库基础操作详解_html5教程技巧
  • 2018-12-03用HTML5制作烟火效果的教程_html5教程技巧

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • 像“红杏”这样的HTML立体旋转效果是如何实现的?难度如何?
    • H5+C3做出优酷视频截图效果
    • Canvas学习系列一:初识canvas
    • HTML5 canvas基本绘图之文字渲染
    • html5 初试 indexedDB(推荐)
    • HTML4和HTML5之间的10个主要不同
    • H5的localStorage使用总结
    • 借助HTML5 Canvas API制作一个简单的猜字游戏_html5教程技巧
    • 总结Uploadify使用方法
    • Html5之title吸顶功能

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有