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,一经查实,立即删除!

相关文章

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;在第一段位移和伤害释放…

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

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

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

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

ffmpeg宏块(Macroblock)概念

参考文章&#xff1a;音视频高手课系列5-h264编码基础(宏块原理) 文章目录 使用videoEye分析视频宏块示例FFmpeg宏块概念1. 宏块的定义2. 宏块的分类I-MacroblocksP-MacroblocksB-Macroblocks 3. 宏块的编码过程1. 运动估计2. 变换与量化3. 熵编码 4. 宏块的解码过程1. 熵解码2…

python123循环结构_来学Python啦,大话循环结构~

点击上方蓝字关注"程序员Bob"每日一句&#xff0c;送给最珍贵的你&#xff1a; 为学日益&#xff0c;为道日损&#xff0c;损之又损&#xff0c;以至于无为&#xff0c;无为而无不为。最近想研究爬虫了&#xff0c;准备拾起以前Python&#xff0c;继续学&#xff01;…

linux查看主机脚本,简单的bash脚本查看任意网段的在线主机

一前言最近看到许多同志在写ping某个地址段的bash脚本&#xff0c;我也心血来潮来了一发。 当然本人新手&#xff0c;大神勿喷。二准备工作linux系统的机器一台&#xff0c;当然虚拟机也可以&#xff0c;只要将网卡配置为桥接模式&#xff0c;可以连通其他局域网的主机即可。1…

python中什么叫合法的标识_python合法标识符要求是什么

python合法标识符要求是&#xff1a;1、不能以数字开头&#xff1b;2、不能包含非法字符&#xff1b;3、数字不能作为标识符&#xff1b;4、不能包含空格&#xff1b;5、不能包含运算符。1.不能以数字开头>>> 2bin2 File "", line 1 2bin2 ^ SyntaxError: i…

android界面实现框架内页面跳转_KVM虚拟化管理平台的实现

KVM虚拟化管理平台的实现源码链接&#xff1a;https://github.com/wsjhk/IaaS_admin.git视频演示链接&#xff1a;https://v.youku.com/v_show/id_XMjg4MTczODU1Ng.html(N年前刚开始学习Python时做的第一个自主设计实现项目&#xff0c;代码实在写的烂&#xff0c;不喜勿喷&…

suse linux 查看内存,Suse linux查询内存大小的指令是什么?

满意答案CJTHI2013.08.18采纳率&#xff1a;49% 等级&#xff1a;12已帮助&#xff1a;5850人下面和大家分享在Linux系统下查看内存使用情况的free命令&#xff1a;[rootscs-2 tmp]# freetotal used free shared buffers cachedMem: 3266180 3250004 16176 0 110652 2668236…

Linux微信运行错误,Ubuntu 16.04 运行微信开发者工具编译出错的解决办法

最近有折腾小程序的意向&#xff0c;但微信的开发者工具只提供了 Windows 和 Mac 两个版本&#xff0c;对于我这样的 Linux 用户来说不是那么地友好。经过观察发现&#xff0c;那个开发者工具实际上是基于nw.js开发的&#xff0c;天然地具有跨平台的属性&#xff0c;搜索Github…

springboot security 权限校验_springboot借助aop和注解实现权限校验

我们用springboot做后台开发&#xff0c;难免会用到权限校验&#xff0c;比如查看当前用户是否合法&#xff0c;是否是管理员。而spring的面向切面的特效可以帮助我们很好的实现动态的权限校验。这里我们就用到的spring的aop。接下来就带领大家用aop和注解来快速的实现权限校验…

electron sqlite3_electron集成sqlite3,win10上折腾了2天

要看解决办法的&#xff0c;直接把文章滚动到最后就行了&#xff0c;很简单。最近要做个 IM&#xff0c;PC 端选择用 electron&#xff0c;跨端的最佳选择了。桌面端项目&#xff0c;肯定少不了本地数据库&#xff0c;本来想用 sql.js&#xff0c;看了下需要手动拼接 SQL 语句&…

arrays中copyof复制两个数组_C语言100题集合026-使用指针交换两个数组中的最大值

系列文章《C语言经典100例》持续创作中&#xff0c;欢迎大家的关注和支持。喜欢的同学记得点赞、转发、收藏哦&#xff5e;后续C语言经典100例将会以pdf和代码的形式发放到公众号欢迎关注&#xff1a;计算广告生态 即时查收1 题目函数&#xff1a;max()、swap()功能&#xff1a…

红头文件rgb红色值_拿下抖音小姐姐,我写了个口红色号识别器

对于广大“钢铁直男”的程序员来说&#xff0c;送什么礼物给女朋友一直是个世纪难题。其实哄女朋友开心最深的套路就是花式送口红&#xff0c;就问谁抵挡得住啊啊啊啊......“没有什么问题是一支口红解决不了的&#xff0c;如果有&#xff0c;那就两支。”于是&#xff0c;直男…

腾讯offer是什么样子_月薪35K:2020腾讯Java后端开发详细面试流程

背景2017年我毕业于某不知名二本院校&#xff0c;校招进入一安防企业; 从事于后台服务接入工作。期间一直不断的提高自己&#xff0c;终于在今年如愿以偿&#xff0c;获得腾讯后台开发岗位offer。因此想借此分享成长路上的思考与困难&#xff0c;以及腾讯面试的整个流程。同时在…