[Java教程]坦克大战(一)

0

2016-09-16 08:00:05

坦克大战(一)

相信大家对坦克大战都不陌生,并且网上也有很多用java实现的小程序,最近用了几天时间将其使用javaScript语言通过面向对象的方式实现,在实现的过程中吸收了很多新的知识,现在趁着程序即将完成之际将其记录下来。

废话不多说,先上程序源码:https://github.com/safemen/TankGame2.0.git

项目需求

在写程序之前,我们需要先大体的了解一下项目的一些需求和注意事项,方便以后的开发。

程序在运行之前会有从下到上的开场动画,然后鼠标点击选择游戏的人数,游戏在进入每一个关卡之前会有第几关的提示,进入游戏后,玩家通过键盘操纵坦克移动,转弯,射击,与敌人交战,直到消灭所有的敌人就算过关。

开发过程

HTML

因为本程序的HTML结构比较简单,所以在此就不多加赘述,只是在引入js文件的时候,需要注意一下引入的顺序即可。

CSS

在css中需要根据精灵图来分配每个小型单位的样式,需要注意的是因为有些图片的缺失使用了一部分css3做出了动画效果来表现为特殊坦克。

javaScript

本程序以javaScript为主,下面我将以在本程序开发中javaScript的编写顺序来讲述一下大体的思路。

在程序中我们会有一个游戏控制构造函数来进行游戏的总体控制,它在其中重要的是使用定时器来控制游戏的更新,也就是我们所做的所有活动都需要定时器来更新。

我们需要define文件保存一些常用的数据,有兴趣的可以自己重新测量一遍,但我感觉没有必要,因为我感觉写一个或者学习一个程序还是以逻辑为主,很多无必要的工作能不做就不做。而mapData中则保存的是我们的地图数据,我们可以对其进行自由的拓展。在core中我们主要保存了一些常用的方法,方便在其他的js调用。

根据我的设计思路是首先将地图构造函数即Map.class.js设计出来,再设计物体构造函数Object.class.js,而其他的所有的对象都会派生自物体构造函数,所以这就需要我们对其他的对象进行一下公有属性和公有方法的提取,再依次设计其他对象的具体构造函数,后面再依次介绍。

首先我们们讲一下地图构造函数的大致思路:function Map(oParent, oRight, level) { this.oParent = oParent; this.oRight = oRight; this.level = level; this.eMapLevel = []; //地图数组 this.eMapLength = 0; //地图数组的长度 this.mapEnemyType = []; // 保存敌方坦克的出场顺序 this.lairEnclosure = []; //保存老巢的围墙 this.obstacle = []; //保存所有障碍物}

因为我们需要对DOM进行操作,所以我们需要写一个创建节点的方法,如下Map.prototype.createElem = function (sElem, sClass, sId) { var oElem = document.createElement(sElem); if (sClass) { oElem.className = sClass; } if (sId) { oElem.id = sId; } return oElem; }

当我们要对地图初始化时,需要调用initMap方法Map.prototype.initMap = function () { this.initLevel(); this.initLeftMap(); };

它需要获取地图数据,并保存到相关的变量中,提前获取地图数组的长度,可以在遍历数组的时候不再重复的获取消耗时间。我只写了3关,如果有兴趣可自行在mapDate.js中添加Map.prototype.initLevel = function () { switch (this.level) { case 1: this.eMapLevel = eMap.level_1.obstacles; this.eMapLength = eMap.level_1.obstacles.length; this.mapEnemyType = eMap.level_1.enemyType; break; case 2: this.eMapLevel = eMap.level_2.obstacles; this.eMapLength = eMap.level_2.obstacles.length; this.mapEnemyType = eMap.level_2.enemyType; break; case 3: this.eMapLevel = eMap.level_3.obstacles; this.eMapLength = eMap.level_3.obstacles.length; this.mapEnemyType = eMap.level_3.enemyType; break; default : this.eMapLevel = eMap.level_1.obstacles; this.eMapLength = eMap.level_1.obstacles.length; this.mapEnemyType = eMap.level_1.enemyType; break; } };

最后一步是我们需要对左侧的地图进行初始化,值得一提的是我们对其的做法,因为我们这个程序主要是侧重于对DOM的操作,所以我们首先对每一个节点div都不设置绝对定位,当我们将地图全部加载完毕后再,将它们转化为绝对定位,这样方便以后在我们的操作中修改和判断。Map.prototype.initLeftMap = function () { var oFrag = document.createDocumentFragment(); for (var i = 0; i < this.eMapLength; i++) { for (var j = 0; j < this.eMapLevel[i].length; j++) { switch (this.eMapLevel[i][j]) { case 0://道路 var oBare = this.createElem(DIV, BARE); oBare.material = 0;//用以分辨类型 oFrag.appendChild(oBare); break; case 1://墙 var oWall = this.createElem(DIV, WALL); oWall.material = 1;//用以分辨类型 oFrag.appendChild(oWall); break; case 2://铁(石头) var oIron = this.createElem(DIV, IRON); oIron.material = 2;//用以分辨类型 oFrag.appendChild(oIron); break; case 3://花 var oFlower = this.createElem(DIV, FLOWER); oFlower.material = 3;//用以分辨类型 oFrag.appendChild(oFlower); break; case 7://墙(老巢周围的墙) var oWall = this.createElem(DIV, WALL); oWall.material = 7;//用以分辨类型 oFrag.appendChild(oWall); break; case 9://老巢 var oBare = this.createElem(DIV, BARE); oBare.material = 0; oFrag.appendChild(oBare); var oLair = this.createElem(DIV, LAIR, LAIR); //这个时候设置老巢为绝对定位,使其不在原来的位置不影响div的排列 oLair.style.position = POSITION; oLair.material = 9; oFrag.appendChild(oLair); break; default : break; } } } this.oParent.appendChild(oFrag); var oElem = this.oParent.getElementsByTagName(DIV); var iElemLen = oElem.length; var index = 0; //需要对每一个方块进行绝对定位, // 所以要计算每一个相对于左上角的偏移量就是每一个div的offsetLeft for (var i = 0; i < iElemLen; i++) { if (oElem[i].id !== LAIR) {//不是老巢 oElem[i].style.left = oElem[i].offsetLeft + PX; oElem[i].style.top = oElem[i].offsetTop + PX; } } //给每一个元素进行绝对定位 for (var i = 0; i < iElemLen; i++) { if (oElem[i].id != LAIR) {//不是老巢 oElem[i].style.position = POSITION; if (oElem[i].material == 7) { //老巢周围的墙 oElem[i].id = index++; this.lairEnclosure.push(oElem[i]); this.obstacle.push(oElem[i]); } else if (oElem[i].material == 1 || oElem[i].material == 2) { //如果是墙或者是铁(石头),保存到障碍物数组中 this.obstacle.push(oElem[i]); } } } //获取老巢节点 var oLair = $(LAIR); //设置老巢节点的偏移量与和它上一个同级的的位置相同 oLair.style.top = oLair.previousSibling.offsetTop + PX; oLair.style.left = oLair.previousSibling.offsetLeft + PX; oLair.style.zIndex = 6;};

好了,今天先暂且写到这里吧,下一次将把物体的构造思路和坦克的构造思路写一下,感觉还是比较有新意的。小弟初识javaScript面向对象设计,如有错误之处,望批评指正。

本文网址:http://www.shaoqun.com/a/250709.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

0

java 坦克大战 教程_[Java教程]坦克大战(一)相关推荐

  1. Java版90经典坦克大战下载_经典90坦克大战

          经典90坦克大战是1985年在任天堂FC平台上,推出的一款多方位平面射击坦克游戏.此次经典90坦克大战发布,由权威的决战坦克论坛管理员集成了新旧两个版本的地图编辑器.和朋友们一起重回坦克大 ...

  2. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅

    [Java教程]一次艰难的内存泄露排查,BeanUtils 的锅 0 2020-10-29 18:24:42 现象 通过jstat -gcutil pid 5000 ,发现fgc次数很多而且频繁,此时 ...

  3. java 调停者模式_[Java教程]《JAVA与模式》之调停者模式

    [Java教程]<JAVA与模式>之调停者模式 0 2012-06-20 12:00:09 在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: ...

  4. java爬虫好的教程_[Java教程]一个更加简单粗暴的爬虫

    [Java教程]一个更加简单粗暴的爬虫 0 2017-09-30 16:00:13 今天上午看到一篇文章:一个简单粗暴的爬虫 - 必应今日美图.我也用自己的方式更加简单的实现了这个功能.下面我就贴一下 ...

  5. Java国际化教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 Java国际化入门教程 - 从简单的步骤了解Java国际化从基本到高级概念,包括概述,环境设置,区域设置,区域设置详细信息,显示语言,ResourceBundle,NumberFormat, ...

  6. java单链表通讯录_[Java教程]用java实现单链表(菜鸟出征)

    [Java教程]用java实现单链表(菜鸟出征) 0 2016-03-24 14:00:06 package code;class Node{ Node next; int data; public ...

  7. Java Regex 教程_编程入门自学教程_菜鸟教程-免费教程分享

    教程简介 正则表达式不仅仅是Java的技术,在任何一门编程语言中都会存在,是一种通用的IT技术,其理念和用法在任何编程语言中基本一致,除了有一些由于语言不同而导致的一些语法不同正则表达式,主要用于匹配 ...

  8. java privatekey输出字符串_[Java教程]根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象_星空网...

    根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象 2012-05-29 0 1.字符串生成公钥对象 PublicKey /** * 实例化公钥 * * @re ...

  9. python图形界面教程_图形教程

    python图形界面教程 众所周知,我们可以借助Java库制作游戏,这些库为我们提供制作游戏所需的图形. 因此,今天我将开始一个关于Java图形的非常新的部分. 我之前曾发表过有关如何制作所得税计算器 ...

最新文章

  1. 【机器视觉】 translate_measure算子
  2. esxi.主机配置上联端口_为什么现代的电脑机箱仍然具有USB 2.0端口?
  3. Open vSwitch实验常用命令
  4. 设计模式之十一:抽象工厂模式(Abstract Factory)
  5. linux 7修改主机名重启后不生效_Linux 中改变主机名的 4 种方法 | Linux 中国
  6. HTML5 文档头部
  7. 理解各种聚类算法的差异
  8. 自定义queue - linked array
  9. android开机画面大集合,汇总各种Android 开机画面修改方法 第二屏
  10. movielens 1m 的mysql_数据分析实例-MovieLens 1M 数据集
  11. 固件中的单个二进制模拟:Tenda AC15 路由器 CVE-2018-5767 / CVE-2020-10987 漏洞分析与复现
  12. PCB板检测机(PCB板外观缺陷视觉检测设备)
  13. 帕丽斯·希尔顿,缺少
  14. Spring Boot(一):概述(5)——Spring Boot项目推荐工程结构
  15. python大神能干什么_Python这么火,能干什么?这四大主要用途是你必须得知道的!...
  16. vnpy 查询持仓量_持仓回报中的冻结量读取可能有误
  17. 适用于Java开发人员的微服务:持续集成和持续交付
  18. 重磅!苹果公司市值首次突破9000亿美元大关
  19. oracle cast 用法
  20. 【今日收获】关于[Error] expected primary-expression before ‘;‘ token的解决方法

热门文章

  1. 我和Java的爱恨情仇
  2. php搭建markdown云笔记_【简明版】有道云笔记Markdown指南 | 有道云笔记官方博客...
  3. Java程序员必看:2020年最流行的Java开发技术
  4. 少侠,留步,图片预览术
  5. Eclipse新发布的Ganymede,转自,javaeye
  6. 无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离
  7. 超越微支付:纳米服务的崛起
  8. Autodesk 123D 神般强大的软件
  9. BAT到AT的背后,是流量思维的终结
  10. Android 日志系统分析(三):logcat