JavaFX中的塔防(2)

在上一部分中,我们创建了一个简单的编辑器,让我们放置炮塔。 现在,我们将在敌人起源的地方添加一个生成点,并为其定义攻击目标。 首先,我将通过对象层向地图添加更多信息。 这是标准的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添加到sprite很简单,而AStar非常方便。 在下一部分中,我们将注意敌人指向正确的方向,并向炮塔添加一些行为。

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

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

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

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

相关文章

12面魔方公式图解法_三阶魔方入门

一、魔方的构造这里只讲常见的普通三阶魔方。三阶魔方一共有26个色块&#xff0c;分三个层&#xff0c;从上到下分别为顶层、中间层、底层。26个色块按位置分为中心块、角色块、棱色块。中心块6个&#xff0c;角色块8个&#xff0c;棱色块12个。中心块为每一个面最中央的色块。…

Linux ls命令详解

ls常见命令参数 ls: -F 给不同的文件添加不同表示,添加帽子 d/ l* s -a: 显示隐藏文件 以.开头的文件 -p: 只给目录添加/ -t: 按照修改时间排序 time --time-stylelong-iso: ls -l --time-stylelong-iso 显示友好长格式时间 -r: 倒着排序 reverse -S: 按照文件…

caffe 人脸关键点检测_人脸检测关键点新增至81个,比Dlib更精准、更贴边

人脸关键点检测是人脸识别和分析领域中的关键一步&#xff0c;它是诸如自动人脸识别、表情分析、三维人脸重建及三维动画等其它人脸相关问题的前提和突破口。虽然人脸的结构是确定的&#xff0c;由眉毛、眼睛、鼻子和嘴等部位组成&#xff0c;近似是一个刚体&#xff0c;但由于…

美团点评云真机平台实践

背景 随着美团点评业务越来越多&#xff0c;研发团队越来越庞大&#xff0c;对测试手机的需求显著增长。这对公司来说是一笔不小的开支&#xff0c;但现有测试手机资源分配不均&#xff0c;利用率也非常有限&#xff0c;导致各个团队开发、测试过程中都很难做到多机型覆盖。怎…

微型计算机和pc的概念,微型计算机IBM-PC(0520)系统原理及应用

本书是周明德教授的《微型计算机系统原理及应用》的第六版。曾获全国畅销书一等奖。根据微处理器的新发展&#xff0c;本书从80x86系列微处理器整体着眼&#xff0c;落实到基本的处理器8086&#xff0c;介绍了微型计算机系统原理、80x86系列微处理器结构、8086指令系统和汇编语…

volta架构 微型计算机,性能大爆炸 NVIDIA新GPU架构曝光

一年一度的GTC大会目前正在大洋彼岸的美国加利福尼亚州圣何塞市召开&#xff0c;这是由NVIDIA主办的GPU通用计算技术大会&#xff0c;号称是“图形技术巫师”们的聚会。几乎每次GTC大会上NVIDIA都会拿出来些压箱底的东西震场面&#xff0c;这届自然也不会例外。NVIDIA在GTC大会…

有一本书,适合零到十年经验的程序员看

这本书就是《代码大全》。这书名看起来就不想读&#xff1f; 我第一次看到这个书名的时候&#xff0c;心想难道这本书要把所有编程语言都讲一遍吗&#xff1f;但是当我深入阅读这本书之后&#xff0c;简直爱不释手。 这本书太厚了&#xff0c;你看不下去&#xff1f; 是的&a…

西门子数控面板图解_学好四要点让你迅速成为数控机床“操作高手”

当前国内许多刚刚从事数控机床操作人员的分类来说&#xff0c;一部分操作者是&#xff0c;对机械加工非常熟悉&#xff0c;但对于数控机床的编程是比较陌生的&#xff1b;一部分是刚毕业的学生&#xff0c;他们对机械加工知识&#xff0c;数控加工和编程的理论比较熟悉&#xf…

Android Service、IntentService,Service和组件间通信

Service组件 Service 和Activity 一样同为Android 的四大组件之一&#xff0c;并且他们都有各自的生命周期&#xff0c;要想掌握Service 的用法&#xff0c;那就要了解Service 的生命周期有哪些方法&#xff0c;并且生命周期中各个方法回调的时机和作用 什么是service&#xff…

生物计算机科学家,科学家开发细胞计算机 人体就是一台大型计算机

原标题&#xff1a;科学家开发细胞计算机 人体就是一台大型计算机欢迎收看新一期“新奇榜”&#xff0c;新鲜科技、奇闻怪事尽在新奇榜。近日&#xff0c;瑞士研究人员成功制造出了一种功能强大、类似计算机的人体细胞。这种细胞可能被用来帮助监测一个人的健康状况&#xff0c…

k8s源码分析 pdf_rook源码分析之一:rook架构解析

rook简介Rook是一款云原生环境下的开源分布式存储编排系统&#xff0c;目前支持 Ceph、NFS、Edegefs、Cassandra、CockroachDB等存储系统。它实现了一个自动管理的、自动扩容的、自动修复的分布式存储服务。Rook 支持自动部署、启动、配置、分配、扩容/缩容、升级、迁移、灾难恢…

weex eros框架源码解析

weex eros是基于alibaba weex框架进行二次封装的客户端跨平台开发框架&#xff0c;主要是为前端开发者&#xff08;可以不用熟悉客户端开发)提供的一站式客户端app开发解决方案。官网地址为&#xff1a;https://bmfe.github.io/eros-docs/#/。为了方便前端开发者和客户端开发者…

多选一的图片和文字

利用 radio 做单选事件&#xff0c;js 兄弟选择 nextSibling 获取邻近的图片对象&#xff0c;然后进行改变 例子&#xff1a; CSS <style type"text/css">input[type"radio"] {display: none;}label{font-size: 16px;}.choose_or{width: 1.2rem;heig…

【每日一题】收集足够苹果的最小花园周长

文章目录 Tag题目来源解题思路方法一&#xff1a;二分枚举答案 写在最后 Tag 【二分枚举答案】【二维网格】【2023-12-24】 题目来源 1954. 收集足够苹果的最小花园周长 解题思路 方法一&#xff1a;二分枚举答案 思路 通过如下过程&#xff0c;我们可以求出边长为 2n 时&…

小数前的0在html不显示,jsp小数显示问题 例如 我在oracle 数据库中查询出来的是 0.01 但是在jsp页面上就显示成 .01 没有前面的0...

满意答案1234junling2013.08.28采纳率&#xff1a;56% 等级&#xff1a;12已帮助&#xff1a;6022人控制保留几位有效小数的js函数//Code CreateBy abandonship 2007.03.12function FormatAfterDotNumber( ValueString, nAfterDotNum ){var ValueString,nAfterDotNum ;var r…

Jira filter subscribe issues

Jira & filter & subscribe & issues https://confluence.atlassian.com/search/?querysubscribeissues&productNameJiraCore&productVersion7.3]https://confluence.atlassian.com/jiracoreserver073/saving-your-search-as-a-filter-861257224.html 转载…

iView 一周年了,同时发布了 2.0 正式版,但这只是开始...

两年前&#xff0c;我开始接触 Vue.js 框架&#xff0c;当时就被它的轻量、组件化和友好的 API 所吸引。之后我将 Vue.js 和 Webpack 技术栈引入我的公司&#xff08;TalkingData&#xff09;可视化团队&#xff0c;并经过一年多的实践&#xff0c;现已成为整个公司的前端开发规…

Hawtio和Apache JClouds

介绍 我最近花了一些时间为Hawtio开发 Apache Jclouds插件。 尽管还有很多待完成的工作&#xff0c;但我无法激动&#xff0c;想分享…… 这个Hawtio到底是什么&#xff1f; 每当我注意到一个很酷的开源项目时&#xff0c;我通常都会订阅邮件列表&#xff0c;以便我可以更好地…

【转】安全加密(一):这些MCU加密方法你都知道吗?

本文导读 随着物联网和边缘计算的出现&#xff0c;五花八门的MCU也被应用其中&#xff0c;如何保证我们的程序安全和知识产权不受侵犯呢&#xff0c;本文我们将对主流MCU的程序加密进行讲解&#xff0c;希望能够帮助你选择最适合自己应用的微处理器。 1. MCU加密 通常所说的MC…

浅谈Vue内置component组件的应用场景

官方的说明 渲染一个“元组件”为动态组件。依 is 的值&#xff0c;来决定哪个组件被渲染。 <!-- 动态组件由 vm 实例的属性值 componentId 控制 --> <component :is"componentId"></component>具体可以官网文档中的 动态组件内置的组件compone…