JavaFX中的塔防(4)
好的,到目前為止,我們已經(jīng)創(chuàng)建了一個(gè)TileMap,將其顯示在屏幕上,并使其在第一部分中可編輯。 在第二部分中,我們使用A *算法實(shí)現(xiàn)了攻擊路徑的計(jì)算,并使敵人跟隨該路徑。 在第三部分中,我們創(chuàng)建了一些自定義的TileSetAnimations,以便我們可以將Insectoids圍繞它們的中心旋轉(zhuǎn)一個(gè)角度。 然后,我們將其應(yīng)用于Insectoids,以便它們在飛行時(shí)會向前看,并朝向轉(zhuǎn)塔,因此它們始終會瞄準(zhǔn)最接近的目標(biāo)。 是時(shí)候讓炮塔向敵人射擊了。
首先,我們需要使用TileSets進(jìn)行爆炸,并需要使用Pellet槍的子彈。 我在這里找到了一個(gè)不錯(cuò)的免費(fèi)爆炸片。 它比Sprite更大(128 * 128),并且爆炸沒有在中心開始,但是在擺弄相對于爆炸類昆蟲的位置后,效果很好。 我自己創(chuàng)建了子彈,我知道我必須想出更好的東西:-),但是至少它在屏幕上可見。 擺弄正確的初始位置后,我創(chuàng)建了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. } });大部分代碼都在計(jì)算初始位置,并確保子彈朝正確的方向前進(jìn)。 現(xiàn)在我們需要添加一些碰撞檢測。 一些系統(tǒng)確實(shí)具有集中式碰撞系統(tǒng),并允許添加偵聽器。 我更喜歡通過行為來再次執(zhí)行此操作,因?yàn)槲野l(fā)現(xiàn)子彈本身會檢查它是否擊中了東西,這更加自然和直觀:
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的碰撞,并在它是敵人的情況下嘗試造成傷害。 匿名的內(nèi)部項(xiàng)目符號Sprite和Behavior將在以后轉(zhuǎn)換為常規(guī)類,以使代碼更好,并使它們更易于創(chuàng)建和配置。 在敵人精靈的一邊,我們需要實(shí)現(xiàn)“命中”方法:
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并添加一個(gè)爆炸Sprite。 如果精靈大小匹配,我們可以簡單地在現(xiàn)有Sprite上設(shè)置爆炸動畫。 如果可以創(chuàng)建自己的SpriteSheets,則應(yīng)該這樣做,這樣會使工作變得更加容易。 ExplosionAnimation配置為僅運(yùn)行一次,并且它具有EventHandler,一旦完成Animation,該事件處理程序?qū)h除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); } }); 而已。 我們的炮塔現(xiàn)在將向敵人發(fā)射子彈,并試圖傷害他們,直到它們爆炸:
在視頻中,您還可以看到DebugLayer。 當(dāng)前,它跟蹤一些性能數(shù)據(jù),主要是FPS,以及兩個(gè)脈沖之間的時(shí)間是否太長。 我還在屏幕頂部添加了一個(gè)項(xiàng)目符號,以直觀地檢測出卡頓的動畫。 您可以放心地忽略...
因此,現(xiàn)在我們幾乎擁有了塔防類型游戲所需的一切。 在本教程的下一部分中,我們將為敵人添加傷害指示器,并向HUD添加得分和控件以開始下一波攻擊。
翻譯自: https://www.javacodegeeks.com/2014/03/tower-defense-in-javafx-4.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的JavaFX中的塔防(4)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 参数化的JUnit测试
- 下一篇: 小米MIX Flip名称通过IMEI确认