JavaScript—飞机大战
今天来写个游戏,飞机大战
1,布局

2,思路
1,动态创建自己的飞机 让它在规定的区域,跟着鼠标运动。
2,在自己飞机的上方,间隔1s生成子弹。子弹往上移动 当top:0 子弹消失
3,每隔1s 产生敌机 top 0,left 随机,敌机向下移动,敌机超过边距时。敌机消失。
4,子弹和敌机相遇时。子弹和敌机同时消失
3,代码
1,动态创建自己的飞机 让它在规定的区域,跟着鼠标运动。
let view = document.getElementById('view');
// 创建自己的飞机
let air = document.createElement('div');
air.id = 'air'
document.body.appendChild(air)
document.onmousemove = function (e) {
e = e || window.event
// 边距
let aX = view.offsetLeft < e.clientX - air.offsetWidth / 2 && e.clientX + air.offsetWidth / 2 < view.offsetLeft + view.offsetWidth
let aY = view.offsetTop < e.clientY - air.offsetHeight / 2 && e.clientY + air.offsetHeight / 2 < view.offsetTop + view.offsetHeight
if (aX&&aY) {
air.style.left = e.clientX - air.offsetWidth / 2 + 'px';
air.style.top = e.clientY - air.offsetHeight / 2 + 'px'
}
}
2,在自己飞机的上方,间隔1s生成子弹。子弹往上移动 当top:0 子弹消失
//获取区域
let view = document.getElementById('view');
// 创建自己的飞机
let air = document.createElement('div');
air.id = 'air'
document.body.appendChild(air)
document.onmousemove = function (e) {
e = e || window.event
// 边距
let aX = view.offsetLeft < e.clientX - air.offsetWidth / 2 && e.clientX + air.offsetWidth / 2 < view.offsetLeft + view.offsetWidth
let aY = view.offsetTop < e.clientY - air.offsetHeight / 2 && e.clientY + air.offsetHeight / 2 < view.offsetTop + view.offsetHeight
if (aX && aY) {
air.style.left = e.clientX - air.offsetWidth / 2 + 'px';
air.style.top = e.clientY - air.offsetHeight / 2 + 'px'
ObJ_billet.bif=true
}
}
let caerBl_time=setInterval(
function () {
if (ObJ_billet.bif){
//在自己飞机的上方
caeationBillet() }
},1000 ) //用来保存子弹数据
let ObJ_billet = {
name: 'billet_',
num: 0,
//是否在区域
bif:false,
arr: []//保存id,xy坐标
} function run_Billet(bl,i) {
let runBl_time=setInterval(function () {
bl.style.top=bl.offsetTop-1+'px'
ObJ_billet.arr[i] = bl.id + '|' +bl.offsetLeft + '|' +bl.offsetTop
if (bl.offsetTop<0){
bl.parentNode.removeChild(bl); clearInterval(runBl_time)
}
},30)
} //xy 坐标
function caeationBillet() {
let billet = document.createElement('div')
billet.className = 'bullet'
billet.id = ObJ_billet.name + ObJ_billet.num;
document.body.appendChild(billet)
//子弹在飞机上方
billet.style.left = air.offsetLeft+air.offsetWidth/2+ 'px'
billet.style.top =air.offsetTop-billet.offsetHeight-1+ 'px'
//保存数据
ObJ_billet.arr[ObJ_billet.num] = billet.id + '|' +billet.offsetLeft + '|' +billet.offsetTop
//子弹运动
run_Billet(billet,ObJ_billet.num)
// 自增1
ObJ_billet.num+=1
//挡子弹有最多100个
if (ObJ_billet.num>=100){
ObJ_billet.num=0;
} }
3,每隔1s 产生敌机 top 0,left 随机,敌机向下移动,敌机超过边距时。敌机消失。
<script>
//获取区域
let view = document.getElementById('view');
// 创建自己的飞机
let air = document.createElement('div');
air.id = 'air'
document.body.appendChild(air)
document.onmousemove = function (e) {
e = e || window.event
// 边距
let aX = view.offsetLeft < e.clientX - air.offsetWidth / 2 && e.clientX + air.offsetWidth / 2 < view.offsetLeft + view.offsetWidth
let aY = view.offsetTop < e.clientY - air.offsetHeight / 2 && e.clientY + air.offsetHeight / 2 < view.offsetTop + view.offsetHeight
if (aX && aY) {
air.style.left = e.clientX - air.offsetWidth / 2 + 'px';
air.style.top = e.clientY - air.offsetHeight / 2 + 'px'
ObJ_billet.bif=true
}
}
let caerBl_time=setInterval(
function () {
if (ObJ_billet.bif){
//在自己飞机的上方
caeationBillet()
caeationHair() }
},1000 ) //用来保存子弹数据
let ObJ_billet = {
name: 'billet_',
num: 0,
//是否在区域
bif:false,
arr: []//保存id,xy坐标
}
let ObJ_Hair = {
name: 'hair_',
num: 0,
arr: []//保存id,xy坐标
}
// 子弹运动
function run_Billet(element,i) {
let runBl_time=setInterval(function () {
element.style.top=element.offsetTop-1+'px'
ObJ_billet.arr[i] = element.id + '|' +element.offsetLeft + '|' +element.offsetTop
// 超出边界消失
if (element.offsetTop<0){
element.parentNode.removeChild(element);
clearInterval(runBl_time)
}
},30)
} // 敌机运动
function run_Hair(element,i) {
let runHair_time=setInterval(function () {
element.style.top=element.offsetTop+1+'px'
ObJ_Hair.arr[i] = element.id + '|' +element.offsetLeft + '|' +element.offsetTop
// 超出边界消失
if (element.offsetTop>view.offsetHeight-element.offsetHeight){
element.parentNode.removeChild(element);
clearInterval(runHair_time)
}
},30)
} //创建子弹
function caeationBillet() {
let billet = document.createElement('div')
billet.className = 'bullet'
billet.id = ObJ_billet.name + ObJ_billet.num;
document.body.appendChild(billet)
//子弹在飞机上方
billet.style.left = air.offsetLeft+air.offsetWidth/2+ 'px'
billet.style.top =air.offsetTop-billet.offsetHeight-1+ 'px'
//保存数据
ObJ_billet.arr[ObJ_billet.num] = billet.id + '|' +billet.offsetLeft + '|' +billet.offsetTop
//子弹运动
run_Billet(billet,ObJ_billet.num)
// 自增1
ObJ_billet.num+=1
//挡子弹有最多100个
if (ObJ_billet.num>=100){
ObJ_billet.num=0;
}
}
// 创建敌机
function caeationHair() {
let hair = document.createElement('div')
hair.className = 'hair'
hair.id = ObJ_Hair.name + ObJ_Hair.num;
view.appendChild(hair)
//飞机由上往下 left随机大小0到view宽度
let random_L=randomNum(0,view.offsetWidth-hair.offsetWidth)
hair.style.left = random_L+ 'px'
hair.style.top =0+ 'px'
ObJ_Hair.arr[ObJ_Hair.num] = hair.id + '|' +hair.offsetLeft + '|' +hair.offsetTop run_Hair(hair,ObJ_Hair.num)
// 自增1
ObJ_Hair.num+=1
//飞机有最多100个
if (ObJ_Hair.num>=100){
ObJ_Hair.num=0;
}
} //生成从minNum到maxNum的随机数
function randomNum(minNum,maxNum){
return parseInt(Math.random()*(maxNum-minNum+1)+minNum) } </script>
4,子弹和敌机相遇时。子弹和敌机同时消失
//搜索所有的子弹,相遇 就被击毙。相遇条件 飞机左<=left 子弹<=you top 子弹<=飞机
ript>
//获取区域
let view = document.getElementById('view');
// 创建自己的飞机
let air = document.createElement('div');
air.id = 'air'
document.body.appendChild(air)
document.onmousemove = function (e) {
e = e || window.event
// 边距
let aX = view.offsetLeft < e.clientX - air.offsetWidth / 2 && e.clientX + air.offsetWidth / 2 < view.offsetLeft + view.offsetWidth
let aY = view.offsetTop < e.clientY - air.offsetHeight / 2 && e.clientY + air.offsetHeight / 2 < view.offsetTop + view.offsetHeight
if (aX && aY) {
air.style.left = e.clientX - air.offsetWidth / 2 + 'px';
air.style.top = e.clientY - air.offsetHeight / 2 + 'px'
ObJ_billet.bif = true
}
}
let caerBl_time = setInterval(
function () {
if (ObJ_billet.bif) {
//在自己飞机的上方
caeationBillet()
caeationHair()
//搜索所有的子弹,相遇 就被击毙。相遇条件 飞机左<=left 子弹<=you top 子弹<=飞机
for (let i = 0; i < ObJ_billet.arr.length; i++) {
let barr=ObJ_billet.arr[i].split('|')
for (let j=0;j<ObJ_Hair.arr.length;j++){
let harr=ObJ_Hair.arr[j].split('|')//id x y
if (document.getElementById(barr[0])&&document.getElementById(harr[0])){
let yif=parseInt(barr[2])<=parseInt(harr[2]) //Y相遇
let xif=parseInt(barr[1])>=parseInt(harr[1])&&parseInt(barr[1])<=parseInt(harr[1])+34
if (yif&&xif){
//消失元素 关闭记时器
let billet_a=document.getElementById(barr[0])
let hair_a=document.getElementById(harr[0])//获取敌机 billet_a.parentNode.removeChild(billet_a)//删除子弹
hair_a.parentNode.removeChild(hair_a)//删除敌机
clearInterval(runBl_time)
clearInterval(runHair_time)
}}
}
}
}
}, 1000) //用来保存子弹数据
let ObJ_billet = {
name: 'billet_',
num: 0,
bif: false,
//是否在区域
arr: []//保存id,xy坐标
}
let ObJ_Hair = {
name: 'hair_',
num: 0,
arr: []//保存id,xy坐标
}
let runBl_time=null;//子弹定时器
let runHair_time=null;//飞机定时器
// 子弹运动
function run_Billet(element, i) {
runBl_time = setInterval(function () {
element.style.top = element.offsetTop - 1 + 'px'
ObJ_billet.arr[i] = element.id + '|' + element.offsetLeft + '|' + element.offsetTop
// 超出边界消失
if (element.offsetTop < 0) {
element.parentNode.removeChild(element);
clearInterval(runBl_time)
}
}, 30)
} // 敌机运动
function run_Hair(element, i) {
runHair_time = setInterval(function () {
element.style.top = element.offsetTop + 1 + 'px' ObJ_Hair.arr[i] = element.id + '|' + element.offsetLeft + '|' + element.offsetTop + '|' + ''
// 超出边界消失
if (element.offsetTop > view.offsetHeight - element.offsetHeight) {
element.parentNode.removeChild(element);
clearInterval(runHair_time)
}
}, 30)
} //创建子弹
function caeationBillet() {
let billet = document.createElement('div')
billet.className = 'bullet'
billet.id = ObJ_billet.name + ObJ_billet.num;
document.body.appendChild(billet)
//子弹在飞机上方
billet.style.left = air.offsetLeft + air.offsetWidth / 2 + 'px'
billet.style.top = air.offsetTop - billet.offsetHeight - 1 + 'px'
//保存数据
ObJ_billet.arr[ObJ_billet.num] = billet.id + '|' + billet.offsetLeft + '|' + billet.offsetTop + '|' + '1'
//子弹运动
run_Billet(billet, ObJ_billet.num)
// 自增1
ObJ_billet.num += 1
//挡子弹有最多100个
if (ObJ_billet.num >= 100) {
ObJ_billet.num = 0;
}
} // 创建敌机
function caeationHair() {
let hair = document.createElement('div')
hair.className = 'hair'
hair.id = ObJ_Hair.name + ObJ_Hair.num;
document.body.appendChild(hair)
//飞机由上往下 left随机大小0到view宽度
let random_L = randomNum(view.offsetLeft, view.offsetLeft + view.offsetWidth - hair.offsetWidth)
hair.style.left = random_L + 'px'
hair.style.top = 0 + 'px'
ObJ_Hair.arr[ObJ_Hair.num] = hair.id + '|' + hair.offsetLeft + '|' + hair.offsetTop run_Hair(hair, ObJ_Hair.num)
// 自增1
ObJ_Hair.num += 1
//飞机有最多100个
if (ObJ_Hair.num >= 100) {
ObJ_Hair.num = 0;
}
} //生成从minNum到maxNum的随机数
function randomNum(minNum, maxNum) {
return parseInt(Math.random() * (maxNum - minNum + 1) + minNum) }
总结
BUG 有点多 效果可以实现 有点卡顿 等我调试 调试 大战BUG
JavaScript—飞机大战的更多相关文章
- javascript飞机大战-----001分析
1.游戏引擎 首先要做飞机大战要考虑的是这个游戏被分成了哪几大部分?这样我们一块一块去做,特别清晰明了.那么接下来我们就简单的分析下飞机大战分成了哪几大部分 1.游戏引擎 2.英雄机 3.敌机 4.子 ...
- javascript 飞机大战完整代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- javascript飞机大战-----0010完整版代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- javascript飞机大战-----008积分
/* 创建敌机: */ function Enemy(blood,speed,imgs,scroe){ //敌机left this.left = 0; //敌机top this.top = 0; // ...
- javascript飞机大战-----006创建敌机
先写一个敌机类 /* 创建敌机: */ function Enemy(blood,speed,imgs){ //敌机left this.left = 0; //敌机top this.top = 0; ...
- JavaScript—飞机大战2版
前面的思路对了 BUG 出在了计时器和没有加判断页面是否存在元素 <!DOCTYPE html> <html lang="en"> <head> ...
- javascript飞机大战-----009游戏结束
/* 游戏引擎 */ var Engine = { //刚开始的游戏状态 gameStatus:false, //所以敌机 enemy:{}, //子弹 bullet:{}, //得分 scroe:0 ...
- javascript飞机大战-----007爆炸效果
要检验什么时候碰撞,我们必须了解什么时候不相撞.以上四种情况是不相撞的时候 首先在引擎里面写好什么时候碰撞什么时候不碰撞 /* 游戏引擎 */ var Engine = { //刚开始的游戏状态 ga ...
- javascript飞机大战-----005创建子弹对象2
子弹销毁 /* 创建子弹:因为子弹不是只创建一个所以要用构造函数 注意一点:子弹发射的位置应该是英雄机的正中央的位置,所以需要传点东西进来 */ function Bullet(l,t){ this. ...
随机推荐
- NO6 alias-unalias命令,递归创建目录,如何取消覆盖提示
·如果需要更新补丁则执行:·yum update·yum install lrzsz telnet tree nmap nc -y·alias #查看系统现有的别名. 一.设置别名eg: ...
- Docker-harbor-V1.3.0 ”私有仓库“搭建 Easy
准备: centos 7.0 Docker version 1.12.6 docker-compose version 1.19.0 1: updata-yum: 更新yum 源 ...
- FULLTEXT INDEX全文索引
给现有的wxinfo表的sourceUrl 字段创建全文索引 ALTER TABLE wxinfo ADD FULLTEXT INDEX sourceUrl (sourceUrl) 创建全文索引前: ...
- cf 763B. Timofey and rectangles
%%题解,脑洞好大啊. 四色定理什么鬼的..所以一定是yes. 因为矩形边长都是奇数,所以可以按左下角分类,一共4类,分别1,2,3,4就可以了. (需要4种颜色的情况大概就是4个矩形围起来一个矩形) ...
- 负载均衡与CDN简介
负载均衡 负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站.应用.数据库或其他服务的性 ...
- Bean XML 配置(1)- 通过XML配置加载Bean
系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...
- CodeForces - 401C Team(简单构造)
题意:要求构造一个字符串,要求不能有连续的两个0在一起,也不能有连续的三个1在一起. 分析: 1.假设有4个0,最多能构造的长度为11011011011011,即10个1,因此若m > (n + ...
- #define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined解释
#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define 定义一个预处理宏#undef ...
- 使用IDEA打对应结构的Jar包
发布环境的内容和自己项目默认打包的样式不一样,就需要自定义打印jar包内容. 1.打开右上角项目结构 2.进行图片相关设置 3.直接进行打包,包会出现在class文件里面.解压软件解压开就是自己想要的 ...
- 关于SI4432数据手册的简单讲解
SI4432是高度集成度单芯片无线ISM收发器件.EZRadioPRO系列包括了发射机.接收机和射频收发器,让设计工程师可以有选择的设计利用里面的无线部分. SI4432提供了先进的无线功能,包括连续 ...