花了两天时间用html+css+js做了一个网页版坦克大战游戏

color: #d38daf;

}

.demo-2 a:hover,

.demo-2 a:active {

color: #fff;

}

.demo-2 .htmleaf-demos a {

background: #883b61;

color: #fff;

}

.demo-2 .htmleaf-top a:hover {

background: rgba(255,255,255,0.3);

color: #333;

}

.demo-3 body {

color: #87968e;

background: #fff2e3;

}

.demo-3 a {

color: #ea5381;

}

.demo-3 .htmleaf-demos a {

background: #ea5381;

color: #fff;

}

.demo-4 body {

color: #999;

background: #fff2e3;

overflow: hidden;

}

.demo-4 a {

color: #1baede;

}

.demo-4 a:hover,

.demo-4 a:active {

opacity: 0.6;

}

.demo-4 .htmleaf-demos a {

background: #1baede;

color: #fff;

}

.demo-5 body {

background: #fffbd6;

}

/****/

.related {

/margin-top: 5em;/

color: #fff;

background: #333;

text-align: center;

font-size: 1.25em;

padding: 3em 0;

overflow: hidden;

}

.related a {

display: inline-block;

text-align: left;

margin: 20px auto;

padding: 10px 20px;

opacity: 0.8;

-webkit-transition: opacity 0.3s;

transition: opacity 0.3s;

-webkit-backface-visibility: hidden;

}

.related a:hover,

.related a:active {

opacity: 1;

}

.related a img {

max-width: 100%;

}

.related a h3 {

font-weight: 300;

margin-top: 0.15em;

color: #fff;

}

@media screen and (max-width: 40em) {

.htmleaf-icon span {

display: none;

}

.htmleaf-icon:before {

font-size: 160%;

line-height: 2;

}

}

@media screen and (max-width: 46.0625em) {

.column {

width: 100%;

min-width: auto;

min-height: auto;

padding: 1em;

}

.column p {

text-align: left;

font-size: 1.5em;

}

.column:nth-child(2) {

box-shadow: 0 -1px 0 rgba(0,0,0,0.1);

}

}

@media screen and (max-width: 25em) {

.htmleaf-icon span {

display: none;

}

}

核心js

/**

  • 检测2个物体是否碰撞

  • @param object1 物体1

  • @param object2 物体2

  • @param overlap 允许重叠的大小

  • @returns {Boolean} 如果碰撞了,返回true

*/

function CheckIntersect(object1, object2, overlap)

{

// x-轴 x-轴

// A1------>B1 C1 A2------>B2 C2

// ±-------+ ^ ±-------+ ^

// | object1| | y-轴 | object2| | y-轴

// | | | | | |

// ±-------+ D1 ±-------+ D2

//

//overlap是重叠的区域值

A1 = object1.x + overlap;

B1 = object1.x + object1.size - overlap;

C1 = object1.y + overlap;

D1 = object1.y + object1.size - overlap;

A2 = object2.x + overlap;

B2 = object2.x + object2.size - overlap;

C2 = object2.y + overlap;

D2 = object2.y + object2.size - overlap;

//假如他们在x-轴重叠

if(A1 >= A2 && A1 <= B2

|| B1 >= A2 && B1 <= B2)

{

//判断y-轴重叠

if(C1 >= C2 && C1 <= D2 || D1 >= C2 && D1 <= D2)

{

return true;

}

}

return false;

}

/**

  • 坦克与地图块碰撞

  • @param tank 坦克对象

  • @param mapobj 地图对象

  • @returns {Boolean} 如果碰撞,返回true

*/

function tankMapCollision(tank,mapobj){

//移动检测,记录最后一次的移动方向,根据方向判断±overlap,

var tileNum = 0;//需要检测的tile数

var rowIndex = 0;//map中的行索引

var colIndex = 0;//map中的列索引

var overlap = 3;//允许重叠的大小

//根据tank的x、y计算出map中的row和col

if(tank.dir == UP){

rowIndex = parseInt((tank.tempY + overlap - mapobj.offsetY)/mapobj.tileSize);

colIndex = parseInt((tank.tempX + overlap- mapobj.offsetX)/mapobj.tileSize);

}else if(tank.dir == DOWN){

//向下,即dir==1的时候,行索引的计算需要+tank.Height

rowIndex = parseInt((tank.tempY - overlap - mapobj.offsetY + tank.size)/mapobj.tileSize);

colIndex = parseInt((tank.tempX + overlap- mapobj.offsetX)/mapobj.tileSize);

}else if(tank.dir == LEFT){

rowIndex = parseInt((tank.tempY + overlap- mapobj.offsetY)/mapobj.tileSize);

colIndex = parseInt((tank.tempX + overlap - mapobj.offsetX)/mapobj.tileSize);

}else if(tank.dir == RIGHT){

rowIndex = parseInt((tank.tempY + overlap- mapobj.offsetY)/mapobj.tileSize);

//向右,即dir==3的时候,列索引的计算需要+tank.Height

colIndex = parseInt((tank.tempX - overlap - mapobj.offsetX + tank.size)/mapobj.tileSize);

}

if(rowIndex >= mapobj.HTileCount || rowIndex < 0 || colIndex >= mapobj.wTileCount || colIndex < 0){

return true;

}

if(tank.dir == UP || tank.dir == DOWN){

var tempWidth = parseInt(tank.tempX - map.offsetX - (colIndex)*mapobj.tileSize + tank.size - overlap);//去除重叠部分

if(tempWidth % mapobj.tileSize == 0 ){

tileNum = parseInt(tempWidth/mapobj.tileSize);

}else{

tileNum = parseInt(tempWidth/mapobj.tileSize) + 1;

}

for(var i=0;i<tileNum && colIndex+i < mapobj.wTileCount ;i++){

var mapContent = mapobj.mapLevel[rowIndex][colIndex+i];

if(mapContent == WALL || mapContent == GRID || mapContent == WATER || mapContent == HOME || mapContent == ANOTHREHOME){

if(tank.dir == UP){

tank.y = mapobj.offsetY + rowIndex * mapobj.tileSize + mapobj.tileSize - overlap;

}else if(tank.dir == DOWN){

tank.y = mapobj.offsetY + rowIndex * mapobj.tileSize - tank.size + overlap;

}

return true;

}

}

}else{

var tempHeight = parseInt(tank.tempY - map.offsetY - (rowIndex)*mapobj.tileSize + tank.size - overlap);//去除重叠部分

if(tempHeight % mapobj.tileSize == 0 ){

tileNum = parseInt(tempHeight/mapobj.tileSize);

}else{

tileNum = parseInt(tempHeight/mapobj.tileSize) + 1;

}

for(var i=0;i<tileNum && rowIndex+i < mapobj.HTileCount;i++){

var mapContent = mapobj.mapLevel[rowIndex+i][colIndex];

if(mapContent == WALL || mapContent == GRID || mapContent == WATER || mapContent == HOME || mapContent == ANOTHREHOME){

if(tank.dir == LEFT){

tank.x = mapobj.offsetX + colIndex * mapobj.tileSize + mapobj.tileSize - overlap;

}else if(tank.dir == RIGHT){

tank.x = mapobj.offsetX + colIndex * mapobj.tileSize - tank.size + overlap;

}

return true;

}

}

}

return false;

}

/**

  • 子弹与地图块的碰撞

  • @param bullet 子弹对象

  • @param mapobj 地图对象

*/

function bulletMapCollision(bullet,mapobj){

var tileNum = 0;//需要检测的tile数

var rowIndex = 0;//map中的行索引

var colIndex = 0;//map中的列索引

var mapChangeIndex = [];//map中需要更新的索引数组

var result = false;//是否碰撞

//根据bullet的x、y计算出map中的row和col

if(bullet.dir == UP){

rowIndex = parseInt((bullet.y - mapobj.offsetY)/mapobj.tileSize);

colIndex = parseInt((bullet.x - mapobj.offsetX)/mapobj.tileSize);

}else if(bullet.dir == DOWN){

//向下,即dir==1的时候,行索引的计算需要+bullet.Height

rowIndex = parseInt((bullet.y - mapobj.offsetY + bullet.size)/mapobj.tileSize);

colIndex = parseInt((bullet.x - mapobj.offsetX)/mapobj.tileSize);

}else if(bullet.dir == LEFT){

rowIndex = parseInt((bullet.y - mapobj.offsetY)/mapobj.tileSize);

colIndex = parseInt((bullet.x - mapobj.offsetX)/mapobj.tileSize);

}else if(bullet.dir == RIGHT){

rowIndex = parseInt((bullet.y - mapobj.offsetY)/mapobj.tileSize);

//向右,即dir==3的时候,列索引的计算需要+bullet.Height

colIndex = parseInt((bullet.x - mapobj.offsetX + bullet.size)/mapobj.tileSize);

}

if(rowIndex >= mapobj.HTileCount || rowIndex < 0 || colIndex >= mapobj.wTileCount || colIndex < 0){

return true;

}

if(bullet.dir == UP || bullet.dir == DOWN){

var tempWidth = parseInt(bullet.x - map.offsetX - (colIndex)*mapobj.tileSize + bullet.size);

if(tempWidth % mapobj.tileSize == 0 ){

tileNum = parseInt(tempWidth/mapobj.tileSize);

}else{

tileNum = parseInt(tempWidth/mapobj.tileSize) + 1;

}

for(var i=0;i<tileNum && colIndex+i < mapobj.wTileCount ;i++){

var mapContent = mapobj.mapLevel[rowIndex][colIndex+i];

if(mapContent == WALL || mapContent == GRID || mapContent == HOME || mapContent == ANOTHREHOME){

//bullet.distroy();

result = true;

if(mapContent == WALL){

//墙被打掉

mapChangeIndex.push([rowIndex,colIndex+i]);

}else if(mapContent == GRID){

}else{

isGameOver = true;

break;

}

}

}

}else{

var tempHeight = parseInt(bullet.y - map.offsetY - (rowIndex)*mapobj.tileSize + bullet.size);

if(tempHeight % mapobj.tileSize == 0 ){

tileNum = parseInt(tempHeight/mapobj.tileSize);

}else{

tileNum = parseInt(tempHeight/mapobj.tileSize) + 1;

}

for(var i=0;i<tileNum && rowIndex+i < mapobj.HTileCount;i++){

var mapContent = mapobj.mapLevel[rowIndex+i][colIndex];

if(mapContent == WALL || mapContent == GRID || mapContent == HOME || mapContent == ANOTHREHOME){

//bullet.distroy();

result = true;

if(mapContent == WALL){

//墙被打掉

mapChangeIndex.push([rowIndex+i,colIndex]);

}else if(mapContent == GRID){

}else{

isGameOver = true;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

JavaScript 和 ES6

在这个过程你会发现,有很多 JS 知识点你并不能更好的理解为什么这么设计,以及这样设计的好处是什么,这就逼着让你去学习这单个知识点的来龙去脉,去哪学?第一,书籍,我知道你不喜欢看,我最近通过刷大厂面试题整理了一份前端核心知识笔记,比较书籍更精简,一句废话都没有,这份笔记也让我通过跳槽从8k涨成20k。

JavaScript部分截图

ucM3O-1711877470176)]
[外链图片转存中…(img-Bn9a2OhE-1711877470176)]
[外链图片转存中…(img-vQhpQryn-1711877470177)]
[外链图片转存中…(img-Etlza2WE-1711877470178)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-TQj4JdZC-1711877470178)]

JavaScript 和 ES6

在这个过程你会发现,有很多 JS 知识点你并不能更好的理解为什么这么设计,以及这样设计的好处是什么,这就逼着让你去学习这单个知识点的来龙去脉,去哪学?第一,书籍,我知道你不喜欢看,我最近通过刷大厂面试题整理了一份前端核心知识笔记,比较书籍更精简,一句废话都没有,这份笔记也让我通过跳槽从8k涨成20k。

JavaScript部分截图

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值