[知了堂学习笔记]_用JS制作《飞机大作战》游戏_第3讲(玩家发射子弹)
一、公布上一讲中玩家飞机上、下、右移动实现的代码:
/*=========================键盘按下事件 keycode为得到键盘相应键对应的数字====================*/
document.body.onkeydown=function(code) {
if(code.keyCode==37) {
//当键盘按下的是左键(对应的数字是37)
leftbtn=true; //
}
if(code.keyCode==38) {
//键盘按的是上键
topbtn=true;
}
if(code.keyCode==39) {
//右键
rightbtn=true;
}
if(code.keyCode==40) {
//下键
buttombtn=true;
}
if(code.keyCode==65 || code.keyCode==32) {
//按下A键 或空格 子弹发射状态改变(发射)
shutbtn=true;
}
}
/*==================================根据键盘按的键,改变相应的状态=======================*/
document.body.onkeyup=function(code) {
if(code.keyCode==37) {
leftbtn=false;
}
if(code.keyCode==38) {
//键盘按的是上键
topbtn=false;
}
if(code.keyCode==39) {
//右移动
rightbtn=false;
}
if(code.keyCode==40) {
//下移动
buttombtn=false;
}
if(code.keyCode==65 || code.keyCode==32) {
//按下A键 或空格 子弹发射状态改变(停止发射)
shutbtn=false;
}
} } /*=====================================操作飞机移动的方向(上下左右)==========================*/
function ctrlplane() {
if(leftbtn==true) {
myplane.leftmove(); //调用飞机左移动的方法
}
if(rightbtn==true) {
myplane.rightmove();
}
if(topbtn==true) {
myplane.topmove();
}
if(buttombtn==true) {
myplane.buttommove();
}
}
以下代码我是放入JS文件中的
var mainobj = document.getElementById("main"); //获取游戏界面的div
/*===============玩家飞机对象属性的声明==================*/
var myplane; //声明飞机对象
var leftbtn = false; //判断是否左移方向键
var rightbtn = false; //判断是否右移方向键
var topbtn = false; //判断是否上移方向键
var buttombtn = false; //判断是否下移方向键 /*===================监听器==================*/
var ctrlplanestop; /*==================创建玩家飞机对象========================*/
function createPlayerPlance(imgsrc, x, y, blood, speed) {
this.imageSrc = imgsrc; //当前飞机图片的地址为实例化该方法传入的图片地址
this.x = x;//当前飞机的X轴坐标为传入的X轴坐标
this.y = y;//当前飞机的Y轴坐标为传入的y轴坐标
this.blood = blood;//飞机的当前血量为传入的血量
this.monvspeed = speed; //当前飞机的移动速度为实例化该方法传入的移动速度
this.level = 1; //设定玩家飞机等级,实现后续的升级功能
this.wfjdead = false; //我方飞机的状态 为false的时候 飞机没有被击中
this.wfjdeadtime = 10; //控制我方飞机被击中产生的爆炸效果消失时间
this.planeNode = document.createElement("img"); //创建飞机图片对象节点 /*飞机向左移动*/
this.leftmove = function() {
//当飞机超过大DIV80PX时(飞机图片的宽度就是80px)飞机从右边进入
if(this.planeNode.style.left == "-80px") { //如果飞机图片往左移动刚好离开游戏界面
this.planeNode.style.left = "440px"; //飞机图片从游戏界面右边进入
} else {
//当飞机没有达到临界点时,飞机每移动一次后的坐标为:当前的坐标减去移动速度的距离(PX)
this.planeNode.style.left = parseInt(this.planeNode.style.left) - this.monvspeed + "px";
}
}
/*飞机向右移动*/
this.rightmove = function() {
if(this.planeNode.style.left == "440px") { //如果飞机图片往右移动刚好离开游戏界面
this.planeNode.style.left = "-80px";
} else {
this.planeNode.style.left = parseInt(this.planeNode.style.left) + this.monvspeed + "px";
}
}
/*飞机向上移动*/
this.topmove = function() {
if(this.planeNode.style.top == "0px") {
this.planeNode.style.top = "0px";
} else {
this.planeNode.style.top = parseInt(this.planeNode.style.top) - this.monvspeed + "px";
}
}
this.buttommove = function() {
if(this.planeNode.style.top == "600px") {
this.planeNode.style.top = "600px"
} else {
this.planeNode.style.top = parseInt(this.planeNode.style.top) + this.monvspeed + "px";
}
}
/* 定义飞机的样式参数 */
this.create = function() {
this.planeNode.src = this.imageSrc;
this.planeNode.style.position = "absolute";
this.planeNode.style.left = this.x + "px";
this.planeNode.style.top = this.y + "px";
this.planeNode.style.zIndex = "6"; //节点显示在第6层
mainobj.appendChild(this.planeNode); //把当前的飞机对象作为节点放在主界面中
}
this.create(); //创建飞机的DOM对象 (调用飞机样式参数方法) }
一、玩家飞机发射子弹
(一)实现思路
1、先建立子弹对象,子弹对象也具备以下属性:
子弹图片、子弹坐标(X轴、Y轴)、子弹速度、子弹的状态(是否消失)
2、把建立的对象以节点方式添加到游戏界面上
3、定义自己的运行轨迹
4、构建子弹设计方法(实例化子弹对象)
5、定义触发和结束发射子弹的时间判断onkeydown、onkeyup
6、在开始游戏方法中使用子弹移动、子弹创建监听器
(二)构建子弹对象和定义子弹的运行轨迹(子弹运行轨迹属于子弹对象的,方法应定义在子弹对象中)
/*===========子弹图片路径,子弹x轴,y轴,速度================*/
function createbullet(bulletsrc, x, y, speed) {
this.bulletsrc = bulletsrc; //定义子弹的图片属性(子弹图片的路径)
this.x = x; //定义子弹飞行的X轴坐标
this.y = y;
this.bullernode = document.createElement("img"); //创建一个图片节点
this.btstate = true; //定义子弹没有击中地方飞机的状态
this.speed = speed; //子弹的飞行速度
//定义子弹图片节点的属性,并将图片节点放入游戏界面
this.create = function() {
this.bullernode.src = this.bulletsrc;
this.bullernode.style.position = "absolute";
this.bullernode.style.left = this.x + "px";
this.bullernode.style.top = this.y + "px";
mainobj.appendChild(this.bullernode); //向大的DIV下添加子弹节点
} //定义子弹运行的轨迹
this.move = function() {
this.bullernode.style.top = parseInt(this.bullernode.style.top) - this.speed + "px";
}
//在创建子弹对象的时候就把子弹显示在游戏界面上
this.create();
}
(三)定义发射子弹方法并实例化子弹对象(该功能是属于飞机对象的,需要定义在飞机方法内部)
以下定义的数组是全局变量,要放在定义飞机方法外部,飞机发射的子弹不止一颗 所有需要将子弹存放在数组中
var bulletlist = new Array(); //存储我方飞机子弹的数组列表 //定义发射子弹的方法 并实例化子弹对象
this.shot = function() {
//调用子弹对象 定义的两个变量 说明飞机可以同时发射两列子弹
var bullet1 = new createbullet("../img/bullet1.png", parseInt(this.planeNode.style.left) + 35, parseInt(this.planeNode.style.top) + 12, 2);
var bullet2 = new createbullet("../img/bullet1.png", parseInt(this.planeNode.style.left) - 5, parseInt(this.planeNode.style.top) + 12, 2);
//把子弹存放在集合中
bulletlist.push(bullet1);
bulletlist.push(bullet2);
}
(四)设置键盘事件,按下相应按钮,改变状态,触发子弹设计方法,松开按钮,停止发射子弹
键盘按下的点击事件 shutbtn的状态是为了触发射击方法用的
document.body.onkeydown=function(code) {
if(code.keyCode==65 || code.keyCode==32) {
//按下A键 或空格 子弹发射状态改变(发射)
shutbtn=true;
}
}
键盘松开的点击事件
/*==================================根据键盘按的键,改变相应的状态=======================*/
document.body.onkeyup=function(code) { if(code.keyCode==65 || code.keyCode==32) {
//按下A键 或空格 子弹发射状态改变(停止发射)
shutbtn=false;
}
} //通过以上的键盘事件,根据判断定义的shutbtn值,进行调用飞机射击子弹方法
function bulletspeed() {
if(shutbtn==true) {
//判断按下A键或空格时启动上弹夹
/*//加载飞机移动的声音
var shutmusic = document.getElementById("");
shutmusic.play();*/
//调用JS文件中飞机上弹夹的方法
myplane.shot();
}
}
(四)定义当子弹移除游戏界面时,清除子弹的节点,并将子弹对象从数组中移除,当子弹状态为死亡时也删除节点,状态为活着的时候,子弹飞行
/*====================================我方飞机子弹飞行方法 ======================*/
function bulletfly() {
for(var i=0;
i < bulletlist.length;
i++) {
//如果弹夹中的子弹没有击中敌方飞机
if(bulletlist[i].btstate==true) {
//调用子弹节点移动方法 让子弹移动
bulletlist[i].move();
//如果当子弹移出游戏界面时
if(parseInt(bulletlist[i].bullernode.style.top) <=0) {
//移除游戏界面节点下的子节点(子弹节点)
mainobj.removeChild(bulletlist[i].bullernode);
//移除弹夹中的子弹
bulletlist.splice(i, 1); //i为下标,1为移除的数量
}
}
//如果子弹击中敌方飞机时
else {
//移除子弹节点
mainobj.removeChild(bulletlist[i].bullernode);
//移除弹夹中的子弹
bulletlist.splice(i, 1); //i为下标,1为移除的数量
}
}
}
(四)在开始游戏中使用监听器(注意先设置函数的全局变量)
1、 调用判断是否触发射击子弹的方法(bulletspeed)
2、判断子弹是否移除游戏界面和死亡的方法(bulletfly)


(五)注意事项:
在HTML文件中要记着引入另一文件中的JS文件路径

(六)实现效果:

以上是我这讲的主要内容,下一讲将为大家讲解创建敌方飞机、敌方飞机被玩家子弹击中死亡。若以上知识点讲解的不够仔细的请各位大神多多包涵和指正,需要学习更多关于软件知识的博友可以关注后面部分博客
[知了堂学习笔记]_用JS制作《飞机大作战》游戏_第3讲(玩家发射子弹)的更多相关文章
- [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第2讲(四大界面之间的跳转与玩家飞机的移动)
一.通过点击按钮事件,实现四大界面之间的跳转: (一)跳转的思路: 1.打开软件,只显示登录界面(隐藏游戏界面.暂停界面.玩家死亡界面) 2.点击微信登录(QQ登录)跳转到游戏界面,隐藏登录界面 3. ...
- 【知了堂学习笔记】java 自定义异常
java 常见异常种类(Java Exception): 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCas ...
- [知了堂学习笔记]_纯JS制作《飞机大战》游戏_第3讲(逻辑方法的实现)
整体展示: 上一讲实现了诸多对象,这次我们就需要实现许多逻辑方法,如控制飞机移动,判断子弹击中敌机,敌机与英雄飞机相撞等等.并且我们在实现这些功能的时候需要计时器去调用这些方法.setInterval ...
- [知了堂学习笔记]_纯JS制作《飞机大战》游戏_第1讲(实现思路与游戏界面的实现)
整体效果展示: 一.实现思路 如图,这是我完成该项目的一个逻辑图,也是一个功能模块完成的顺序图. 游戏界面的完成 英雄飞机对象实现,在实现发射子弹方法过程中,又引出了子弹对象并实现.在此时,英雄飞机能 ...
- [知了堂学习笔记]_纯JS制作《飞机大战》游戏_第2讲(对象的实现及全局变量的定义)
整体展示: 一.全局变量 /*===================玩家参数==========================*/ var myPlane; //英雄对象 var leftbtn = ...
- [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)
一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...
- [知了堂学习笔记]_牵线Eclipse和Tomcat第二篇 —— 安装Tomcat&&添加Tomcat到Eclipse
来了来了~~~~~我们的"织女"--Tomcat来了,牛郎们等急了吧!哈哈! 一.安装Tomcat 下载地址:http://tomcat.apache.org/download-7 ...
- [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量&&安装eclipse
一.先给他们提供一个"浪漫的"环境,比如传说中的"鹊桥"--java环境变量.哈哈! 配置java环境变量. 下载jdk,根据自己电脑的版本和操作位数选择不同的 ...
- [知了堂学习笔记]_ajax的两种使用方式
一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...
随机推荐
- 在ThinkPHP中使用常量解决路由常规地址不安全传送数据问题
在ThinkPHP搭建项目的同时,会考虑到后期对静态页面的维护问题, 在项目的不断完善的同时,会有大量图片,css文件,以及js文件等一些容易修改.添加.或者删除的资源 如果在中后期对各个静态页面,j ...
- ##5.2 Nova计算节点-- openstack pike
##5.2 Nova计算节点 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##5.2 Nova计算节点 # co ...
- python使用rsa库做公钥解密(网上别处找不到)
使用RSA公钥解密,用openssl命令就是openssl rsautl -verify -in cipher_text -inkey public.pem -pubin -out clear_tex ...
- sqlserver 全库查询 带架构
网上现有的全库查询,无法识别自定义架构的数据库结构: ) ) ) declare @counts int )--以上定义变量 declare cur1 cursor for select a.name ...
- springMVC(1)---获取前段数据
springMVC(1)---获取前段数据 首先说明,如果你学过Struts2,那么在学springMVC就会简单很多,我也不最基础的开始写了,我前篇文章搭建了个ssm框架,算是springmvc入门 ...
- Git 二分调试法,火速定位疑难Bug!
你一定遇到过,一个很久没修改过的功能,莫名其妙的出现了问题?肉眼查代码.屡逻辑完全找不到问题点?前两天还好好的功能,怎么这个今天就不行了?这两天改动了这么多代码,到底是那一次改动引发的 Bug? 这样 ...
- python 初学之账户登录
要求: 输入用户名密码正确,提示登录成功, 输入三次密码错误,锁定账户. 开始: 使用两个文件: 密码账户文件 文件格式: jason 23456 tom 56789 tang ...
- Android-Dalvik指令集
转载请标明出处:http://blog.csdn.net/goldenfish1919/article/details/40821777 原文:http://pallergabor.uw.hu/and ...
- cocos2dx-3.0(14)------SpriteBatchNode与SpriteFrameCache加快渲染
----我的生活,我的点点滴滴! ! 大家都知道一个游戏里面会有大量的图片.每一个图片渲染是须要时间的,以下分析两个类来加快渲染速度.加快游戏执行速度 一.SpriteBatchNode 1.先说下渲 ...
- 在Visual Studio Code中开发Office Add-in
作者:陈希章 发表于 2017年7月13日 上一篇 我介绍了如何在Visual Studio中开发Office Add-in,因为有标准的项目模板,一系列配套的工具,尤其是自带的一键调试功能,可以让开 ...