javafx中的tree
好的,到目前为止,我们已经创建了一个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可以删除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添加得分和控件以开始下一波攻击。
翻译自: https://www.javacodegeeks.com/2014/03/tower-defense-in-javafx-4.html
javafx中的tree