用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 ...
随机推荐
- c#解析XML到DATASET及dataset转为xml文件函数
//将xml对象内容字符串转换为DataSet public static DataSet ConvertXMLToDataSet(string xmlData) { ...
- libreoffice转换文件为pdf文件乱码问题解决办法
最近系统需要一个office文件预览功能 解决方案为使用libreoffice将office文件转换为pdf文件,然后使用swftools将pdf文件转换为swf文件 最后在前台使用flexpaper ...
- PHP的日期和时间处理函数
1. 将日期和时间转变为时间戳 1.1 time() 原型:time(void) 作用:返回当前时间的 UNIX时间戳. 参数:void,可选(即无参数) 1.2 mktime() 原型:int mk ...
- 为什么使用Binder而不是其他IPC机制
本文搬运自:Advantages of using Binder for IPC in Android 使用Binder而不是其他(Semaphores , Message Queue, PIPES) ...
- 记录Office Add-in开发经验
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 得益于微软系强大的共通能力和Visual Studio的开发支持,做Office插件不是什么难事.一点经验记录如下 ...
- 备忘-Sql server Timeout expired 超时时间已到. 达到了最大池大小 错误及Max Pool Size设置
select * from sysprocesses where dbid= db_id('数据库名') 通过此语句可查看目前所有的连接进程 不够了就必须设置Max Pool Size,理论最大值为3 ...
- [大数据之Sqoop] —— 什么是Sqoop?
介绍 sqoop是一款用于hadoop和关系型数据库之间数据导入导出的工具.你可以通过sqoop把数据从数据库(比如mysql,oracle)导入到hdfs中:也可以把数据从hdfs中导出到关系型数据 ...
- Java程序员的日常—— FileUtils工具类的使用
package cn.xingoo.learn.commons; import org.apache.commons.io.FileUtils; import org.apache.commons.i ...
- AngularJS移动开发中的各种坑
捂脸,辛酸泪ing...... 本文主要涉及部分在移动设备上特有的问题. 相对来说,Jquery侧重DOM操作,AngularJS是以视图模型和双向绑定为核心的. DOM操作的问题 避免使用 jQue ...
- 实战MEF(5):导出元数据
如何理解元数 我们可以把元数据理解为随类型一起导出的附加信息.有时候我们会考虑,把元数据随类型一并导出,增加一些说明,使得我们在导入的时候,可以多一些筛选条件. 默认的类型导出带有元数据吗 上面的内容 ...