JavaFX中的塔防(3)

在最后一部分中,您了解了如何创建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朝正确的方向显示,并使炮塔始终指向关闭目标。 从这些示例中可以看到,游戏引擎试图使向“行为”添加行为非常简单。 在下一部分中,我们将对炮塔进行射击。

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

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

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

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

相关文章

day21 pickle json shelve configpaser 模块

1. 序列化:我们在网络传输的时候,需要我们对对象进行处理,把对象处理成方便存储和传输的格式,这个过程就叫序列化 序列化的方法不一定一样,三十目的都是为了方便储存和传输. 在python中有三种序列化方案: 1. pickle 可以将我们python中任意数据类型转化为bytes写入文件中…

flex.css快速入门,极速布局

什么是flex.css? css3 flex 布局相信很多人已经听说过甚至已经在开发中使用过它&#xff0c;但是我想我们都会有一个共同的经历&#xff0c;面对它的各种版本&#xff0c;各种坑&#xff0c;傻傻的分不清楚&#xff0c;flex.css就是对flex布局的一种封装&#xff0c;通过简洁…

计算机英语阅读路线,高考英语阅读理解真题解析·计算机运用

说明:引用此文请注明出处,并务请保留后面的有效链接地址,谢谢&#xff01;高考英语阅读理解真题解析计算机运用Computer people talk a lot about the need for other people to become“computer-literate.”But not all experts(专家) agree that this is a good idea.One pi…

优化Angularjs的$watch方法

Angularjs的$watch相信大家都知道&#xff0c;而且也经常使用&#xff0c;甚至&#xff0c;你还在为它的某些行为感到恼火。比如&#xff0c;一进入页面&#xff0c;它就会调用一次&#xff0c;我明明希望它在我初始化之后&#xff0c;值再次变动才调用。这种行为给我们带来许多…

JavaFX中的塔防(2)

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

微软edge浏览器不显示图片问题

用HBuider写的Web项目&#xff0c;项目名如果包含中文&#xff0c;edge下无法显示图片转载于:https://www.cnblogs.com/phoenixBlog/p/9964820.html

计算机辅助设计基础学什么,东大计算机辅助设计基础X20秋学期《计算机辅助设计基础》在线平时作业3资料...

计算机辅助设计基础X20秋学期《计算机辅助设计基础》在线平时作业36 e0 Y; q) j3 q3 c1.[单选题] 根据集成水平的不同&#xff0c;基于PDM的应用集成可分为3个层次&#xff0c;下面哪一个不在其中&#xff1f; 8 R- M/ w3 C& P" [ n. 答案资料下载请参考帮助中心说明…

在Python工作环境中安装包命令后加上国内源速度*15

example: pip install -r requests.txt -r https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn 转载于:https://www.cnblogs.com/xiangribai/p/9243426.html

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

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

Mongo 查询(可视化工具)

distinct MongoDB 的 distinct 命令是获取特定字段中不同值列表的最简单工具。 该命令适用于普通字段、数组字段以及数组内嵌文档&#xff08;集合对象&#xff09;。 db.getCollection(customer).distinct("customer_type")// chances字段的值是个集合&#xff0c;获…

使用JAX-RS的HTTP缓存

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

前端模块化,AMD与CMD的区别

原创 2016年08月03日 17:15:51标签&#xff1a;javascript /模块化 /前端21234最近在研究cmd和amd&#xff0c;在网上看到一篇不错的文章&#xff0c;整理下看看。 在JavaScript发展初期就是为了实现简单的页面交互逻辑&#xff0c;寥寥数语即可&#xff1b;如今CPU、浏览器性能…

上财的计算机专业408,【2020考研】上财408分经验分享

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼数学&#xff0c;三月份到四月中旬把本科教材看了一遍。事实上还是有用的。比如&#xff0c;今年的二阶差分。看似超纲&#xff0c;其实不超纲。大纲要求认识二阶差分的形式&#xff0c;会解一阶差分方程。那道题恰好是用二阶差分表…

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;但由于…

Jedis入门

嗨&#xff0c;这些天我开始研究Redis。 我听说过很多&#xff0c;所以我决定尝试一下。 Redis在其网站上定义为“ 开源高级键值存储”。 它通常被称为数据结构服务器&#xff0c;因为键可以包含字符串&#xff0c;哈希&#xff0c;列表&#xff0c;集合和排序集合 。 在“ S…

美团点评云真机平台实践

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

docker 出现 Error response from daemon

第一步&#xff1a;通过dig 114.114.114.114 registry-1.docker.io找到可用IP navydeepin:~/Desktop$ dig 114.114.114.114 registry-1.docker.io; <<>> DiG 9.11.3-1-Debian <<>> 114.114.114.114 registry-1.docker.io ; (1 server found) ;; global…

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

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

vue基础篇---vue组件

vue模块第一篇&#xff0c;因为公司马上要用到这vue开发。早就想好好看看vue了。只有实际工作中用到才会进步最快。vue其他的简单指令就不多讲了&#xff0c;没啥意思&#xff0c;网上一大堆。看w3c就ok。 组件这个我个人感觉坑蛮多的&#xff0c;所以特地记录一下。 简单总结一…