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中没没有自动换行的属性,我的第一反应是,字符串截取,然后计算每行的距离来实现自动换行.. 然后百度了一下,已 ...
随机推荐
- thinkphp --- 写入日志
在开发过程中,对于一些参数,不好直接输入或者打印调试,特别是在微信开发过程中,这个时候,通过日志来查看信息就显得格外重要. 下面是在TP3.2.3框架中,写入日志的方法: public functio ...
- 170628、springboot编程之Druid数据源和监控配置一
Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSource,那么如何修改数据源呢?我已目前使用比较多的阿里数据源Druid为例,如果使用其他的数 ...
- Oracle在linux下命令行无法使用退格键退格,无法使用上下键切换历史命令的解决办法
使用xshell等客户端登录oracl时在命令行无法使用退格键也无法使用上下键切换历史命令可以使用rlwrap解决 1,linux环境 2,下载rlwrap wget http://files.cnb ...
- opencv中Mat格式的数据访问.at
opencv3中图形存储基本为Mat格式,如果我们想获取像素点的灰度值或者RGB值,可以通过image.at<uchar>(i,j)的方式轻松获取. Mat类中的at方法对于获取图像矩阵某 ...
- Oracle 的闪回技术 --flashback
SQL Fundamentals: 表的创建和管理 如何开启数据库闪回? SQL> shutdown immediate; ORA-01109: database not open Databa ...
- oracle goldengate技术架构-简单试验(全)
一 GoldenGate简介 Oracle Golden Gate软件是一种基于日志的结构化数据复制备份软件,它通过解析源 数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库, ...
- Lightoj 1003 - Drunk(拓扑排序判断是否有环 Map离散化)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1003 题意是有m个关系格式是a b:表示想要和b必须喝a,问一个人是否喝醉就看一个人是 ...
- JavaWeb404排错的小技巧
报这种错误,404后面什么都没有的话,就证明处理器映射器根据url找不到handler. 报这种错误,证明处理器映射器根据url找到了handler,转发的jsp页面找不到,说明jsp页面错了.
- mysql 删除表
删除表 DROP TABLE 表名;
- mysql 数据操作 多表查询 子查询 介绍
子查询就是: 把一条sql语句放在一个括号里,当做另外一条sql语句查询条件使用 拿到这个结果以后 当做下一个sql语句查询条件mysql 数据操作 子查询 #1:子查询是将一个查询语句嵌套在另一个 ...