javafx中的tree_JavaFX中的塔防(3)

javafx中的tree

在最后一部分中,您了解了如何创建Sprite,为其设置动画并赋予其Behavior。 但是动画效果不是很好,因为作为Insectoid,您应该总是在飞行的地方看。 记住:安全第一! 我们可以通过创建自定义的TileSetAnimation轻松地做到这一点:

public class RotatingTileSetAnimation extends TileSetAnimation {private double angle = 0;public RotatingTileSetAnimation(TileSet set, int[] indices, float speed) {
super(set, indices, speed);
}public void setAngle(double angle) {
this.angle = angle;
}@Override
public void render(Sprite sprite, GraphicsContext context, float alpha, long delta) {
context.save();
context.translate(sprite.getWidth() / 2, sprite.getHeight() / 2);
context.rotate(angle);
context.translate(-sprite.getWidth() / 2, -sprite.getHeight() / 2);
super.render(sprite, context, alpha, delta); //To change body of generated methods, choose Tools | Templates.
context.restore();
}
}

我们可以根据x和y速度计算旋转角度,并在渲染之前在我们的GraphicsContext中进行设置。 因此,这里有一个子类可以做到这一点:

public class LookAheadTileSetAnimation extends RotatingTileSetAnimation {public LookAheadTileSetAnimation(TileSet set, int[] indices, float speed) {
super(set, indices, speed);
}@Override
public void render(Sprite sprite, GraphicsContext context, float alpha, long delta) {
setAngle(Math.toDegrees(Math.atan2(sprite.getVelocityY(), sprite.getVelocityX())));
super.render(sprite, context, alpha, delta); //To change body of generated methods, choose Tools | Templates.
}
}

结果如下:

很简单,不是吗? 现在,下一步将是添加一些行为到假肢本身。 我希望他们总是检查最接近的敌人并将大炮指向它。 首先,我稍微修改了代码,然后将炮塔再次分为基地和大炮。 因此,当您现在选择一门大炮时,炮塔基座将放置在名为“炮塔基座”的TileLayer中。 我只是更改了TurretView类以支持此功能:

class TileSetView extends StackPane {Canvas canvas;
TileSet cannons;
TileSet bases;
int selectedIndex = 0;
Color selected = Color.rgb(100, 100, 255, .2);public TileSetView() {
}public void setTileSet(final TileSet bases, final TileSet cannons) {
this.cannons = cannons;
this.bases = bases;
getChildren().clear();
ImageView turretBases = new ImageView();
turretBases.setImage(bases.getTileImage());ImageView turretCannons = new ImageView();
turretCannons.setImage(cannons.getTileImage());getChildren().addAll(turretBases, turretCannons);canvas = new Canvas(cannons.getTileImage().getWidth(), cannons.getTileImage().getHeight());
getChildren().add(canvas);
canvas.setOnMouseClicked(new EventHandler() {
@Override
public void handle(MouseEvent t) {
double x = t.getX();
double y = t.getY();
selectedIndex = (int) ((int) x / cannons.getTilewidth() + (((int) y / cannons.getTileheight()) * cannons.getNumColumns()));
updateCanvas();
}
});
updateCanvas();
}public int getSelectedGid() {
if (bases == null) {
return -1;
}
return bases.getFirstgid() + selectedIndex;
}public int getSelectedIndex(){
return selectedIndex;
}public void updateCanvas() {
GraphicsContext graphicsContext2D = canvas.getGraphicsContext2D();
graphicsContext2D.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
if (selectedIndex >= 0) {
graphicsContext2D.setFill(selected);
int x = selectedIndex % cannons.getNumColumns();
int y = selectedIndex / cannons.getNumColumns();
graphicsContext2D.fillRect(x * cannons.getTilewidth(), y * cannons.getTileheight(), cannons.getTilewidth(), cannons.getTileheight());
}
}
}

所以这是现在的样子:

接下来,我们添加大炮。 虽然炮塔基地是简单的瓦片,但我们的大炮必须是精灵,因此我们可以向它们添加“行为”:

public class CannonSprite extends Sprite {RotatingTileSetAnimation rotateAnimation;public CannonSprite(GameCanvas parent, RotatingTileSetAnimation animation, String name, double x, double y, int width, int height) {
super(parent, animation, name, x, y, width, height, Lookup.EMPTY);
this.rotateAnimation = animation;
addBehaviour(new SpriteBehavior() {
@Override
public boolean perform(Sprite sprite) {
Sprite closest = null;
double dist = Double.MAX_VALUE;
Collection sprites = sprite.getParent().getSprites();
for (Sprite sprite1 : sprites) {
if (sprite1 instanceof EnemySprite) {
double distance = distance(getX(), getY(), sprite1.getX(), sprite1.getY());
if (distance < dist) {
dist = distance;
closest = sprite1;
}
}
}
if (closest != null) {
rotateAnimation.setAngle(Math.toDegrees(Math.atan2(closest.getY() - sprite.getY(),closest.getX() - sprite.getX())));
}return true;
}
});
}public double distance(double x1, double y1, double x2, double y2) {
return Math.sqrt(
(x1 - x2) * (x1 - x2)
+ (y1 - y2) * (y1 - y2));
}
}

再次,我使用RotatingTileSetAnimation并简单地设置角度,以便大炮指向最近的敌人。 这是我们得到的:

在本部分教程中就是这样。 我们创建了一些自定义动画,以使Insectoids朝正确的方向显示,并使炮塔始终指向关闭目标。 从这些示例中可以看到,游戏引擎试图使将行为添加到Sprite变得非常简单。 在下一部分中,我们将对炮塔进行射击。

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

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

javafx中的tree

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

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

相关文章

ie浏览器升级_IE 被微软专家从浏览器里除名了,专家说它只是个兼容性解决方案...

随着 Chrome 等第三方浏览器的崛起&#xff0c;以及微软 Edge 浏览器的替代&#xff0c;家喻户晓的 IE 浏览器正在走向边缘化。2016 年&#xff0c;IE 浏览器的市场份额下跌了 55%。随之而来着来的还有用户的种种恶搞&#xff0c;IE 的反应慢、易崩溃都成了读者制图时讽刺的目标…

谱修正 matlab,自适应谱修正LU分解法解算高病态法方程

自适应谱修正LU分解法解算高病态法方程谱修正迭代算法及其改正算法均没有很好地解决收敛速度与降低矩阵病态性之间的矛盾,且改进算法的阻尼因子缺乏有效的确定方法。针对该问题,提出自适应谱修正(本文共5页)阅读全文>>随着固体激光向高能量和超短脉冲方向快速发展,其对高…

dos命令行设置网络优先级_替代windows系统下cmd的10款命令行工具

喜欢用linux系统的或者从事开发编程的朋友可能会经常用到命令行工具&#xff0c;下面会整理一些windows下命令行工具。1.powershell系统自带powershell它可以说cmd的升级版、补充版&#xff0c;PowerShell需要.NET环境的支持&#xff0c;借助.NET Framework平台强大的类库&…

Spring Cloud Gateway –配置简单路由

可以将Spring Cloud Gateway视为Spring Cloud Netflix Zuul项目的后续产品&#xff0c;并有助于在微服务环境中实现Gateway模式 。 它建立在 Spring Boot 2和Spring Webflux端到端都是无阻塞的-它公开了一个基于Netty的服务器&#xff0c;使用基于Netty的客户端进行下游微服务…

win7台式电脑怎么连wifi_台式电脑怎么用wifi网络

现在很多朋友的手机使用的都是wif网络&#xff0c;既然手机可以用wifi&#xff0c;那么电脑怎么用wifi呢&#xff0c;其实电脑用wifi的方法也有很多种&#xff0c;为了大家通俗易懂&#xff0c;先来说一种简单的方法吧&#xff01;台式电脑怎么用wifi网络1、首先必须要有一个无…

敏感词库php数组,PHP 实现敏感词 / 停止词 过滤(附敏感词库),敏感类词语大全...

PHP 实现敏感词 / 停止词 过滤(附敏感词库)PHP实现了敏感词/停用词过滤(带敏感词库)&#xff0c;过滤敏感单词和字符是网站&#xff0c;的一项基本功能&#xff0c;因此有必要设计一个好的、高效的过滤算法。在敏感词过滤算法中&#xff0c;必须减少计算量&#xff0c;而DFA算法…

分子动力学模拟软件_功能玻璃专题——分子动力学模拟预测氧化钠含量对二元钠硅酸盐玻璃弹性模量的影响...

赵 谦 1&#xff0c;祖 群 1&#xff0c;齐 亮 2&#xff0c;胡永杰 2&#xff0c;孙雪坤3&#xff0c;陈 阳 1(1. 中材科技股份有限公司&#xff0c;中国南京 210012&#xff1b;2. 美国密歇根大学&#xff0c;美国密歇根州安娜堡 48109-236&#xff1b; 3. 美国大陆地科技…

javafx中的tree_JavaFX中的塔防(2)

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

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、必须清楚“十字交叉法”运用后的比例比系——“看分母”法则。即特性数值的分母所…