JavaFX中的塔防(6)

因此,我们已经在本教程的第6部分中,与此同时,游戏也取得了长足的进步。 在这一部分中,我们最终将添加一个显示得分的图层,已达到目标的敌人数量,启动下一个Wave的按钮以及用于购买新炮塔的资金。 说到钱,我们还没有逻辑,所以我们应该先解决这个问题。 不过,我不想将价格存储在应用程序代码中,因为这样会使我虚构的关卡设计师(不懂编程的人)难以微调变量。 我也想将所有东西都放在一个地方,因此,如果我们决定添加一个新的刀塔,则不需要在许多不同的地方进行更改。 幸运的是,我们可以将属性存储在TileSet中,因此我们将这样做。

Tilemaps的TMX格式确实是一种将设计与编程内部结构区分开的好方法(当涉及到游戏时,业务逻辑听起来确实是错误的)。 结果,图形设计师可以创建资产,关卡设计师可以创建关卡,甚至用户也可以轻松地修改游戏并创建自己的关卡。 到目前为止,我们已经使用Tiled编辑器创建了一个关卡,并且还在其中一层中存储了有关敌人的产卵和攻击路径的一些元信息。 现在,我们将一些属性添加到TileSet的各个Tile中。 这仅适用于内部TileSet,因此在Tiled中,您必须通过“地图-> new Tileset”定义新的Tileset。 如果现在右键单击图块,则它具有定义图块属性的操作。 我已经为塔基定义了一些:

Bildschirmfoto-2013-08-11-um-08.29.05

我添加了几个属性,包括武器的射程,射速,造成的伤害,名称和描述(稍后显示)以及类型,我想用来定义用作子弹的瓦片。 也许还会有像激光这样的武器,必须以不同的方式实施。 然后,我可以决定对这种类型使用不同的逻辑方式。 我可以通过Tileset从Tile获取属性,如下所示:

Properties properties = tileSet.getTileList().get(selectedIndex).getProperties();

在CannonSprite内,我可以这样使用它们:

String rangeProperty = properties.getProperty("range");
if (rangeProperty != null) {
range = Integer.parseInt(rangeProperty);
}
String damageProperty = properties.getProperty("damage");
if (damageProperty != null) {
damage = Integer.parseInt(damageProperty);
}
String rateProperty = properties.getProperty("firerate");
if (rateProperty != null) {
rate = Float.parseFloat(rateProperty);
}//....

我们将对EnemySprites做同样的事情,因此我们可以确定销毁它们的要点,它们的损坏抵抗力,也许恢复率等。这种方法的优点之一是,它也非常易于扩展。 万一我以后决定添加一个新的炮塔,该炮塔会产生磁场以迷惑敌人并使他们的飞行速度变慢,我可以通过向该特定炮塔添加一个新的Property来做到这一点。 我不必更新旧的关卡设计或破坏用户的自定义关卡。 在这一方面,它类似于我最喜欢的编程技术之一,即“ 组成于继承 ”。

我们现在可以使用这些属性,例如,通过修改炮塔的FireBehavior评估间隔,使炮塔以不同的速率发射:

@Override
public long getEvaluationInterval() {
return (long)(2000000000*rate);
}

结果是:

第二个炮塔现在以更高的射速发射,同时每发子弹造成的伤害更少。 如果将炮塔的价格与不同的价格以及可放置炮塔的有限空间相结合,我们已经具备了使塔防成为一款有趣游戏的一些战略要素。 现在,我们的关卡设计师负责设计关卡,设置价格和其他属性,以使游戏变得有趣,同时我们继续添加更多功能。

现在让我们从HUD图层开始,简单地显示分数:

private class HUD extends Layer {@Override
public void draw(GraphicsContext graphicsContext, double x, double y, double width, double height) {
graphicsContext.setFill(Color.RED);
graphicsContext.setFont(Font.font("OricNeo", 12));
graphicsContext.fillText("Score: "+score, 10, 16);
}}

分数在我的游戏中定义为IntegerProperty(这不是JavaFX属性!),并传递给EnemySprites:

private IntegerProperty score = new IntegerProperty(0);

因此,在EnemySprites“ die”方法中,我们只是增加该值:

@Override
public void die() {
super.die();
getParent().addSprite(new Sprite(getParent(), explosionAnimation, "explosion", getX() - 30, getY() - 80, 128, 128, Lookup.EMPTY));
score.set(score.integerValue()+killPoints);
}

现在将HUD添加为顶层,您可以看到分数:

我们接下来需要的是某种方式开始浪潮。 为此,最好具有某种简单的控件,例如按钮。 我们可以用不同的方式添加。 最简单的方法可能是将画布放在StackPane中,在其顶部添加AnchorPane并为其添加JavaFX Node或Control。 但是我们只想使用FXGameEngine功能,所以我们将Sprite用作按钮:

final Sprite button = new Sprite(canvas, "button",  tileMap.getWidthInPixels()- 30, 20, 20, 20, Lookup.EMPTY);
button.setOnMouseClicked(new MouseEventHandler() {@Override
public void handle(MouseClick click) {
startWave();
button.die();
}
});
canvas.addSprite(button);

我很确定EventHandling的API仍会有所更改,但是它将保持与此类似的抽象。 此Sprite没有渲染器,因此将使用仅绘制矩形的默认渲染器:

今天就这样。 在下一部分中,我们将向游戏添加资金,因此它会变得更加有趣……

翻译自: https://www.javacodegeeks.com/2014/03/tower-defense-in-javafx-6.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教师计算机网络培训工作总结,教师培训工作的自我总结

【导读】教师培训工作的自我总结为好范文网的会员投稿推荐,但愿对你的学习工作带来帮助。教师是一个平凡而又伟大的职业,那教师培训工作总结怎么写呢?下面小编就和大家分享教师培训工作总结,来欣赏一下吧。教师培训工作总结(一)一年来&#…

十一 hashlib模块

# 1、什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值 # 2、hash值的特点是&#xff1a…

c#中接口的使用方法图解_c# 接口方法中使用new有什么用?

慕盖茨44945811234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465//接口示例class Program { static void Main(string[] args) { S s new S(); s.Fun(); s.Method(); …

nginx知识问答

1、请解释一下什么是Nginx?  答:Nginx是一个web服务器和反向代理服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议。2、请列举Nginx的一些特性?  答:Nginx服务器的特性包括: 1)反向代理/L7负载均衡器 …

HashMap如何在Java中工作

面试中最常见的问题是“ HashMap如何在Java中工作”,“ HashMap的获取和放置方法如何在内部工作”。 在这里,我试图通过一个简单的示例来解释内部功能。 而不是理论,我们将首先从示例开始,以便您更好地理解,然后我们将…

input上传文件个数控制

HTML: 1 <h3>请上传[2,5]个文件</h3>2 <form action"" enctype"multipart/form-data">3 <input type"file" name"file" multiple"multiple" id"file" onchange"fileCo…

构造方法的格式

Student.java /* 构造方法作用概述:给对象的数据进行初始化* * 1.构造方法的方法名和类名相同* 2.构造方法不能写void ,没有返回值类型* 3.没有具体的返回值* * 构造方法的注意事项:* A:如果我们没有给出构造方法&#xff0c;系统将会提供一个默认的无参构造方…

东北农业大计算机排名,黑龙江高校排名更新,东北林大排名第3,东油排名第8...

东北地区的经济发展起步比较早&#xff0c;属于我国的老牌重工业基地&#xff0c;被称为“新中国工业的摇篮”&#xff0c;是我国最重要的经济支柱。这里的高校也因此而受到重视&#xff0c;为日后的发展奠定了扎实的基础&#xff1b;随着国家经济重心的转移&#xff0c;因为地…

打印控件

Visual Basic - 第三方控制Visual Basic - 打印与报表Visual Basic - DBGrid 现在几乎所有数据库表格控件(除了VB自身的DBGrid)都带有打印和预览功能&#xff0c;象True DBGrid Pro(http://www.componentone.com/)、Farpoint Spread(http://www.fpoint.com/)、Janus Grid和国产…

实现sessionfilter_session应用--采用filter和session实现简单用户权限控制

前面有讲到一些session的基础知识点&#xff0c;这里那我们就将session和filter做结合&#xff0c;实现一个简单地应用处理用于一般后端管理程序的权限控制&#xff01;①我们先建立一个filter的实现类SecurityServlet&#xff0c;简单代码如下&#xff1a;import java.io.IOEx…

开博语

犹记那年雁归&#xff0c;黄叶纷飞&#xff1b;独立平房女儿墙&#xff0c;也装欢喜悲凉&#xff1b; 而今蝉鸣初夏&#xff0c;毕业无话&#xff1b;四年弹指一挥间&#xff0c;总是回首不堪。 点点滴滴写此处&#xff0c;昼夜行路。转载于:https://www.cnblogs.com/iloveww/p…

150个Java面试问答-最终清单(PDF下载)

我们的Java面试问题和答案集合全都涉及可以在Java面试中使用的不同类型的问题&#xff0c;以使雇主可以测试您在Java和面向对象编程方面的技能。 在以下各节中&#xff0c;我们将讨论有关面向对象编程及其特性的Java面试问题&#xff0c;有关Java及其功能的一般问题&#xff0…

计算机电子电路原理图,简单电路图入门-电路原理图入门知识图解

简单电路图入门-电路原理图入门知识图解电路图的分类简单电路图入门&#xff0c;常遇到的电子电路图有原理图、方框图、装配图和印版图等。1、原理图原理图就是用来体现电子电路的工作原理的一种电路图&#xff0c;又被叫做“电原理图”。这种图由于它直接体现了电子电路的结构…

老是不中,算了算“双色球”和“3D”,全买到底要多少¥¥。。(C 代码)

最近也做发财梦&#xff0c;买了段时间得彩票&#xff0c;不得要领&#xff0c;今天写了两个小程序&#xff0c;算算把所有号码组合都买下到底要多少&#xffe5;&#xffe5;。。还是先贴个规则吧&#xff1b;双色球&#xff1a;从 1~33 中选6个不重复得数值&#xff08;红球&…

pycharm 中 import requests 报错

一 , 使用Pycharm来抓取网页的时候&#xff0c;要导入requests模块&#xff0c;但是在pycharm中 import requests 报错。 原因&#xff1a; python中还没有安装requests库 解决办法&#xff1a; 1.先找到自己python安装目录下的pip 2.在自己的电脑里打开cmd窗口。先点击开始栏&…

监控mysql锁定状态_MySQL 锁的监控及处理

故障模拟# 添加两项配置vi /etc/my.cnf[mysqld]autocommit0innodb_lock_wait_timeout 3600systemctl restart mysqld# 登录数据库use klvchen;UPDATE t1 SET k1av WHERE id1;# 新开一个窗口&#xff0c;再登录数据库use klvchen;UPDATE t1 SET k1az WHERE id1;# 此时页面卡住(…

dell 计算机硬盘保护,dell台式机硬盘保护 怎样取消

工具/原料十字型螺丝刀一把新台式机硬盘一块方法/步骤1.把新购置的硬盘拆开&#xff0c;以备后面使用&#xff1a;2.拆下机箱的侧面板&#xff0c;注意&#xff0c;侧面板有两颗螺丝固定&#xff0c;需要先卸下&#xff0c;之后向一侧方向拉出侧面板就可以了&#xff0c;拆下侧…

安全建设之平台搭建

一、信息搜集类 基础信息 基础信息搜集包括ip&#xff0c;域名&#xff0c;端口&#xff0c;框架&#xff0c;组件信息。Ip、域名甲方可通过运维同事获取&#xff0c;其他获取方式仁者见仁智者见智。端口&#xff0c;需要我们根据获取的域名、ip进行端口扫描&#xff0c;这里推…

BSTR、char*和CString转换

BSTR、char*和CString转换 (1) char*转换成CString 若将char*转换成CString&#xff0c;除了直接赋值外&#xff0c;还可使用CString::Format进行。例如&#xff1a; char chArray[] "This is a test"; char * p "This is a test"; 或 LPSTR p "T…

Java 8的8个新功能

注意&#xff1a;确保还检查了我们的详细教程Java 8 Features – ULTIMATE Guide 。 Jdk 1.8&#xff08;又名Java 8&#xff09;今天发布&#xff0c;这意味着它的通用发布版本已经公开发售&#xff0c;开发人员可以从早期发布版本切换到经过测试的版本以供生产使用。 但是&a…