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

javafx中的tree_JavaFX中的塔防(3)相关推荐

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

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

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

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

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

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

  4. javafx中的tree_JavaFX中的塔防

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

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

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

  6. 《明日方舟》的塔防元素:是鸡肋还是精髓?

    我曾经不止一次的提到过一款国产的二次元塔防手游--它正是鹰角网络出品的<明日方舟>. 明日方舟 2019年4月30日ios开服,5月1日安卓端开服,几个月内的ios氪金榜多次登顶,这样的赫 ...

  7. JavaFX中的塔防(6)

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

  8. JavaFX中的塔防(5)

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

  9. JavaFX中的塔防(4)

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

最新文章

  1. Finalize/Dispose/Destructor
  2. jdk1.8api中文版下载(帮助文档)
  3. 最大公约数(Greatest_Common_Divisor)
  4. gradle的二进制版本_Gradle入门:创建二进制分发
  5. iOS:苹果内购实践
  6. Python四:HoughCircles()霍夫变换
  7. php数组的奇数_PHP - 查找数组元素是奇数还是偶数
  8. 04. Make sure that objects are initialized before they're used
  9. input输入框大小设置_Qualtrics调查问卷设计1-如何在输入框前后添加辅助文字
  10. 用ABAP编程破解世界上最难数独游戏
  11. MATLAB热障涂层成像,考虑孔隙细观特征的热障涂层脱粘缺陷超声检测数值模拟
  12. 世界各地区5G信道一览表[转载,仅作保存使用]
  13. python怎么转义_python怎么转义
  14. 微信小程序如何进行反编译详细教程
  15. docker 搭建在线vscode编辑器
  16. 精品慕课资源推荐 计算机网络
  17. matlab怎么求三次微分,Matlab – 求解三阶微分方程
  18. 胡睿:感谢清华大学计算机系的朱仲涛老师
  19. 2022流动式起重机司机复训题库及答案
  20. WPS JS 宏实现表间导入

热门文章

  1. 面试官让我讲下线程的WAITING状态,我笑了
  2. layer之jquery 弹窗插件 (最后版本v1.8.5)
  3. Eclipse 4.9 正式发布,支持 Java 11
  4. 彻底理解正向代理和反向代理
  5. Java 内存泄露总结
  6. 【LSB】图片隐写主体函数
  7. 家的味道,家的感觉!!!
  8. 考研生的努力程度是有多恐怖!
  9. Feign数据压缩传输
  10. 打开数据库_数据库客户端navicat遇到问题怎么办?