javafx中的tree_JavaFX中的塔防(2)

javafx中的tree

在最后一部分,我们创建了一个简单的编辑器,让我们放置炮塔。 现在,我们将在敌人起源处添加一个生成点,并为其定义攻击目标。 首先,我将通过对象层向地图添加更多信息。 这是标准的TMX,因此我们可以在TileMap编辑器中进行操作:

Bildschirmfoto-2013-08-06-um-17.41.17

为了计算敌人的攻击路径,我们将使用A *算法,它是tilengine模块的一部分:

因此,让我们获取派生点和目标并将其存储为我们的算法:

ArrayList objectGroups = tileMap.getObjectGroups();
for (ObjectGroup objectGroup : objectGroups) {
for (final TObject tObject : objectGroup.getObjectLIst()) {
if (tObject.getName().equals("spawnpoint")) {spawnpointX = tObject.getX() / turrets.getTilewidth();
spawnpointY = tObject.getY() / turrets.getTileheight();}if (tObject.getName().equals("target")) {targetX = tObject.getX() / turrets.getTilewidth();
targetY = tObject.getY() / turrets.getTileheight();}
}
}

使用这些值,我们可以初始化A *算法,该算法计算敌人的最短路径:

AStar.AStarTile start = new AStar.AStarTile((int) spawnpointX, (int) spawnpointY);
AStar.AStarTile end = new AStar.AStarTile((int) targetX, (int) targetY);
attackPath = AStar.getPath(tileMap, platformLayer, start, end);

为了查看结果,我们将向GameCanvas添加一个调试层:

private class AStarLayer extends Layer {
public AStarLayer() {
}
Color pathColor = Color.rgb(255, 100, 100, .2);@Override
public void draw(GraphicsContext graphicsContext, double x, double y, double width, double height) {
AStar.PathNode start = attackPath;
if (start != null) {
graphicsContext.setFill(pathColor);
graphicsContext.fillRect(start.getX() * tileMap.getTilewidth(), start.getY() * tileMap.getTileheight(), tileMap.getTilewidth(), tileMap.getTileheight());
while (start.getParent() != null) {
start = start.getParent();
graphicsContext.fillRect(start.getX() * tileMap.getTilewidth(), start.getY() * tileMap.getTileheight(), tileMap.getTilewidth(), tileMap.getTileheight());
}
}
}
}

结果看起来像这样:

Bildschirmfoto-2013-08-07-um-08.12.45

您会看到红色的最短路径。 由于该算法没有“看到”背景图像的结构,因此它会相应地计算路径,而敌人只会忽略船的结构(背景应该是宇宙飞船的一部分)。 要解决此问题,我们稍后将添加一些不可见的图块。 对于大型游戏,最好使用不可见的碰撞层,这样可以为您提供更好的性能,并提供更多方式来实现锁定段落。 对我们而言,transparent-tile-approach更好,因为我们不需要额外的图层,而且如果用户可以编辑布局,则更容易。

现在,我们需要将敌人击倒。 为了给Sprite制作动画,我将动画阶段合并为一个图像:

Bildschirmfoto-2013-08-07-um-08.05.59

现在我们可以使用Tiled编辑器从中创建TileSet:

Bildschirmfoto-2013-08-07-um-08.10.43

我还使用Tiled向派生点添加了两个附加属性:

Bildschirmfoto-2013-08-06-um-17.41.271

第一个定义了每种类型我想要产生多少个敌人,第二个定义了它们产生之间的停顿时间。 我怀疑他们会经受住时间的考验,但现在让我们与他们合作。 在用于读取对象组的代码中,我们可以访问属性:

if (tObject.getName().equals("spawnpoint")) {Properties properties = tObject.getProperties();
evaluationInterval = Long.parseLong(properties.getProperty("delay"));
spawnpointX = tObject.getX() / turrets.getTilewidth();
spawnpointY = tObject.getY() / turrets.getTileheight();}

现在我们只有一种怪兽,所以我们可以忽略它而只使用延迟。 首先,我们将从TileSet中创建一个SpriteAnimation:

final TileSet enemy1 = tileMap.getTileSet("enemy1");
final TileSetAnimation tileSetAnimation = new TileSetAnimation(enemy1, new int[]{0, 1, 2, 3, 4, 5}, 10f);

为了产生怪物,我们将定义一个行为。 那只是一个定时方法调用。 为了支持Lambda表达式,可能会在此处对API进行一些更改:

Behavior monsterSpawnBehavior = new Behavior() {
int enemyCount = 0;@Override
public boolean perform(GameCanvas canvas, long nanos) {
new Sprite(canvas, tileSetAnimation, "enemy" + (enemyCount++), ((int)spawnpointTileX) * tileMap.getTilewidth(), ((int)spawnpointTileY) * tileMap.getTileheight(), 46, 46, Lookup.EMPTY);
return false;
}
};
monsterSpawnBehavior.setEvaluationInterval(evaluationInterval);
canvas.addBehaviour(monsterSpawnBehavior);

所以现在每隔十亿分之一秒,一个新的敌人就会被添加到运动场中。 我们稍后可能会创建一个EnemySprite类来封装Behavior。 但是现在,让我们继续使用此Sprite并向其添加Behavior:

sprite.addBehaviour(new SpriteBehavior() {
AStar.PathNode start = attackPath;@Override
public boolean perform(Sprite sprite) {
double x = sprite.getX();
double y = sprite.getY();
double pathX = start.getX() * tileMap.getTilewidth();
double pathY = start.getY() * tileMap.getTileheight();
if (Math.abs(pathX- x) 1) {
sprite.setVelocityX(.5);
} else if (pathX- x < -1) { sprite.setVelocityX(-.5); } else { sprite.setVelocityX(0); } if (pathY - y > 1) {
sprite.setVelocityY(.5);
} else if (pathY - y < -1) {
sprite.setVelocityY(-.5);
} else {
sprite.setVelocityY(0);
}
return true;
}
});

结果如下:

现在就这样。 如您所见,通过Behaviors将AI添加到精灵中非常简单,AStar非常方便。 在下一部分中,我们将注意敌人指向正确的方向,并向炮塔添加一些“行为”。

在Eppleton博客上,我们的JCG合作伙伴 Toni Epple 参考: JavaFX中的塔防(2) 。

翻译自: https://www.javacodegeeks.com/2013/10/tower-defense-in-javafx-2.html

javafx中的tree

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

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

相关文章

oracle全角字符转半角,Oracle 表字段全角字符轉換半角字符辦法

在Oralce的某一個表中&#xff0c;一個地址字段包含了全角的字符&#xff0c;需要轉換為半角字符&#xff0c;以便進一步處理。表名&#xff1a;a包含全角字符的字段&#xff1a;address編輯表結構&#xff0c;添加一列&#xff1a;address2在PLSQL中&#xff0c;新建SQL窗口&a…

fanuc机器人与视觉通信_要说工厂干起活来:工业机器人和数控机床才是真正的一对!...

我们常说团结就是力量&#xff0c;只有相互配合&#xff0c;才能把工作做得更加完美。这不仅仅适用于人类。工业机器人和数控机床也是一样的&#xff0c;也是需要相互配合才能做好工作&#xff0c;提高工厂的生产效率。所以今天要学习的是工业机器人和数控机床是怎么配合工作的…

在Microsoft Azure上运行Eclipse MicroProfile

在本文中&#xff0c;我将通过展示如何在Microsoft Azure Web Apps for Containers中执行操作来跟踪有关在Oracle Cloud中运行Eclipse MicroProfile应用程序的系列文章。 我正在使用与以前的帖子相同的简单应用程序CloudEE Duke 。 唯一的区别是&#xff0c;我现在将应用程序打…

php ajax 更改状态,phpajax实现无刷新获取天气状态_PHP教程

首先我们要明白一点我们自己是无法来做天气预报这种功能的&#xff0c;这里我们只要调用api接口返回的数据就可以了&#xff0c;下面是以中国天气网的api接口调用实例我们一起来学习。天气已经成为生活中不可缺少的话题&#xff0c;与我们的生活有着密切的关系&#xff0c;我博…

注入dll到explorer.exe中无反应_MBR膜生物反应器的安装及技术要求都有什么呢?

MBR膜生物反应器在安装的时候&#xff0c;其中是有着事项值得我们注意的&#xff0c;那么MBR膜生物反应器的安装及技术要求主要是什么呢&#xff1f;下面一起来了解下吧。1.MBR膜生物反应器管道安装连接应该在设备就位时考虑好&#xff0c;罐体就位时必须按设备自重&#xff0c…

什么是互联网大厂_2020阿里、腾讯、字节跳动等14家互联网大厂薪资水平大汇总...

联网大厂已经成为求职者的“必争之地”。无论是从薪资待遇、发展机会&#xff0c;还是从平台资源、技术实力来看&#xff0c;互联网大厂都是不错的选择。当然&#xff0c;不同的企业薪资水平还是存在一定的差距&#xff0c;对应的要求也会有所不同。今天&#xff0c;我们再来看…

解神者php奥义高阶,《解神者》角色月曦九攻略技能解析和兽主推荐

解神者已经有一段时间了&#xff0c;很多新玩家对角色还不太了解&#xff0c;今天就给新手玩家解析一下月曦九角色的技能攻略和兽主推荐。月曦九也是解神者所有角色里伤害很高的角色之一。月曦九的神权一技能&#xff0c;此技能共有两段伤害&#xff0c;在第一段位移和伤害释放…

jax-rs jax-ws_使用JAX-RS的HTTP缓存

jax-rs jax-ws在上一个博客中&#xff0c;我们讨论了不同类型的缓存及其用例。 在本文中&#xff0c;我们将探讨如何利用HTTP响应标头和JAX-RS提供的支持来利用缓存。 过期标题 在HTTP 1.0中&#xff0c;一个名为Expires的简单响应头将告诉浏览器它可以缓存对象或页面多长时间…

php常驻对象,php对象

linux中用户的主目录&#xff5e;-在Linux中代表用户主目录 对一般用户,-表示/home/(用户名) 对于root用户,-表示/root 如果要查看-的真实面貌,可以先进入-目录,然后用pwd -P命令查看-的绝对路径 cd ~ ...SQL2005语句实现行转列&comma;列转行在做报表时,经常需要将数据表中…

无穷级数求和7个公式_大家看,用反证法判别级数敛散性(送微积分同学)!...

反证法证明级数发散题目、 判断级数 的收敛性。解&#xff1a; 反设收敛。则收敛。所以收敛&#xff0c; 所以收敛&#xff0c; 它为正项级数&#xff0c;但是通过比较分子分母次数得到因为发散&#xff0c; 所以发散&#xff0c;矛盾。所以原级数发散。注记&#xff1a; 教材中…

用户身份验证最佳做法清单

用户身份验证是每个Web应用程序共享的功能。 我们已经实现了很多次&#xff0c;所以很早以前就应该完善它。 然而&#xff0c;错误无时无刻不在发生。 造成这种情况的部分原因是&#xff0c;可能出问题的清单很长。 您可能会错误地存储密码&#xff0c;可能会具有脆弱的密码重…

matlab二元一次方程求解_高中化学二元混合物的十字交叉法解法

“十字交叉法”是高中化学计算题中巧解二元混合物问题的一种常用的有效方法&#xff0c;正确运用“十字交叉法”&#xff0c;可以帮助同学们方便、迅速地解决计算问题。速解的前提&#xff1a;1、必须清楚“十字交叉法”运用后的比例比系——“看分母”法则。即特性数值的分母所…

Loadruner压数据库oracle,LoadRunner连接Oracle数据库(转)

51Testing软件测试网0U#~*o\*l这个是在51上转载的。。e $b#v.m051Testing软件测试网"HyG#r%f;sv7[8yr-S$_zOt }Hs0多谢楼主的奉献。。。D_2c#Sb~p.y9\08\WHR\I0#include51Testing软件测试网H(zk/dI1QawtBstatic LRD_INIT_INFO InitInfo{LRD_INIT_INFO_EYECAT};51Testing软…

python怎么输入两行_python交互模式下输入换行/输入多行命令的方法

先给大家介绍下python交互模式下输入换行/输入多行命令的方法 换行方法 \ 如&#xff1a; >>> print aaa; \ ... print bbb; \ ... print ccc 注意;号的使用。 python本身语句结束和间隔都是不需要&#xff1b;号的&#xff0c;但是在换行时要使用&#xff1b;号&…

linux系统读取excel文件是否存在,小弟我用poi读excel,在window下没有有关问题,但把程序放到linux上时,读取客户端的excel文件报错,不...

我用poi读excel&#xff0c;在window下没有问题&#xff0c;但把程序放到linux上时&#xff0c;读取客户端的excel文件报错&#xff0c;不知道如何解决我用poi读excel&#xff0c;在window下没有问题&#xff0c;但把程序放到linux上时&#xff0c;读取客户端的excel文件报错&a…

利用python计算圆球的体积_python计算圆周长、面积、球体体积并画出圆

#https://github.com/RobberPhex/GTK-Example-CalcArea from gi.repository import Gtk, Gdk, GdkPixbuf from PIL import Image, ImageDraw from io import BytesIO from math import pi class Model:模型类 存储半径&#xff0c;计算周长、面积、体积def __init__(self): sel…

可重入锁 不可重入锁_什么是可重入锁?

可重入锁 不可重入锁在Java 5.0中&#xff0c;增加了一个新功能以增强内部锁定功能&#xff0c;称为可重入锁定。 在此之前&#xff0c;“同步”和“易失性”是实现并发的手段。 public synchronized void doAtomicTransfer(){//enter synchronized block , acquire lock over…

pythonista3安卓_Pythonista 3 app下载

Pythonista 3介绍 Pythonista is a complete scripting environment for Python, running directly on your iPadiPhone. It includes support for both Python 3.62.7, so you can use all the language improvements in Python 3, while still having 2.7 avAIlable for back…

linux查看本机所有预设的系统变量,如何设置与查看Linux系统中的环境变量?

大家都知道&#xff0c;在 Linux 系统中&#xff0c;有环境变量和 Shell 变量这两种变量。环境变量是在程序及其子程序中全局可用的&#xff0c;常常用来储存像默认的文本编辑器或者浏览器&#xff0c;以及可执行文件的路径等等这样的信息。而 Shell 变量仅在当前 Shell 中可用…

使用Amazon s3托管您的Maven工件

如果您使用Amazon Web Services并将Java用于项目&#xff0c;则Amazon S3是托管团队工件的理想场所。 它很容易设置&#xff0c;而且很便宜。 如果您对它们的功能不特别感兴趣&#xff0c;那么它比设置现有存储库选项&#xff08;jfrog&#xff0c;nexus&#xff0c;archiva等…