用Javascript模拟微信飞机大战游戏
最近微信的飞机大战非常流行,下载量非常高。
利用JS进行模拟制作了一个简单的飞机大战[此源码有很多地方可以进行重构和优化]
[此游戏中没有使用HTML5 任何浏览器都可以运行]。
效果图:

原理:利用javascript setInterval函数不停的进行元素位置的切换和添加飞机子弹,在飞机和子弹的运动中进行位置
检测,进行子弹和飞机的消失。
1、添加飞机
setInterval(function () {
var flyDiv = $('<div class="flyDiv"></div>');
flyDiv.css({left: Math.random() * 578, top: -22});
flyDiv.appendTo(main);
}, 3000);
2、添加子弹
setInterval(function () {
var flyZ = $('<span class="z"></span>');
var l = m.offset().left + 23, t = m.offset().top;
flyZ.css({left: l, top: t});
flyZ.appendTo(main);
}, 600);
3、飞机的运动
setInterval(function () {
var allDiv = main.find('div'), allZ = main.find('span');
for (var i = 0; i < allDiv.length; i++) {
var f = $(allDiv[i]);
var nowTop = f.offset().top;
nowTop += 10;
f.css({top: nowTop});
for (var j = 0; j < allZ.length; j++) {
var z = $(allZ[j]);
if (testColl(
z.offset().left, z.offset().top, z.width(), z.height(),
f.offset().left, f.offset().top, f.width(), f.height()
)) {
z.remove();
f.remove();
sum.text(parseInt(sum.text()) + 1);
}
}
if (nowTop + 22 >= 400) {
f.remove();
}
}
}, 60);
4、子弹的运动
setInterval(function () {
var allZ = main.find('span'),
allDiv = main.find('div');
for (var i = 0; i < allZ.length; i++) {
var z = $(allZ[i]);
var nowTop = z.offset().top;
nowTop -= 10;
z.css({top: nowTop});
for (var j = 0; j < allDiv.length; j++) {
var f = $(allDiv[j]);
if (testColl(
z.offset().left, z.offset().top, z.width(), z.height(),
f.offset().left, f.offset().top, f.width(), f.height()
)) {
z.remove();
f.remove();
sum.text(parseInt(sum.text()) + 1);
}
}
if (nowTop + 22 <= 0) {
z.remove();
}
}
}, 60);
5、碰撞检测
function testColl(x1, y1, w1, h1, x2, y2, w2, h2) {
var l1 = x1;
var r1 = x1 + w1;
var t1 = y1;
var b1 = y1 + h1;
var l2 = x2;
var r2 = x2 + w2;
var t2 = y2;
var b2 = y2 + h2;
if (r1 < l2 || l1 > r2 || b1 < t2 || t1 > b2) {
return false;
}
else {
return true;
}
}
【完整源码】
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/>
<title> new document </title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
#main {
width: 600px;
height: 400px;
border: solid 1px #000;
background: #cccccc;
}
.flyDiv {
width: 20px;
height: 20px;
background: red;
position: absolute;
}
.z {
display: block;
width: 4px;
background: #000000;
height: 10px;
position: absolute;
top: 390px;
}
.m {
width: 50px;
height: 50px;
background: #000000;
position: absolute;
top: 345px;
left: 275px;
}
</style>
</head>
<body>
<!-- html :begin -->
<div id="main"></div>
<div class="m" id="m"></div>
<div>
打击飞机数:<label id="sum">0</label>
</div>
<!-- html :end -->
</body>
<script src="js/jquery-1.10.2.min.js"></script>
<script>
$(document).ready(function () {
var main = $('#main'),
m = $('#m'),
sum = $('#sum');
$(document).on('keydown', function (ev) {
var oEvent = ev || window.event;
var l = m.offset().left,
t = m.offset().top;
switch (oEvent.keyCode) {
case 37:
if (l >= 0) {
l -= 12;
}
break;
/* case 38:
if (t >= 0) {
t -= 2;
}
break;*/
case 39:
if (!(l + 50 > 600)) {
l += 12;
}
break;
case 40:
if (!(t + 50 > 400)) {
t += 12;
}
break;
}
m.css({left: l, top: t});
});
setInterval(function () {
var flyDiv = $('<div class="flyDiv"></div>');
flyDiv.css({left: Math.random() * 578, top: -22});
flyDiv.appendTo(main);
}, 3000);
setInterval(function () {
var allDiv = main.find('div'), allZ = main.find('span');
for (var i = 0; i < allDiv.length; i++) {
var f = $(allDiv[i]);
var nowTop = f.offset().top;
nowTop += 10;
f.css({top: nowTop});
for (var j = 0; j < allZ.length; j++) {
var z = $(allZ[j]);
if (testColl(
z.offset().left, z.offset().top, z.width(), z.height(),
f.offset().left, f.offset().top, f.width(), f.height()
)) {
z.remove();
f.remove();
sum.text(parseInt(sum.text()) + 1);
}
}
if (nowTop + 22 >= 400) {
f.remove();
}
}
}, 60);
setInterval(function () {
var flyZ = $('<span class="z"></span>');
var l = m.offset().left + 23, t = m.offset().top;
flyZ.css({left: l, top: t});
flyZ.appendTo(main);
}, 600);
setInterval(function () {
var allZ = main.find('span'),
allDiv = main.find('div');
for (var i = 0; i < allZ.length; i++) {
var z = $(allZ[i]);
var nowTop = z.offset().top;
nowTop -= 10;
z.css({top: nowTop});
for (var j = 0; j < allDiv.length; j++) {
var f = $(allDiv[j]);
if (testColl(
z.offset().left, z.offset().top, z.width(), z.height(),
f.offset().left, f.offset().top, f.width(), f.height()
)) {
z.remove();
f.remove();
sum.text(parseInt(sum.text()) + 1);
}
}
if (nowTop + 22 <= 0) {
z.remove();
}
}
}, 60);
function testColl(x1, y1, w1, h1, x2, y2, w2, h2) {
var l1 = x1;
var r1 = x1 + w1;
var t1 = y1;
var b1 = y1 + h1;
var l2 = x2;
var r2 = x2 + w2;
var t2 = y2;
var b2 = y2 + h2;
if (r1 < l2 || l1 > r2 || b1 < t2 || t1 > b2) {
return false;
}
else {
return true;
}
}
});
</script>
</html>
用Javascript模拟微信飞机大战游戏的更多相关文章
- 用javascript写星际飞机大战游戏
在github里看到了个不错的脚本游戏,决定亲自动手来写,效果如下 下面是代码的思路分享 把整个代码理解消化确实不容易,但是如果你坚持看完相信你一定会有收获 如果没兴趣可以直接点击下面的链接 复制代码 ...
- 用Swift语言和Sprite Kit复制微信飞机大战游戏
先上GitHub链接: https://github.com/songrotek/PlaneWar.git 接下来略微解说一下! 这个程序还有点Bug,见谅! 1 说明 游戏採用了Sprite kit ...
- 用DIV+Css+Jquery 实现的旧版微信飞机大战。
用jquery 实现的旧版微信飞机大战. 以前一直都是做后台和业务逻辑,前端很少去做, 现在个小游戏. 方向键控制方向,Ctrl 键 放炸弹(当然你的有炸弹,哈哈)! 主要都是用div+Css实现的, ...
- 【一】仿微信飞机大战cocos2d-x3.0rc1
參考 [偶尔e网事] 的 [cocos2d-x入门实战]微信飞机大战 cocos2dx 2.0版本号,偶尔e网事他写的很具体,面面俱到,大家很有必要看下.能够通过以下链接跳转: cocos2d-x入 ...
- 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)
最近接触过几个版本的cocos2dx,决定每个大变动的版本都尝试一下.本实例模仿微信5.0版本中的飞机大战游戏,如图: 一.工具 1.素材:飞机大战的素材(图片.声音等)来自于网络 2.引擎:coco ...
- Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现
看到cocos2d-x推出了3.1版本号,真是每月一次新版本号,速度. 另一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!! . 视频下载 ...
- 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(下)
在飞机大战游戏开发中遇到的问题和解决方法: 1.在添加菜单时,我要添加一个有背景的菜单,需要在菜单pMenu中添加一个图片精灵,结果编译过了但是运行出错,如下图: 查了很多资料,调试了很长时间,整个人 ...
- 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)
接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 bool PlaneWarGame::init() { bool bRet = fals ...
- 11.pygame飞机大战游戏整体代码
主程序 # -*- coding: utf-8 -*- # @Time: 2022/5/20 22:26 # @Author: LiQi # @Describe: 主程序 import pygame ...
随机推荐
- 执行jar文件生成pdf报错,Unsupported URL <file:///home
java -Djava.library.path=/usr/local/lib/ruby/gems/1.8/gems/sharp_office-1.0.1/ext/sigar -jar /usr/lo ...
- Hadoop学习笔记—15.HBase框架学习(基础实践篇)
一.HBase的安装配置 1.1 伪分布模式安装 伪分布模式安装即在一台计算机上部署HBase的各个角色,HMaster.HRegionServer以及ZooKeeper都在一台计算机上来模拟. 首先 ...
- 【整理】待毕业.Net码农就业求职储备
声明:本文题目来源于互联网,仅供即将从学校毕业的.Net码农(当然,我本人也是菜逼一个)学习之用.当然,学习了这些题目不一定会拿到offer,但是针对就业求职做些针对性的准备也是不错的.此外,除了技术 ...
- 依赖倒置(DIP)与依赖注入(DI)
依赖倒置原则(Dependency Inversion Principle)为我们提供了降低模块间耦合度的一种思路,依赖注入(Dependency Injection)是一种具体的实施方法. 依赖倒置 ...
- CSS3 特效分解一
先声明下,下面的特效不是我发明的,对CSS3的创造力还不够,只是看了别人demo的源码,一点一点分析出来的.整理出的笔记,分享给大家.因为源码是好,但是一头扎进去半天出不来. 首先看个登陆框,如下,相 ...
- ES7之Decorators实现AOP示例
在上篇博文CoffeeScript实现Python装潢器中,笔者利用CoffeeScript支持的高阶函数,以及方法调用可省略括符的特性,实现了一个类似Python装潢器的日志Demo.这只是一种伪实 ...
- 2016苹果春季发布会 iPhone SE发布
配置如下 主屏尺寸:4英寸 主屏分辨率:1336x640像素 后置摄像头:1200万像素 前置摄像头:120万像素 电池容量:1624mAh 核心数:双核 操作系统:iOS 9 核心数:双核 CPU: ...
- sleep和wait区别
1. sleep和wait都是用来进行线程控制,他们最大本质的区别是: sleep()不释放同步锁,wait()释放同步锁. sleep(milliseconds)可以用时 ...
- Intellij IDEA 13.1.3 打开多个窗口项目
作者QQ:1095737364 Intellij 是Java开发人员最喜欢的编程工具.默认情况只能打开一个窗口一个项目,本文就是教大家打开多个窗口,实现同时打开多个项目 第一步:打开Intellij, ...
- 前段播放 流媒体(RTMP,RTSP,HLS)
前言 最近项目需要流媒体的播放,后端一共提供了 三种流数据(RTSP,RTMP,HLS),在不同的场景可能会使用到不同方式播放,就需要做到适配, 支持所有的流数据播放.花了一段时间研究,在这里和大家分 ...