在最后一部分中,您了解了如何创建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

JavaFX中的塔防(3)相关推荐

  1. JavaFX中的塔防(5)

    这是本使用FXGameEngine在JavaFX中创建塔防游戏的正在进行的教程的第5部分. 敌人现在飞向目标的攻击路径,炮塔瞄准并射击. 因此,最重要的部分在那里,但是仍然缺少许多细节. 游戏只是开始 ...

  2. JavaFX中的塔防

    我想长时间使用我的游戏引擎来编写<塔防>游戏,但是由于另一个小组努力创建JavaFX<塔防>游戏,所以我认为我宁愿创建另一款游戏. 从邮件列表中,我了解到不再开发其他游戏. 因 ...

  3. JavaFX中的塔防(2)

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

  4. JavaFX中的塔防(6)

    因此,我们已经在本教程的第6部分中,与此同时,游戏也取得了长足的进步. 在这一部分中,我们最终将添加一个显示得分的图层,已达到目标的敌人数量,启动下一个Wave的按钮以及用于购买新炮塔的资金. 说到钱 ...

  5. JavaFX中的塔防(4)

    好的,到目前为止,我们已经创建了一个TileMap,将其显示在屏幕上,并使其在第一部分中可编辑. 在第二部分中,我们使用A *算法实现了攻击路径的计算,并使敌人跟随该路径. 在第三部分中,我们创建了一 ...

  6. javafx中的tree_JavaFX中的塔防(4)

    javafx中的tree 好的,到目前为止,我们已经创建了一个TileMap,将其显示在屏幕上,并使其在第一部分中可编辑. 在第二部分中,我们使用A *算法实现了攻击路径的计算,并使敌人跟随该路径. ...

  7. javafx中的tree_JavaFX中的塔防(5)

    javafx中的tree 这是有关使用FXGameEngine在JavaFX中创建塔防游戏的本教程的第5部分. 敌人现在飞向目标的攻击路径,炮塔瞄准并射击. 因此,最重要的部分在那里,但是仍然缺少许多 ...

  8. javafx中的tree_JavaFX中的塔防

    javafx中的tree 我想长时间使用我的游戏引擎来编写<塔防>游戏,但是由于另一个小组努力创建JavaFX<塔防>游戏,所以我认为我宁愿创建另一款游戏. 从邮件列表中,我了 ...

  9. javafx中的tree_JavaFX中的塔防(2)

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

最新文章

  1. Ubuntu Apache 服务之 PHP 配置
  2. 可恶的硬件故障(已解决)
  3. tomcat的缺少tcnative-1.dll的解决
  4. 利用ABAP调试器脚本修改数据库表的值
  5. 大话数据结构学习笔记二:算法
  6. Php 取出session中的值,获取php值
  7. (12)数据结构-二叉树基本操作
  8. mysql配置文件在哪_windows下的mysql配置文件在哪
  9. 保存网页html 有什么,保存网页时HTML和MHTML区别在哪里
  10. 用东野圭吾的方式说爱你
  11. 统信软件启用全新LOGO,迎接中国操作系统大时代
  12. 分治算法 循环比赛日程表
  13. Nginx软件介绍及下载地址
  14. JavaScript遍历数组和对象
  15. DVWA 反射型XSS XSS(Reflected)题解
  16. Google 的左手 : 近距离观察 SEO
  17. ERP中自定义报表制作流程
  18. 回归模型(背景和原理)
  19. Samba服务器访问CIFS网络共享文件
  20. 小米模式—互联网思维下的中国“智造”

热门文章

  1. mysql update field_mysql-更新表与另一个选择,但字段是SUM(someField)
  2. 阿里云服务器 window server tomcat启动 并且关闭window防火墙 配置8080端口开放还是没用
  3. php打印 二维数组,PHP中遍历二维数组_以不同形式的输出操作实例
  4. python queue 生产者 消费者_【python】-- 队列(Queue)、生产者消费者模型
  5. python 虚拟环境_理解Python虚拟环境
  6. springboot2.5.5配置druid数据源1.2.8与jdbc
  7. java反射机制+继承设计技巧
  8. java登录界面命令_Java命令行界面(第7部分):JCommander
  9. spring创建web项目_使用Spring WS创建合同优先的Web服务
  10. JDK 11上的JavaFX