[知了堂学习笔记]_纯JS制作《飞机大战》游戏_第3讲(逻辑方法的实现)
整体展示:

上一讲实现了诸多对象,这次我们就需要实现许多逻辑方法,如控制飞机移动,判断子弹击中敌机,敌机与英雄飞机相撞等等。并且我们在实现这些功能的时候需要计时器去调用这些方法。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讲(逻辑方法的实现)的更多相关文章
- [知了堂学习笔记]_纯JS制作《飞机大战》游戏_第1讲(实现思路与游戏界面的实现)
整体效果展示: 一.实现思路 如图,这是我完成该项目的一个逻辑图,也是一个功能模块完成的顺序图. 游戏界面的完成 英雄飞机对象实现,在实现发射子弹方法过程中,又引出了子弹对象并实现.在此时,英雄飞机能 ...
- 【知了堂学习笔记】java 自定义异常
java 常见异常种类(Java Exception): 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCas ...
- [知了堂学习笔记]_纯JS制作《飞机大战》游戏_第2讲(对象的实现及全局变量的定义)
整体展示: 一.全局变量 /*===================玩家参数==========================*/ var myPlane; //英雄对象 var leftbtn = ...
- [知了堂学习笔记]_牵线Eclipse和Tomcat第二篇 —— 安装Tomcat&&添加Tomcat到Eclipse
来了来了~~~~~我们的"织女"--Tomcat来了,牛郎们等急了吧!哈哈! 一.安装Tomcat 下载地址:http://tomcat.apache.org/download-7 ...
- [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量&&安装eclipse
一.先给他们提供一个"浪漫的"环境,比如传说中的"鹊桥"--java环境变量.哈哈! 配置java环境变量. 下载jdk,根据自己电脑的版本和操作位数选择不同的 ...
- [知了堂学习笔记]_ajax的两种使用方式
一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...
- 【知了堂学习笔记】java web 简单的登录
最近皮皮潇在学习java web,刚接触了简单的东西,所以今天给大家带来一个简单的登录实现. 页面: 页面代码: <%@ page language="java" conte ...
- [知了堂学习笔记]_JSON数据操作第1讲(初识JSON)
一.认识JSON 什么是JSON? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式..它基于 ECMAScript (w3c制定的js规 ...
- 【知了堂学习笔记】java 编写几种常见排序算法2
排序的分类: 1.直接选择排序 它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~ ...
随机推荐
- NOIP模拟:能源(二分答案)
题目描述 小美为了拯救世界能源危机,她准备了 n 台蓄电池.一开始每台蓄电池有 ai 个单位的能量. 现在她想把 n 台蓄电池调整到能量相同.对于每台蓄电池可以给另一台蓄电池传递能量.但是会有能量损耗 ...
- 一些重要 Docker 命令的简单介绍
1. 拉取 Docker 镜像 由于容器是由 Docker 镜像构建的,首先我们需要拉取一个 docker 镜像来开始.我们可以从 Docker Registry Hub 获取所需的 docker 镜 ...
- Jenkins2 插件 Pipeline+BlueOcean 实现持续交付的初次演练
需要完成的目标 使用Pipeline完成项目的checkout,package.deploy.restart 提取出公有部分封装为公有JOB 实现pipeline对其他JOB的调用和逻辑的判断 实现任 ...
- (转)硬盘分区备忘(主分区,扩展分区和逻辑分区)以及Linux硬盘分区工具parted 介绍
场景:最近在学习Linux的基础知识,不可避免的设计到Linux的磁盘分区,以前做过总结,但是那种总结就是复制别人的文章,总结完就不想看第二遍,所以很容易就遗忘了!清楚明白的理解分区后,我就可以在自己 ...
- phpunit实践笔记
phpunit成为单元测试的代名词已成为共识, 但很多在实际编写测试过程中遇到的很多问题通过手册.网上搜索都很难找到相关资料, 大部分都得通过查看源代码和实践的代码经验解决.欢迎大家拍砖.(在此之前请 ...
- HDU1027 Ignatius and the Princess II
Problem Description Now our hero finds the door to the BEelzebub feng5166. He opens the door and fin ...
- 初学 Python(十四)——生成器
初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...
- javascript事件循环机制 浅尝手记
引入 众所周知Javascript是一个单线程的机制,虽然可以依托多线程的浏览器实现页面如何实现页面复杂的渲染.事件响应,但仍不会改变其单线程的本质:所以对于js的事件循环机制的了解是一个前端人员的必 ...
- NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )
郁闷的C小加(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...
- Fluent Validation with Web Api 2
using FluentValidation;using FluentValidation.Attributes;using System;using System.Collections.Gener ...