HTML5经典坦克大战及源码
目录
一、简单介绍
二、具体界面
主界面
排行榜界面
组员信息界面
组员信息场景
三、部分代码
3.1 界面绘制的实现
6.2 坦克移动实现
3.3 发射炮弹
3.4声音处理
3.5计分
四、总结
一、简单介绍
随着人们精神文化生活的日益丰富,为了让我们在闲暇的时间多方面发展个人的兴趣爱好,为了更好的开发个人智力,游戏成为人们生活中不可缺少的一部分。作为休闲游戏的起源应该追溯到早期的俄罗斯方块和坦克大战,坦克大战时童年经常玩的游戏,也是一款经典游戏,对我们90后而言,是童年最珍贵的回忆。
Html5横空出世,开启了新的RIA革命, 是未来Web发展的重要方向。这款Html5坦克大战是基于javascript,结合modernizr开源库设计的单机小游戏,用户可以控制坦克移动,可以选择关卡,攻击敌人等
二、具体界面
主界面
排行榜界面
组员信息界面
组员信息场景
三、部分代码
3.1 界面绘制的实现
<canvas id="canvasOne"width="650" height="384" top=50px; left=50px;>Yourbrowser does not support the HTML 5 Canvas. </canvas>
6.2 坦克移动实现
下面给出敌人坦克移动的代码
functionenemyupdate() {
enemytank.shapenum =(0.1 + enemytank.shapenum) % 8 + 9; //减慢滚带的速度
enemytank.enemytankshape= Math.floor(enemytank.shapenum);
//下
if(enemytank.enemytankAngle== 180) {
swerve()
enemytank.nexty +=enemytank.enemytankspeed;
if(scene[Math.ceil((enemytank.nexty- 20) / 32)][Math.ceil((enemytank.nextx - 20) / 32)] != 0 ||scene[Math.ceil((enemytank.nexty - 20) / 32)][Math.floor((enemytank.nextx - 12)/ 32)] != 0) {
enemyhitwall()
}
}
//左
if(enemytank.enemytankAngle== 270) {
swerve()
enemytank.nextx -=enemytank.enemytankspeed;
if(scene[Math.floor((enemytank.nexty- 12) / 32)][Math.floor((enemytank.nextx - 12) / 32)] != 0 || scene[Math.ceil((enemytank.nexty- 20) / 32)][Math.floor((enemytank.nextx - 12) / 32)] != 0) {
enemyhitwall()
}
}
//右
if(enemytank.enemytankAngle== 90) {
swerve()
enemytank.nextx +=enemytank.enemytankspeed;
if(scene[Math.ceil((enemytank.nexty- 20) / 32)][Math.ceil((enemytank.nextx - 20) / 32)] != 0 ||scene[Math.floor((enemytank.nexty - 12) / 32)][Math.ceil((enemytank.nextx - 20)/ 32)] != 0) {
enemyhitwall()
}
}
//上
if(enemytank.enemytankAngle== 0) {
swerve()
enemytank.nexty -=enemytank.enemytankspeed;
if(scene[Math.floor((enemytank.nexty- 12) / 32)][Math.floor((enemytank.nextx - 12) / 32)] != 0 ||scene[Math.floor((enemytank.nexty - 12) / 32)][Math.ceil((enemytank.nextx - 20)/ 32)] != 0) {
enemyhitwall()
}
}
//随机发射炮弹
var enemyfire =Math.floor(Math.random() * 100);
if(enemyfire == 0) {
if(enemyshell.shellflage){
return;
}
if(enemytank.nextx< 0) {
return;
} else {
enemyshell.shellflage= true;
enemyshell.nextx = enemytank.nextx;
enemyshell.nexty= enemytank.nexty;
enemyshell.shellAngle= enemytank.enemytankAngle;
if(enemyshellInterval){
clearInterval(enemyshellInterval);
enemyshellInterval= null;
}
enemyshellInterval= setInterval(enemyrdrawshell, 33);
}
}
//检测是否打击到目标
if(impact(shell,enemytank)) {
if(shellInterval) {
clearInterval(shellInterval);
shellInterval =null;
}
score++;
if(score >=record) {
record = score;
localStorage.record= record;
}
if(score >= level* 5) {
level++;
if(level > 5){
gameover =true;
return
}
scene =scenenum[(level - 1) % 4];
for(var enemynum= 0; enemynum <= 2; enemynum++) {
var tempx = 48 + enemynum * 192;
//敌军坦克
tempenemytank= {
appearx:tempx,
appeary:48,
x: tempx,
y: 48,
nextx:tempx,
nexty: 48,
enemytankspeed:Speed + level * 0.5,
enemytankAngle:180,
enemytankshape:0,
shapenum:0
};
enemy[enemynum]= tempenemytank;
}
tankmove = {
appearx: 240,
appeary: 304,
x: 240,
y: 304,
nextx: 240,
nexty: 304,
tankAngle:Angle,
tankspeed:Speed,
tankshape:shape,
tanknextshape:shape
};
enemyshell = {
x: 0,
y: 0,
nextx: 0,
nexty: 0,
shellspeed:Speed + level * 0.5 + 2,
shellshape:21,
shellAngle:Angle,
shellflage:false
};
surplus = 6;
}
surplus--;
setTimeout(function(){
shell.shellflage= false
}, 300);
explode(enemytank)
enemytank.nextx =-500;
shell.nextx = -500;
shell.nexty = -500;
}
//检测是否打击到玩家
if(impact2(enemyshell,tankmove)) {
if(invincible) {
return;
}
if(enemyshellInterval){
clearInterval(enemyshellInterval);
enemyshellInterval= null;
}
life--;
if(life <= 0) {
gameover = true;
return;
}
invincible = true;
setTimeout(function(){
invincible =false
}, 2000)
explode(tankmove)
setTimeout(function(){
enemyshell.shellflage= false
}, 300);
tankmove.nextx =-500;
enemyshell.nextx =-500;
enemyshell.nexty =-500;
}
//与敌人相撞
if(impact(enemytank,tankmove)) {
if(enemyshellInterval){
clearInterval(enemyshellInterval);
enemyshellInterval= null;
}
if(invincible) {
return;
}
invincible = true;
setTimeout(function(){
invincible =false
}, 2000)
life--;
if(life <= 0) {
gameover = true;
return;
}
explode(tankmove)
tankmove.nextx =-500;
}
//自动转向
function swerve() {
var j =Math.floor(Math.random() * 100);
if(j == 0) {
enemytank.enemytankAngle+= 90;
}
if(j == 1) {
enemytank.enemytankAngle-= 90;
}
enemytank.enemytankAngle= (enemytank.enemytankAngle + 360) % 360;
}
//撞墙转向
function enemyhitwall(){
enemytank.nextx =enemytank.x;
enemytank.nexty =enemytank.y;
var j =Math.floor(Math.random() * 2);
if(j == 0) {
enemytank.enemytankAngle+= 90;
} else {
enemytank.enemytankAngle-= 90;
}
enemytank.enemytankAngle= (enemytank.enemytankAngle + 360) % 360;
}
}
3.3 发射炮弹
//炮弹数组
shell= {
x:0,
y:0,
nextx:0,
nexty:0,
shellspeed:Speed + 4,
shellshape:20,
shellAngle:Angle,
shellflage:false
};
//敌军炮弹数组
varenemyshell = {
x:0,
y:0,
nextx:0,
nexty:0,
shellspeed:Speed + 2,
shellshape:21,
shellAngle:Angle,
shellflage:false
};
//空格,发射炮弹
functionspace() {
if(keyPressList[32]== true) {
if(gameover){
location.reload();
}
if(shell.shellflage){
return;
}
if(tankmove.nextx< 0) {
return;
}else {
shootSound.play();
shell.shellflage= true;
shell.nextx= tankmove.nextx;
shell.nexty= tankmove.nexty;
shell.shellAngle= tankmove.tankAngle;
if(shellInterval){
clearInterval(shellInterval);
shellInterval= null;
}
shellInterval= setInterval(drawshell, 33);
}
}
}
//检测炮弹是否撞墙
functionhitwall(i) {
switch(i){
case26:
if(shellInterval){
clearInterval(shellInterval);
shellInterval= null;
}
setTimeout(function(){
shell.shellflage= false
},300);
shell.nextx= -500;
shell.nexty= -500;
return0;
break
case31:
if(shellInterval){
clearInterval(shellInterval);
shellInterval= null;
}
setTimeout(function(){
shell.shellflage= false
},300);
shell.nextx= -500;
shell.nexty= -500;
returni;
break
case30:
if(shellInterval){
clearInterval(shellInterval);
shellInterval= null;
}
setTimeout(function(){
shell.shellflage= false
},300);
shell.nextx= -500;
shell.nexty= -500;
returni;
break
default:
return0;
}
}
3.4声音处理
//声音
//爆炸
varexplodeSound = document.createElement("audio");
document.body.appendChild(explodeSound);
explodeSound.setAttribute("src","audio/explode1.mp3");
explodeSound.valume= .5;
//发射子弹
varshootSound = document.createElement("audio");
document.body.appendChild(shootSound);
shootSound.setAttribute("src","audio/shoot1.mp3");
shootSound.volume= .5;
//玩家行走
varplayermove = document.createElement("audio");
document.body.appendChild(playermove);
playermove.setAttribute("src","audio/move1.mp3");
playermove.valume= .001;
//敌人行走
varenemyrmove = document.createElement("audio");
document.body.appendChild(enemyrmove);
enemyrmove.setAttribute("src","audio/move2.mp3");
enemyrmove.valume= .001;
3.5计分
context.clearRect(496, 16, 138, 352);
context.fillStyle= "#3cb371";
context.fillRect(496,16, 138, 352);
context.save();
context.fillStyle= "#000000";
context.font= "italic bold 23px serif";
context.fillText("关 卡:" + level +"", 500, 80);
context.fillText("敌 人:" + surplus +"", 500, 110);
context.fillText("生 命:" + life +"", 500, 140);
context.fillText("得 分:" + score +"", 500, 170);
context.fillText("最高分:" + record +"", 500, 200);
context.restore();
context.save();
context.fillStyle= "#000000";
context.font= "normal bold 15px normal";
context.fillText("游戏说明: 玩家", 500, 270);
context.fillText("操控坦克进行战", 500,290);
context.fillText("斗,击毁敌方得", 500,310);
context.fillText("分,被击毁或相", 500,330);
context.fillText("相撞减分。", 500,350);
context.restore();
score++;
if(score>= record) {
record= score;
localStorage.record= record;
}
if(score>= level * 5) {
level++;
if(level> 5) {
gameover= true;
return
}
scene= scenenum[(level - 1) % 4];
for(varenemynum = 0; enemynum <= 2; enemynum++) {
vartempx = 48 + enemynum * 192;
//敌军坦克
tempenemytank= {
appearx:tempx,
appeary:48,
x:tempx,
y:48,
nextx:tempx,
nexty:48,
enemytankspeed:Speed + level * 0.5,
enemytankAngle:180,
enemytankshape:0,
shapenum:0
};
enemy[enemynum]= tempenemytank;
四、总结
这是我学习Html5一个多月以来,首次做的一个小项目,由于之前学过别的语言,所以做起来并不觉得困难。通过这个小项目,让我更深的了解了面向对象,同时也更深入的了解了一些新的知识点,稍作总结:对象能够移动的本质是:改变对象的坐标,再对对象重画。由于重画的速度很快,我们的肉眼无法察觉,因此就以为是移动了。根据坦克的起始坐标,根据坦克的方向设一个变量相应的改变坦克的起始坐标。然后在通过重画,就达到了运动的效果。通过这次编程实训和撰写实训报告,我们学会了一些编程技巧,同时也巩固了平常所学的理论知识,如html5、js、jquery,对调试程序也有了进一步的认识,有时候一个小小的语法错误都会导致程序编译不通过。所以在编程过程中,一定要认真对待,在使用HBuilder环境开发时,进一步的感受到了HBuilder的强大,对于拽写实训报告一定要注意格式,任何事情都有它的规范,不能因个人喜好而决定。
设计中存在的不足之处:
1.坦克行走没有声音
2.地图画大有困难
3.游戏刷新时有闪烁现象(双缓冲)
希望结束实训能在日后的学习中修复BUG,用于学习,勤于钻研、不断提高自己。
********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
HTML5经典坦克大战及源码相关推荐
- java完成经典坦克大战项目源码
图片是类与类之间的包位置关系,与代码的导包操作相关 [点击并拖拽以移动] 图片是类之间的关系,以及工具类的包位置package com.tank.app;import com.tank.game.G ...
- 射击小游戏源码《90坦克大战》源码H5+安卓+IOS三端源码
cocos creator2.2.2射击小游戏源码<90坦克大战>源码H5+安卓+IOS三端源码,开发脚本为javaScript方便扩展和阅读,支持cocos creator2.X版本,完 ...
- 3D坦克大战游戏源码
3D坦克大战游戏源码,该游戏是基于xcode 4.3,ios sdk 5.1开发.在xcode4.3.3上完美无报错.兼容ios4.3-ios6.0 ,一款ios平台上难得的3D坦克大战游戏源码,有2 ...
- 【180927】坦克大战游戏源码
一.源码特点 采用winform进行开发,实现了坦克大战的游戏功能,非常简单,欢迎下载 二.功能介绍 本源码是一个坦克大战游戏源码,运行后,用键盘进行操作,击败对方坦克会随机出现武器加 ...
- Java坦克大战游戏源码(java坦克大战)
Java坦克大战游戏源码(java坦克大战) public Swingtest002() {// 设置标题setTitle("请登陆");// 绝对布局setLayout(null ...
- 坦克大战java源码分析(上)
坦克大战源码分析 一.mytank07.java文件分析 注:至上而下将不懂的语句.结构体含义.代码作用等作出解释: 1.包的使用 package com.haiding.tank_7; 包语句的语法 ...
- 《HTML5经典坦克大战》游戏(代码)
前几天粗略地学了HTML5,然后就用它写了一个<经典坦克大战>游戏. 现在想分享一下我写的代码,写得不好请大家多多指教. 给大家推荐一个网站,这个网站是为大学生而做,为方便学习编程的同学而 ...
- 17 - python——简单的坦克大战(附源码)
基于对面向对象编程的思想完成简单的坦克大战游戏.主要目的锻炼面相对象编程思想 同样的在使用python进行游戏编写时需要安装pygame模块 安装方法: pycharm安装方式:File --> ...
- 坦克大战java_java版坦克大战游戏源码
[java]代码库package tankwar; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; imp ...
最新文章
- 浏览器上网 (Safari Chrome)
- id选择器、标签选择器、类选择器、交集选择器、并集选择器
- linux查看有几个终端命令,如何知道你在 Linux 里最常使用的几个命令?
- Django项目部署在Centos7
- 今天被公司安排给候选者进行初面,分享我的6道面试题
- 同时装有py2 和3,运行scrapy如何区分
- phpcms列表页内容如何替换?
- 【转载】使用Winrar对压缩文件进行加密,并且给定解压密码
- Tableau详细安装教程【踩坑】
- linux系统重装win系统教程,Win10如何重装linux系统 Win10重装linux系统教程
- 生活记录:压抑暂时解脱
- 云原生 | 混沌工程工具 ChaosBlade Operator Pod 篇(文末赠书)
- 洛谷P1005 矩阵取数游戏 ACM 大数+区间dp
- 字节流与字符流(一)
- 轻生之事折射家庭教育之殇
- 从网红店到家居设计,“Ins风”正在无孔不入
- QT读取位置时发生访问冲突
- 单片机数码管6位时钟c语言,单片机6位数码管时钟
- ElementUI时间选择器
- 过客--三星 s6 edge 照相机出故障了
热门文章
- 修·蓝博士:吃东西前一定要这样清理
- 计算机专业口头禅大全,经典口头禅
- 009-冲动基因|为什么会有人选择冒险
- php100漏洞,phpyun人才管理系统V5.0 SQL注入漏洞分析
- UID和cookie的查找
- 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.3节手机自带数据库——SQLite...
- 欢迎进入杰杰的博客导航一站式搜索(所有博客的汇总帖)
- 2020计算机保研之路:211上岸上海985
- 一条坎坷的保研路:北理、天大、南开、厦大、川大、支保
- 更相减损术程序设计c语言,更相减损术