javafx中的tree_JavaFX中的塔防(3)
javafx中的tree
在最后一部分中,您了解了如何創(chuàng)建Sprite,為其設(shè)置動畫并賦予其Behavior。 但是動畫效果不是很好,因為作為Insectoid,您應(yīng)該總是在飛行的地方看。 記住:安全第一! 我們可以通過創(chuàng)建自定義的TileSetAnimation輕松地做到這一點:
我們可以根據(jù)x和y速度計算旋轉(zhuǎn)角度,并在渲染之前在我們的GraphicsContext中進(jìn)行設(shè)置。 因此,這里有一個子類可以做到這一點:
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. } }結(jié)果如下:
很簡單,不是嗎? 現(xiàn)在,下一步將是添加一些行為到假肢本身。 我希望他們總是檢查最接近的敵人并將大炮指向它。 首先,我稍微修改了代碼,然后將炮塔再次分為基地和大炮。 因此,當(dāng)您現(xiàn)在選擇一門大炮時,炮塔基座將放置在名為“炮塔基座”的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()); } } }所以這是現(xiàn)在的樣子:
接下來,我們添加大炮。 雖然炮塔基地是簡單的瓦片,但我們的大炮必須是精靈,因此我們可以向它們添加“行為”:
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并簡單地設(shè)置角度,以便大炮指向最近的敵人。 這是我們得到的:
在本部分教程中就是這樣。 我們創(chuàng)建了一些自定義動畫,以使Insectoids朝正確的方向顯示,并使炮塔始終指向關(guān)閉目標(biāo)。 從這些示例中可以看到,游戲引擎試圖使將行為添加到Sprite變得非常簡單。 在下一部分中,我們將對炮塔進(jìn)行射擊。
翻譯自: https://www.javacodegeeks.com/2013/10/tower-defense-in-javafx-3.html
javafx中的tree
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的javafx中的tree_JavaFX中的塔防(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 口秋读什么 口秋读啥
- 下一篇: 坚强的后盾是什么意思 坚强的后盾的意思