H5 canvas建造敌人坦克
//封装一个获取绘图环境的函数
function getCxt(){
var myCanvas = document.getElementById('floor'),
myContext = myCanvas.getContext('2d');
return myContext;
}
//为了防止重复地获取节点影响性能,我们将获取到的绘图环境(也就是画笔对象)存起来
var oCxt = getCxt();
//封装一个画坦克的函数,传两个参数x,y,分别代表左上角的横纵坐标
//再增加一个参数dir来表示方向 上下左右分别传"u" "d" "l" "r"
//再增加两个参数color1与color2,用来表示坦克身上的两种颜色,方便造出不同的坦克
function drawTank(x,y,dir,color1,color2){
switch(dir){
case "u":
case "d":
oCxt.fillStyle = color1;
oCxt.fillRect(x,y,20,65);
oCxt.fillRect(x+70,y,20,65);
oCxt.fillRect(x+23,y+10,44,50);
oCxt.fillStyle = color2;
oCxt.beginPath();
oCxt.arc(x+45,y+35,16,0,2*Math.PI,false);
oCxt.closePath();
oCxt.fill();
oCxt.strokeStyle = color2;
oCxt.lineWidth = "8.0";
oCxt.moveTo(x+45,y+35);
if(dir == "u"){
oCxt.lineTo(x+45,y-25);
}else if(dir == "d"){
oCxt.lineTo(x+45,y+95);
}
oCxt.stroke();
break;
case "l":
case "r":
oCxt.fillStyle = color1;
oCxt.fillRect(x,y,65,20);
oCxt.fillRect(x,y+70,65,20);
oCxt.fillRect(x+10,y+23,50,44);
oCxt.fillStyle = color2;
oCxt.beginPath();
oCxt.arc(x+35,y+45,16,0,2*Math.PI,false);
oCxt.closePath();
oCxt.fill();
oCxt.strokeStyle = color2;
oCxt.lineWidth = "8.0";
oCxt.moveTo(x+35,y+45);
if(dir == "l"){
oCxt.lineTo(x-25,y+45);
}else if(dir == "r"){
oCxt.lineTo(x+95,y+45);
}
oCxt.stroke();
}
}
function drawTank(tankName){
switch(tankName.dir){
case "u":
case "d":
oCxt.fillStyle = tankName.color1;
oCxt.fillRect(tankName.x,tankName.y,20,65);
oCxt.fillRect(tankName.x+70,tankName.y,20,65);
oCxt.fillRect(tankName.x+23,tankName.y+10,44,50);
oCxt.fillStyle = tankName.color2;
oCxt.beginPath();
oCxt.arc(tankName.x+45,tankName.y+35,16,0,2*Math.PI,false);
oCxt.closePath();
oCxt.fill();
oCxt.strokeStyle = tankName.color2;
oCxt.lineWidth = "8.0";
oCxt.moveTo(tankName.x+45,tankName.y+35);
if(tankName.dir == "u"){
oCxt.lineTo(tankName.x+45,tankName.y-25);
}else if(tankName.dir == "d"){
oCxt.lineTo(tankName.x+45,tankName.y+95);
}
oCxt.stroke();
break;
case "l":
case "r":
oCxt.fillStyle = tankName.color1;
oCxt.fillRect(tankName.x,tankName.y,65,20);
oCxt.fillRect(tankName.x,tankName.y+70,65,20);
oCxt.fillRect(tankName.x+10,tankName.y+23,50,44);
oCxt.fillStyle = tankName.color2;
oCxt.beginPath();
oCxt.arc(tankName.x+35,tankName.y+45,16,0,2*Math.PI,false);
oCxt.closePath();
oCxt.fill();
oCxt.strokeStyle = tankName.color2;
oCxt.lineWidth = "8.0";
oCxt.moveTo(tankName.x+35,tankName.y+45);
if(tankName.dir == "l"){
oCxt.lineTo(tankName.x-25,tankName.y+45);
}else if(tankName.dir == "r"){
oCxt.lineTo(tankName.x+95,tankName.y+45);
}
oCxt.stroke();
}
}
//使用构造函数来创建对象
function Tank(x,y,dir,color1,color2){
this.x = x;
this.y = y;
this.dir = dir;
this.step = 3,
this.color1 = color1;
this.color2 = color2;
this.turnUp = function(){
if((this.y-25) >= 0){
this.y -= this.step;
this.dir = "u";
}
};
this.turnDown = function(){
if((this.y+90) <= 500){
this.y += this.step;
this.dir = "d";
}
};
this.turnLeft = function(){
if((this.x-25) >= 0){
this.x -= this.step;
this.dir = "l";
}
};
this.turnRight = function(){
if((this.x+90) <= 800){
this.x += this.step;
this.dir = "r";
}
};
}
//创建我的坦克时new出来并传参
var myTank = new Tank(350,400,"u","#542174","#FCB827");
//创建敌人的坦克,有多个所以做成数组,再将数组每一项new出来并传参即可
//这里以骑士队的主色建造坦克
var enemyTank = new Array();
for(var i=0; i<3; i++){
enemyTank[i] = new Tank(240*(i+0.45),60,"d","#EBB227","#780910");
}
//封装一个更新战场的函数
function updateFloor(){
oCxt.clearRect(0,0,800,500); //更新之前先清除画布
drawTank(myTank);
for(var i=0; i<enemyTank.length; i++){
drawTank(enemyTank[i]); //循环一下把每一个敌人造出来
}
}
//设置一个间歇调用的函数,每隔100ms更新一下战场
setInterval(function(){
updateFloor();
},100);
//响应玩家的操作指令
window.onkeydown = function(eve){
switch(eve.keyCode){
case 38:
case 87:
myTank.turnUp();
break;
case 40:
case 83:
myTank.turnDown();
break;
case 37:
case 65:
myTank.turnLeft();
break;
case 39:
case 68:
myTank.turnRight();
}
};
//封装一个获取绘图环境的函数
function getCxt(){
var myCanvas = document.getElementById('floor'),
myContext = myCanvas.getContext('2d');
return myContext;
}
//为了防止重复地获取节点影响性能,我们将获取到的绘图环境(也就是画笔对象)存起来
var oCxt = getCxt(); //封装一个画坦克的函数,传两个参数x,y,分别代表左上角的横纵坐标
//再增加一个参数dir来表示方向 上下左右分别传"u" "d" "l" "r"
//再增加两个参数color1与color2,用来表示坦克身上的两种颜色,方便造出不同的坦克
//对函数进一步封装,尽量让使用变得简单
function drawTank(tankName){
switch(tankName.dir){
case "u":
case "d":
oCxt.fillStyle = tankName.color1;
oCxt.fillRect(tankName.x,tankName.y,20,65);
oCxt.fillRect(tankName.x+70,tankName.y,20,65);
oCxt.fillRect(tankName.x+23,tankName.y+10,44,50);
oCxt.fillStyle = tankName.color2;
oCxt.beginPath();
oCxt.arc(tankName.x+45,tankName.y+35,16,0,2*Math.PI,false);
oCxt.closePath();
oCxt.fill();
oCxt.strokeStyle = tankName.color2;
oCxt.lineWidth = "8.0";
oCxt.moveTo(tankName.x+45,tankName.y+35);
if(tankName.dir == "u"){
oCxt.lineTo(tankName.x+45,tankName.y-25);
}else if(tankName.dir == "d"){
oCxt.lineTo(tankName.x+45,tankName.y+95);
}
oCxt.stroke();
break;
case "l":
case "r":
oCxt.fillStyle = tankName.color1;
oCxt.fillRect(tankName.x,tankName.y,65,20);
oCxt.fillRect(tankName.x,tankName.y+70,65,20);
oCxt.fillRect(tankName.x+10,tankName.y+23,50,44);
oCxt.fillStyle = tankName.color2;
oCxt.beginPath();
oCxt.arc(tankName.x+35,tankName.y+45,16,0,2*Math.PI,false);
oCxt.closePath();
oCxt.fill();
oCxt.strokeStyle = tankName.color2;
oCxt.lineWidth = "8.0";
oCxt.moveTo(tankName.x+35,tankName.y+45);
if(tankName.dir == "l"){
oCxt.lineTo(tankName.x-25,tankName.y+45);
}else if(tankName.dir == "r"){
oCxt.lineTo(tankName.x+95,tankName.y+45);
}
oCxt.stroke();
}
}
//使用构造函数来创建对象
function Tank(x,y,dir,color1,color2){
this.x = x;
this.y = y;
this.dir = dir;
this.step = 3,
this.color1 = color1;
this.color2 = color2;
this.turnUp = function(){
if((this.y-25) >= 0){
this.y -= this.step;
this.dir = "u";
}
};
this.turnDown = function(){
if((this.y+90) <= 500){
this.y += this.step;
this.dir = "d";
}
};
this.turnLeft = function(){
if((this.x-25) >= 0){
this.x -= this.step;
this.dir = "l";
}
};
this.turnRight = function(){
if((this.x+90) <= 800){
this.x += this.step;
this.dir = "r";
}
};
}
//实例化我的坦克时new出来并传参
var myTank = new Tank(350,400,"u","#542174","#FCB827");
//实例化敌人的坦克,有多个所以做成数组,再将数组每一项new出来并传参即可
//这里以骑士队的主色画坦克
var enemyTank = new Array();
for(var i=0; i<3; i++){
enemyTank[i] = new Tank(240*(i+0.45),60,"d","#EBB227","#780910");
} //封装一个更新战场的函数
function updateFloor(){
oCxt.clearRect(0,0,800,500); //更新之前先清除画布
drawTank(myTank);
for(var i=0; i<enemyTank.length; i++){
drawTank(enemyTank[i]); //循环一下把每一个敌人造出来
}
} //设置一个间歇调用的函数,每隔100ms更新一下战场
setInterval(function(){
updateFloor();
},100); //响应玩家的操作指令
window.onkeydown = function(eve){
switch(eve.keyCode){
case 38:
case 87:
myTank.turnUp();
break;
case 40:
case 83:
myTank.turnDown();
break;
case 37:
case 65:
myTank.turnLeft();
break;
case 39:
case 68:
myTank.turnRight();
}
};
H5 canvas建造敌人坦克的更多相关文章
- 使用H5 canvas画一个坦克
具体步骤如下: 1. 首先做出绘图区,作为坦克的战场 <canvas id="floor" width="800px" height=&quo ...
- H5坦克大战之【建造敌人的坦克】
公司这几天在准备新版本的上线,今天才忙里偷闲来写这篇博客.接着上一篇的"H5坦克大战之[玩家控制坦克移动2]"(http://www.cnblogs.com/zhouhuan/ ...
- H5 canvas绘制出现模糊的问题
在之前做移动端小游戏幸运转盘.九宫格转盘,使用到了 canvas ,也是第一次在项目中使用 canvas 来实现. 近期测试人员反应 canvas 绘制的内容太模糊,心想着用 canvas 绘制出来的 ...
- h5 canvas 小球移动
h5 canvas 小球移动 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- h5 canvas 画图
h5 canvas 画图 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- H5 canvas控制坦克移动2
接着上一篇(http://www.cnblogs.com/zhouhuan/p/H5_tankgame2.html),这篇主要修复两个bug,第一,玩家按下方向键时,坦克的炮筒应该指向相应的方向,并向 ...
- H5 canvas控制坦克移动
接着上一篇(http://www.cnblogs.com/zhouhuan/p/H5_tankgame.html),这一篇研究一下怎么响应玩家的操作让坦克进行相应的移动. 1. 了解keydown ...
- HTML5-坦克大战一画出敌人坦克并让自己的坦克可以发子弹的功能(二)
上一篇博客只画出了,一个坦克,并让其可以上下左右移动,这篇博客将画出敌人的坦克,并让自己的坦克可以发子弹,但是还不是尽善尽美,还有一些问题,将会在下篇博客说明: html代码: <!DOCTYP ...
- H5 canvas填充文字自动换行
canvas是H5中非常重要,非常常用,也是非常强大的一个新标签,美中不足的事,canvas中没没有自动换行的属性,我的第一反应是,字符串截取,然后计算每行的距离来实现自动换行.. 然后百度了一下,已 ...
随机推荐
- IIS Admin Service 服务由于下列服务特定错误而终止: 无效签名。
于是查看系统日志: 具体信息如下:日志名称: System来源: Service Control Manager日期: 2015/11/2 ...
- java网络编程面试题
1.网络编程时的同步.异步.阻塞.非阻塞? 同步:函数调用在没得到结果之前,没有调用结果,不返回任何结果.异步:函数调用在没得到结果之前,没有调用结果,返回状态信息.阻塞:函数调用在没得到结果之前,当 ...
- State of the official Elasticsearch Java clients
Elasticsearch Java Clients | Elastic https://www.elastic.co/blog/state-of-the-official-elasticsearch ...
- Http协议中Cookie详细介绍(转)
原文:http://www.169it.com/article/3217120921.html Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie.内存C ...
- python操作mysql数据库读取一个数据库的表写入另一个数据库
写这个肯定是工作需要了,不啰嗦,直接说事 我现在有两台主机,一台是公司主机,一台是客户主机,要求把公司主机上的三个表同步到客户主机上的数据库 注意是同步,首先就得考虑用linux定时任务或者主从复制, ...
- mysql 数据操作 单表查询 concat_ws() 定义显示格式
有个需求用concat以这种格式打印查询 mysql> select concat(name,':',age) from employee; +----------------------+ | ...
- Kafka丢失数据问题优化总结
数据丢失是一件非常严重的事情事,针对数据丢失的问题我们需要有明确的思路来确定问题所在,针对这段时间的总结,我个人面对kafka 数据丢失问题的解决思路如下: 是否真正的存在数据丢失问题,比如有很多时候 ...
- .Ignite是什么
Ignite是什么 Apache Ignite内存数据组织是高性能的.集成化的以及分布式的内存平台,他可以实时地在大数据集中执行事务和计算,和传统的基于磁盘或者闪存的技术相比,性能有数量级的提升. ...
- StarUML激活
感谢 http://blog.csdn.net/mergades/article/details/46662413 1,打开对应 mac版本的安装包位置,在对应目录/Applications/Sta ...
- 这才是官方的tapable中文文档
起因 搜索引擎搜索tapable中文文档,你会看见各种翻译,点进去一看,确实是官方的文档翻译过来的,但是webpack的文档确实还有很多需要改进的地方,既然是开源的为什么不去github上的tapab ...