整体展示:

上一讲实现了诸多对象,这次我们就需要实现许多逻辑方法,如控制飞机移动,判断子弹击中敌机,敌机与英雄飞机相撞等等。并且我们在实现这些功能的时候需要计时器去调用这些方法。setInterval(fun,ms)

在调用setInterval()会返回一个类似id的字段,该字段在clearInterval(id)可以指定相应的计时器并清除

一、开始游戏

/**
* 面板441*632
* 飞机 66*80
*/
/**
* 开始游戏
*/
function startGame() {
var welcome = document.getElementById("welcome"); myPlane = new createPlane("img/own.png", 190, 550, 5, 5);
welcome.style.visibility = "hidden"; //将进入欢迎界面隐藏
// ctrlMove();
/*
* 启动定时器
*/
ctrlmove = setInterval(ctrlMove,20);
ctrlshot = setInterval(ctrlShot,200);
bulletfly = setInterval(bulletFly,20);
createenemy = setInterval(enemy,200);
enemymove = setInterval(enemyMove,20);
hitplane = setInterval(hitPlane,30);
exist = setInterval(isexist,20);
}

二、控制英雄飞机移动

/*
* 键盘监听,用于判断英雄的动作 wasd移动方向,j射击,k必杀
* 放在开始游戏方法中
*/
document.body.onkeydown = function(code){
if(code.keyCode == 65){
leftbtn = true;
}
if(code.keyCode == 68){
rightbtn = true;
}
if(code.keyCode == 87){
topbtn = true;
}
if(code.keyCode == 83){
bottombtn = true;
}
if(code.keyCode == 74){
shot = true;
}
if(code.keyCode == 75){
shotboom = true;
}
}
document.body.onkeyup=function(code){
if(code.keyCode==65){
leftbtn=false;
}
if(code.keyCode == 68){
rightbtn = false;
}
if(code.keyCode == 87){
topbtn = false;
}
if(code.keyCode == 83){
bottombtn = false;
}
if(code.keyCode == 74){
shot = false;
}
if(code.keyCode == 75){
shotboom = false;
}
}
/**
* 控制英雄移动的函数
*/
function ctrlMove(){
if(leftbtn==true){
myPlane.leftMove()
}
if(rightbtn==true){
myPlane.rightMove()
}
if(topbtn==true){
myPlane.topMove()
}
if(bottombtn==true){
myPlane.botoomMove()
}
//获取玩家参数
getInfo();
}

三、子弹击中对象

/**
* 子弹击中对象
*/
function hitPlane(){
/*
* 英雄子弹打中敌机
*/
for(i=0;i<bulletList.length;i++){ //遍历英雄子弹集合
for(j=0;j<enemyList.length;j++){ //遍历敌军集合
//获取子弹坐标和敌军坐标
var btop = parseInt(bulletList[i].bulletNode.style.top);
var bleft = parseInt(bulletList[i].bulletNode.style.left);
var etop = parseInt(enemyList[j].enemyNode.style.top);
var eleft = parseInt(enemyList[j].enemyNode.style.left);
if(!enemyList[j].isdead){
if(bleft>=eleft-5&&bleft<eleft+34&&btop>etop&&btop<etop+34){
bulletList[i].ishit=true; //击中把子弹状态改为true
if(--enemyList[j].blood<=0) //判断敌军是否死亡
enemyList[j].isdead=true;
}
}
}
}
/*
* boos子弹打中英雄
*/
var top = parseInt(myPlane.planeNode.style.top);
var left = parseInt(myPlane.planeNode.style.left);
for(i=0;i<boosBullet.length;i++){
var btop = parseInt(boosBullet[i].bulletNode.style.top);
var bleft = parseInt(boosBullet[i].bulletNode.style.left);
if(myPlane.blood>=0){
if(btop+55>=top&&btop<top+80&&bleft>=left-22&&bleft<left+40){
boosBullet[i].ishit=true;
myPlane.blood--;
}
}
} /**
*子弹打中BOOS
*/
for(i=0;i<bulletList.length;i++){
var btop = parseInt(bulletList[i].bulletNode.style.top);
var bleft = parseInt(bulletList[i].bulletNode.style.left);
for(j=0;j<boosList.length;j++){
var top=parseInt(boosList[j].enemyNode.style.top);
var left=parseInt(boosList[j].enemyNode.style.left);
if(!boosList[j].isdead){
if(bleft-5>=left&&bleft<left+90&&btop>=top&&btop<top+80){
console.log(boosList[j].blood)
bulletList[i].ishit=true;
if(--boosList[j].blood<=0)
boosList[j].isdead=true;
}
}
}
}
}

四、对象间碰撞

/**
* 对象相撞
*/
function strike(){
var mleft = parseInt(myPlane.planeNode.style.left);
var mtop = parseInt(myPlane.planeNode.style.top);
if(myPlane.blood>0){
for(i=0;i<enemyList.length;i++){ //遍历敌机
if(!enemyList[i].isdead){ //敌机是否死亡
var eleft = parseInt(enemyList[i].enemyNode.style.left);
var etop = parseInt(enemyList[i].enemyNode.style.top);
if(eleft>=mleft&&eleft<mleft+68&&etop>=mtop&&etop<mtop+80){ //碰撞判断
enemyList[i].isdead = true; //敌机一碰撞到英雄飞机立即死亡
enemyList[i].enemyNode.src ="img/enemybz.png"; //切换图片,制作爆炸特效
myPlane.blood--; //英雄血量减少
}
}
}
}
/*
* 得到道具
*/
if(myPlane.blood>0){ //判断英雄是否死亡
for(i=0;i<toolList.length;i++){ //遍历道具数组
if(!toolList[i].getme){
var tleft = parseInt(toolList[i].toolNode.style.left);
var ttop = parseInt(toolList[i].toolNode.style.top);
if(tleft>=mleft-15&&tleft<mleft+65&&ttop>=mtop&&ttop<mtop+80){
toolList[i].getme=true;
if(toolList[i].tooltype%2==1){ //tooltype单数为加必杀,双数为加血
if(myPlane.boom<5)
myPlane.boom++;
}else{
myPlane.blood++;
}
}
}
}
}
}

五、判断对象是否死亡

/*
* 判断对象是否存在
*/
function isexist(){
/*
* 判断敌机是否死亡
*/
for(i=0;i<enemyList.length;i++){
if(enemyList[i].isdead){ //敌机死亡
enemyList[i].enemyNode.src ="img/enemybz.png"; //将图片换成爆炸图片
if(enemyList[i].deadtime>=0){ //移除时间,也就是飞机死亡到移除的时间,实现爆炸的特效
enemyList[i].deadtime--;
}else{
score+=myPlane.level;
killNum++;
mainobj.removeChild(enemyList[i].enemyNode); //先移除节点
enemyList.splice(i,1); //再取消绑定
}
}
}
/*
* 判断英雄是否死亡
*/
if(myPlane.blood<=0){
mainobj.removeChild(myPlane.planeNode);
gameOver();
}
/*
* 判断boos是否死亡
*/
for(i=0;i<boosList.length;i++){
if(boosList[i].isdead){
if(boosList[i].deadtime<=0){
mainobj.removeChild(boosList[i].enemyNode)
boosList.splice(i,1);
score+=100*myPlane.level;
pass++;
nextGame();
}else{
boosList[i].deadtime--;
boosList[i].enemyNode.src="img/dfjbz.png";
}
}
}
/*
* 判断道具是否存在
*/ for(i=0;i<toolList.length;i++){
if(toolList[i].getme){
mainobj.removeChild(toolList[i].toolNode);
toolList.splice(i,1);
}
}
}

===============================================================================================================================

第二讲补充:

我在创建对象时候(除英雄飞机对象),都将其放进Arrar中,这是为了绑定该对象,为了方面找到这个对象。方便操作。

以上为今天的内容,如需了解更加深入的知识,请大家进入知了堂社区:http://www.zhiliaotang.com/portal.php;

[知了堂学习笔记]_纯JS制作《飞机大战》游戏_第3讲(逻辑方法的实现)的更多相关文章

  1. [知了堂学习笔记]_纯JS制作《飞机大战》游戏_第1讲(实现思路与游戏界面的实现)

    整体效果展示: 一.实现思路 如图,这是我完成该项目的一个逻辑图,也是一个功能模块完成的顺序图. 游戏界面的完成 英雄飞机对象实现,在实现发射子弹方法过程中,又引出了子弹对象并实现.在此时,英雄飞机能 ...

  2. 【知了堂学习笔记】java 自定义异常

    java 常见异常种类(Java Exception): 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCas ...

  3. [知了堂学习笔记]_纯JS制作《飞机大战》游戏_第2讲(对象的实现及全局变量的定义)

    整体展示: 一.全局变量 /*===================玩家参数==========================*/ var myPlane; //英雄对象 var leftbtn = ...

  4. [知了堂学习笔记]_牵线Eclipse和Tomcat第二篇 —— 安装Tomcat&&添加Tomcat到Eclipse

    来了来了~~~~~我们的"织女"--Tomcat来了,牛郎们等急了吧!哈哈! 一.安装Tomcat 下载地址:http://tomcat.apache.org/download-7 ...

  5. [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量&&安装eclipse

    一.先给他们提供一个"浪漫的"环境,比如传说中的"鹊桥"--java环境变量.哈哈! 配置java环境变量. 下载jdk,根据自己电脑的版本和操作位数选择不同的 ...

  6. [知了堂学习笔记]_ajax的两种使用方式

    一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...

  7. 【知了堂学习笔记】java web 简单的登录

    最近皮皮潇在学习java web,刚接触了简单的东西,所以今天给大家带来一个简单的登录实现. 页面: 页面代码: <%@ page language="java" conte ...

  8. [知了堂学习笔记]_JSON数据操作第1讲(初识JSON)

    一.认识JSON 什么是JSON? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式..它基于 ECMAScript (w3c制定的js规 ...

  9. 【知了堂学习笔记】java 编写几种常见排序算法2

    排序的分类: 1.直接选择排序 它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~ ...

随机推荐

  1. GIT - 代码管理工具之命令集

    GIT 是一个快速.可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问.它会把你的每次提交的文件的全部内容都会记录下来. GIT特点 速度 简单的设计 对非线性开发 ...

  2. C#中的Infinity和NaN

    C#中double和float类型有两个特殊值: Infinity(无穷大):5.0 / 0.0 = Infinity NaN(not a number):0.0 / 0.0 = NaN 计算表达式 ...

  3. (转)JAVA反射机制理解

    JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...

  4. (转)java for循环的执行顺序和几种常用写法

    算是温习吧.问题比较基础,但是也比较重要.(虽然是C,但是很经典) for循环可以说在每个程序中都少不了的,语句头包括三个部分:初始化,判读条件,一个表达式. 但是这三个部分的执行顺序是什么,这是我们 ...

  5. (转载)Windows 上搭建Apache FtpServer

    因工作需要,最近经常接触到FTP,今天我来介绍一个开源的FTP服务器,那就是Apache FTPServer,Apache FTPServer是一个100%纯Java的FTP服务器. 它的设计是基于现 ...

  6. Android高效内存之让你的图片省内存

    Android高效内存之让你的图片省内存 在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用.而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存占用可 ...

  7. Yii框架用ajax提交表单时候报错Bad Request (#400): Unable to verify your data submission.

    提交表单报400错误,提示 "您提交的数据无法验证"原来是csrf验证的问题,因为表单是自己写的,在Yii框架中,为了防止csrf攻击,对post的表单数据封装了CSRF令牌验证. ...

  8. 日常API之QQ登录

    这次的QQ登录我研究了好久惹,今天终于可以和大家分享啦! 大家都知道,QQ登录有很多方法,例如使用账号密码登录,手机版企鹅扫码登录等等(这些方法只能验证QQ是否成功登录,并没有聊天等功能) 首先就来使 ...

  9. 有时在UIWindow上添加遮罩层不成功的原因

    程序启动后,初始化window,初始化controller,加载试图,这三个方法的顺序是嵌套的 类似于: - (id) initWindow {[self initController];} 而我在i ...

  10. ida和idr机制分析(盘符分配机制)

    # ida和idr机制分析 ida和idr的机制在我个人看来,是内核管理整数资源的一种方法.在内核中,许多地方都用到了该结构(例如class的id,disk的id),更直观的说,硬盘的sda到sdz的 ...