日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaFX中的塔防(3)

發布時間:2023/12/3 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaFX中的塔防(3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在最后一部分中,您了解了如何創建Sprite,為其設置動畫并賦予其Behavior。 但是動畫效果不是很好,因為作為Insectoid,您應該始終看起來在飛行中。 記住:安全第一! 我們可以通過創建自定義的TileSetAnimation輕松地做到這一點:

public class RotatingTileSetAnimation extends TileSetAnimation {private double angle = 0;public RotatingTileSetAnimation(TileSet set, int[] indices, float speed) { super(set, indices, speed); }public void setAngle(double angle) { this.angle = angle; }@Override public void render(Sprite sprite, GraphicsContext context, float alpha, long delta) { context.save(); context.translate(sprite.getWidth() / 2, sprite.getHeight() / 2); context.rotate(angle); context.translate(-sprite.getWidth() / 2, -sprite.getHeight() / 2); super.render(sprite, context, alpha, delta); //To change body of generated methods, choose Tools | Templates. context.restore(); } }

我們可以根據x和y速度計算旋轉角度,并在渲染之前在我們的GraphicsContext中進行設置。 所以這是一個子類:

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. } }

結果如下:

很簡單,不是嗎? 現在,下一步將是添加一些行為到假肢本身。 我希望他們總是檢查最接近的敵人并將大炮指向它。 首先,我稍微修改了代碼,然后將炮塔再次分為基地和大炮。 因此,當您現在選擇一門大炮時,炮塔基座將放置在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()); } } }

所以這是現在的樣子:

接下來,我們添加大炮。 雖然炮塔基地是簡單的瓦片,但我們的大炮必須是精靈,因此我們可以向它們添加“行為”:

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并簡單地設置角度,以便大炮指向最近的敵人。 這是我們得到的:

教程的這一部分就是這樣。 我們創建了一些自定義動畫,以使Insectoids朝正確的方向顯示,并使炮塔始終指向關閉目標。 從這些示例中可以看到,游戲引擎試圖使向“行為”添加行為非常簡單。 在下一部分中,我們將對炮塔進行射擊。

參考:來自我們的JCG合作伙伴 Toni Epple的JavaFX(3)中的塔防技術,來自Eppleton博客。

翻譯自: https://www.javacodegeeks.com/2013/10/tower-defense-in-javafx-3.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的JavaFX中的塔防(3)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。