javafx中的tree_JavaFX中的塔防(4)
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
總結
以上是生活随笔為你收集整理的javafx中的tree_JavaFX中的塔防(4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javafx中的tree_JavaFX中
- 下一篇: 笔记本电脑的选择建议买笔记本电脑的建议