好的,到目前为止,我们已经创建了一个TileMap,将其显示在屏幕上,并使其在第一部分中可编辑。 在第二部分中,我们使用A *算法实现了攻击路径的计算,并使敌人跟随该路径。 在第三部分中,我们创建了一些自定义的TileSetAnimations,以便我们可以将Insectoids围绕它们的中心旋转一个角度。 然后,我们将其应用于Insectoids,以便它们在飞行时会向前看,并朝向转塔,因此它们始终会瞄准最接近的目标。 是时候让炮塔向敌人射击了。

首先,我们需要使用TileSets进行爆炸,并需要使用Pellet枪的子弹。 我在这里找到了一个不错的免费爆炸片。 它比Sprite更大(128 * 128),并且爆炸没有在中心开始,但是在摆弄相对于爆炸类昆虫的位置后,效果很好。 我自己创建了子弹,我知道我必须想出更好的东西:-),但是至少它在屏幕上可见。 摆弄正确的初始位置后,我创建了BulletLaunching行为:

new SpriteBehavior() {
@Override
public boolean perform(Sprite sprite) {
double angle = rotateAnimation.getAngle();
double xVelocity = Math.cos(Math.toRadians(angle));
double yVelocity = Math.sin(Math.toRadians(angle));
final double centerX = x + (width / 2);
final double centerY = y + (height / 2);
double startX = centerX + (xVelocity * (width / 2)) - 4;
double startY = centerY + (yVelocity * (height / 2)) - 4;
Sprite bullet = new Sprite(getParent(), shoot, "bullet" + (bulletCounter++), startX, startY,
8, 8, Lookup.EMPTY);
bullet.setVelocityX(xVelocity);
bullet.setVelocityY(yVelocity);
// add bullet behaviorreturn true;
}@Override
public long getEvaluationInterval() {
return 2000000000; //To change body of generated methods, choose Tools | Templates.
}
});

大部分代码都在计算初始位置,并确保子弹朝正确的方向前进。 现在我们需要添加一些碰撞检测。 一些系统确实具有集中式碰撞系统,并允许添加侦听器。 我更喜欢通过行为来再次执行此操作,因为我发现子弹本身会检查它是否击中了东西,这更加自然和直观:

bullet.addBehaviour(new SpriteBehavior() {
private double range = 75;@Override
public boolean perform(Sprite sprite) {
Collection checkCollisions = sprite.getParent().checkCollisions(sprite);
for (Collision collision : checkCollisions) {
if (collision.getSpriteOne() instanceof EnemySprite) {
sprite.getParent().removeSprite(sprite);
((EnemySprite) collision.getSpriteOne()).hit(6);
return false;
} else if (collision.getSpriteTwo() instanceof EnemySprite) {
sprite.getParent().removeSprite(sprite);
((EnemySprite) collision.getSpriteTwo()).hit(6);
return false;
}
}
if (distance(sprite.getX(), sprite.getY(), centerX, centerY) > range) {
sprite.getParent().removeSprite(sprite);
return false;
}
return true;
}
});

我们在这里所做的只是向GameCanvas询问此特定Sprite的碰撞,并在它是敌人的情况下尝试造成伤害。 匿名的内部项目符号Sprite和Behavior将在以后转换为常规类,以使代码更好,并使它们更易于创建和配置。 在敌人精灵的一边,我们需要实现“命中”方法:

public void hit(int impact) {
power = power - impact;
if (power getParent().removeSprite(this);
getParent().addSprite(new Sprite(getParent(), explosionAnimation, "explosion", getX() - 30, getY() - 80, 128, 128, Lookup.EMPTY));
}
}

非常简单:万一命中致命,我们删除Sprite并添加一个爆炸Sprite。 如果精灵大小匹配,我们可以简单地在现有Sprite上设置爆炸动画。 如果可以创建自己的SpriteSheets,则应该这样做,这样会使工作变得更加容易。 ExplosionAnimation配置为仅运行一次,并且它具有EventHandler,一旦完成Animation,该事件处理程序将删除Sprite:

explosionAnimation = new TileSetAnimation(explosion, 100f);
explosionAnimation.setRepeat(1);
explosionAnimation.setOnFinished(new AnimationEventHandler() {
@Override
public void handleEvent(AnimationEvent event) {
Sprite target = event.getTarget();
target.getParent().removeSprite(target);
getParent().removeSprite(EnemySprite.this);
}
});

而已。 我们的炮塔现在将向敌人发射子弹,并试图伤害他们,直到它们爆炸:

在视频中,您还可以看到DebugLayer。 当前,它跟踪一些性能数据,主要是FPS,以及两个脉冲之间的时间是否太长。 我还在屏幕顶部添加了一个项目符号,以直观地检测出卡顿的动画。 您可以放心地忽略...

因此,现在我们几乎拥有了塔防类型游戏所需的一切。 在本教程的下一部分中,我们将为敌人添加伤害指示器,并向HUD添加得分和控件以开始下一波攻击。

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

翻译自: https://www.javacodegeeks.com/2014/03/tower-defense-in-javafx-4.html

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

  1. JavaFX中的塔防(5)

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

  2. JavaFX中的塔防

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

  3. JavaFX中的塔防(2)

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

  4. JavaFX中的塔防(3)

    在最后一部分中,您了解了如何创建Sprite,为其设置动画并赋予其Behavior. 但是动画效果不是很好,因为作为Insectoid,您应该始终看起来在飞行中. 记住:安全第一! 我们可以通过创建自 ...

  5. JavaFX中的塔防(6)

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

  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. router路由react_使用React Router在React中受保护的路由
  2. 计算机考研专业课资料百度云,2020年考研专业课【初试】资料清单
  3. hwclock设置日期_linux中时间设置date、hwclock、clock
  4. 阿里P8架构师整理的架构图你看过吗
  5. “对不起,我们只招父母毕业于名牌院校的孩子”:最可怕的,是你还以为学历不重要...
  6. POJ 2236 - Wireless Network ( 并查集 )
  7. matlab中频谱的实现,如何在MATLAB中实现频谱核函数?
  8. vscode 启用open with live server功能,配置谷歌浏览器chrome
  9. TMEA:源于音乐,高于盛典
  10. 485的信号测试软件,RS485通信测试项目中的压力测试方法、原理及基本测试模型...
  11. Python之遍历文件夹图片并重命名
  12. Android好看的动画欢迎界面(附有详细代码)
  13. python -m的那些实用功能
  14. File和Filelnfo类
  15. 电脑连不上网显示dns服务器不可用,电脑连不上网疑难解答显示DNS服务器可能不可用该怎么办...
  16. 第十三章:项目相关方管理 - (13.1 识别相关方)
  17. 1558_AURIX_TC275_RCU模块中的ESR管脚
  18. vue中的created和mounted函数不生效(created和mounted不管用)?
  19. 使用Scrapy框架爬取88读书网小说,并保存本地文件
  20. 作业要求20190919-2 功能测试

热门文章

  1. 转移指令jmp和跳转指令call
  2. kafka mirror_SSL Kafka经纪人从Kafka Mirror Maker迁移到Brooklin的挑战
  3. mongodb dsl_具有Java DSL的Spring Integration MongoDB适配器
  4. rxjava 并行_使用RxJava和Completable并行执行阻塞任务
  5. 框架中建立浮动框架_建立代理,而不是框架
  6. .jdeveloper_在JDeveloper 12.1.3中为WebSocket使用Java API
  7. eclipse 扩展_Eclipse扩展的轻量级集成测试
  8. 49自动化测试中最常见的硒异常
  9. Spring Boot YAML配置
  10. Java NIO教程