JavaFX:創建Sprite動畫

到目前為止,盡管我的大多數文章都涉及JavaFX屬性和綁定,但今天我想寫一講我也致力于JavaFX運行時的另一部分:動畫API。

在本文中,我將解釋如何在JavaFX中編寫自定義動畫,以及如何使用這種方法為Sprite動畫創建類。 (這對我在33rd Conference上的會議來說也是一種好習慣。我計劃在短短一個小時內用JavaFX編寫一個游戲。這將很有趣!) :-)

運動中的馬


有很多非常好的文章介紹了預定義的過渡(TranslateTransition,RotateTransition等)和時間表。 在大多數情況下,這些方法是足夠的,但在某些情況下,只需要更大的靈活性即可。 這就是Transition類開始起作用的時候,可以擴展該類以定義自定義動畫。 要通過擴展Transition編寫自己的動畫類,需要兩個步驟:

  1. 指定一個周期的持續時間
  2. 實現interpolate()方法

一個周期的持續時間

您可以通過調用受保護的方法setCycleDuration()來設置周期的持續時間。 在大多數情況下,持續時間是固定的(如果動畫僅使用一次)或可由用戶配置。 JavaFX運行時中幾乎所有預定義的轉換都屬于第二類。 他們通過duration屬性公開了周期的持續時間,您可能也想在您的課程中做到這一點。 在極少數情況下,循環的持續時間取決于其他值。 例如,SequentialTransition和ParallelTransition的持續時間取決于其子代的持續時間。
您可以隨意更改循環持續時間,但是請注意,它不會影響當前正在運行的動畫。 只有在動畫停止并重新開始之后,才考慮新的循環持續時間。

interpolate()方法

interpolate()方法是抽象的,需要重寫。 它定義了動畫的實際行為。 播放動畫時,運行時在每幀中調用interpolate()方法。 傳入值frac,0.0到1.0之間的雙精度值(包括兩端值),用于指定當前位置。 值0.0標記動畫的開始,值1.0標記動畫的結束。 之間的任何值都定義相對位置。 請注意,計算frac的值時已經考慮了可能的內插器。

類SpriteAnimation

為了演示如何定義自定義過渡,我們將看一個允許我們制作Sprite動畫的類。 它會拍攝具有幾幀的圖像,然后將視口隨時間從一幀移到另一幀。 我們將用Eadweard Muybridge著名的“運動中的馬”測試這一節課。 聊夠了,這里是代碼:

package sandboxfx;import javafx.animation.Interpolator;
import javafx.animation.Transition;
import javafx.geometry.Rectangle2D;
import javafx.scene.image.ImageView;
import javafx.util.Duration;public class SpriteAnimation extends Transition {private final ImageView imageView;private final int count;private final int columns;private final int offsetX;private final int offsetY;private final int width;private final int height;private int lastIndex;public SpriteAnimation(ImageView imageView, Duration duration, int count,   int columns,int offsetX, int offsetY,int width,   int height) {this.imageView = imageView;this.count     = count;this.columns   = columns;this.offsetX   = offsetX;this.offsetY   = offsetY;this.width     = width;this.height    = height;setCycleDuration(duration);setInterpolator(Interpolator.LINEAR);}protected void interpolate(double k) {final int index = Math.min((int) Math.floor(k * count), count - 1);if (index != lastIndex) {final int x = (index % columns) * width  + offsetX;final int y = (index / columns) * height + offsetY;imageView.setViewport(new Rectangle2D(x, y, width, height));lastIndex = index;}}
}
清單1:SpriteAnimation類

為了簡單起見,此示例類僅接受構造函數中的所有參數,不允許以后更改它們。 在大多數情況下,這就足夠了。
該類需要一個ImageView,一個周期的持續時間(即遍歷所有幀應花費的時間),幀數,列數(圖像中的一行中有多少幀),第一幀的偏移量以及所有幀的寬度和高度。 通過調用setCycleDuration()將整個周期的持續時間傳遞給超類,并存儲所有其他值。 作為構造函數的最后一步,將內插器設置為線性。 默認情況下,為所有過渡設置緩動插值器,因為通常這會產生最佳效果。 但是在我們的例子中,我們希望以相同的速度遍歷所有幀,并且緩和插值器看起來很奇怪。 interpolate()方法采用傳入的值并計算當前需要顯示的幀。 如果自上次調用interpolate()以來它發生了變化,則將計算新幀的位置,并相應地設置ImageView的視口。 而已。

運動中的馬

為了演示SpriteAnimation類,我們將對“運動中的馬”進行動畫處理。 做到這一點的代碼很簡單,大部分工作已經完成。 它創建一個將視口設置為第一幀的ImageView,并實例化SpriteAnimation類。 參數僅是估計值,您可能需要對其進行一些調整。

package sandboxfx;import javafx.animation.Animation;
import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import javafx.util.Duration;public class SandboxFX extends Application {private static final Image IMAGE = new Image("http://upload.wikimedia.org/wikipedia/commons/7/73/The_Horse_in_Motion.jpg");private static final int COLUMNS  =   4;private static final int COUNT    =  10;private static final int OFFSET_X =  18;private static final int OFFSET_Y =  25;private static final int WIDTH    = 374;private static final int HEIGHT   = 243;public static void main(String[] args) {launch(args);}public void start(Stage primaryStage) {primaryStage.setTitle("The Horse in Motion");final ImageView imageView = new ImageView(IMAGE);imageView.setViewport(new Rectangle2D(OFFSET_X, OFFSET_Y, WIDTH, HEIGHT));final Animation animation = new SpriteAnimation(imageView,Duration.millis(1000),COUNT, COLUMNS,OFFSET_X, OFFSET_Y,WIDTH, HEIGHT);animation.setCycleCount(Animation.INDEFINITE);animation.play();primaryStage.setScene(new Scene(new Group(imageView)));primaryStage.show();}
}
清單2:JavaFX中的動靜

結論

通過擴展Transition類來定義自己的動畫非常簡單。 但是,這是一種非常強大的方法,因為以這種方式創建的動畫具有常規動畫所具有的所有功能。 例如,您可以通過更改速率來越來越慢地播放它,甚至可以向后播放它。 您可以循環運行它,也可以在ParallelTransition和SequentialTransition中使用它來創建更復雜的動畫。

參考: JCG合作伙伴 Michael Heinrichs 使用JavaFX創建Sprite動畫 ? 在Mike的Blog上 。


翻譯自: https://www.javacodegeeks.com/2012/03/javafx-creating-sprite-animation.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373404.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373404.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java tick_Java中的Clock tick()方法

可以使用tick()Java中Clock類中的方法在所需的時間范圍內舍入基本時鐘的瞬間。此方法需要兩個參數,即基本時鐘和滴答的持續時間。同樣,返回在所需持續時間內四舍五入的基本時鐘時刻。演示此的程序如下所示-示例import java.time.*;public class Main {pu…

JAVA 常用框架和工具

集成開發工具(IDE):Eclipse、MyEclipse、Spring Tool Suite(STS)、Intellij IDEA、NetBeans、JBuilder、JCreator JAVA服務器:tomcat、jboss、websphere、weblogic、resin、jetty、apusic、apache 負載均衡…

MySQL Doublewrite Buffer及業務評估

1. 關于Doublewrite Buffe的總結 Doublewrite Buffer:Doublewrite Buffer出現的初衷是防止buffer pool中的臟頁刷新到磁盤中,出現部分寫的問題,innodb頁大小一般為16k,而Linux操作系統的block size一般為4k。這樣在刷新的過程中&a…

使用UIBinder的GWT自定義按鈕

這是一個有關如何在GWT上使用UIBinder創建自定義按鈕的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandler(){Overridepub…

delete postman 傳參_PostMan 傳參boolean 類型,接口接受的值一直是false

情形:最近寫前臺頁面的一個按鈕,功能是:點擊后切換狀態,顯示是或否。字段名稱是isTest,類型是boolean 。寫完接口,拿postMan測試,傳參如下:但是后臺接口接受的數據 一直是false,處理&#xff1a…

前端學PHP之文件操作

前端學PHP之文件操作 前面的話 在程序運行時,程序本身和數據一般都存在內存中,當程序運行結束后,存放在內存中的數據被釋放。如果需要長期保存程序運行所需的原始數據,或程序運行產生的結果,就需要把數據存儲在文件或數…

騰訊云CentOS6.5下安裝mysql,并配置好遠程訪問等權限,途中遇到的問題

1.使用yum命令安裝mysql [rootbogon ~]# yum -y install mysql-server 2.設置開機啟動 [rootbogon ~]# chkconfig mysqld on 3.啟動MySQL服務 [rootbogon ~]# service mysqld start 4.設置MySQL的root用戶設置密碼 [rootbogon ~]# mysql -u root mysql> select u…

休眠性能提示:臟收集效果

在使用Hibernate作為ORM開發服務器和嵌入式應用程序8年后,我全力以赴地尋求提高Hibernate性能的解決方案,閱讀博客和參加會議,我決定與您分享這幾年獲得的知識。 這是更多新帖子中的第一篇: 去年,我以Devoxx的身份參加…

java runtime 異常_Java中RuntimeException和Exception

在java的異常類體系中,Error和RuntimeException是非檢查型異常,其他的都是檢查型異常。所有方法都可以在不聲明throws的情況下拋出RuntimeException及其子類不可以在不聲明的情況下拋出非RuntimeException簡單的說,非RuntimeException必要自己寫catch塊處…

BZOJ3130: [Sdoi2013]費用流[最大流 實數二分]

3130: [Sdoi2013]費用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 505[Submit][Status][Discuss]Description Alice和Bob在圖論課程上學習了最大流和最小費用最大流的相關知識。 最大流問題:給定一張有向圖表示運輸網絡…

Linux Shell 003-變量

Linux Shell 003-變量 本節關鍵字:Linux、Shell、變量、全局變量、系統變量 相關指令:read、echo、unset、export 變量的含義 變量是用來臨時保存數據的,該數據是可以變化的數據。如果某個內容需要多次使用,并且在代碼中重復出現…

Java自動機實現

這篇文章將解決在Java中實現有限狀態機的問題。 如果您不知道什么是FSM或在什么地方可以使用FSM,您可能會熱衷于閱讀此 , 這個和這個 。 如果您發現自己在設計上使用FSM的情況,則可能已經開始為實現相同接口的每個狀態編寫類。 一個好的設計可…

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files這個文件找不到

在C:\Windows\Microsoft.NET\Framework64\v4.0.30319文件夾下面建立Temporary ASP.NET Files 文件夾(Framework64 注意64,這個可能是我們用的64位系統,但是vs2010不分32位還是64位,所以在C:\Windows\Microsoft.NET\Framework\v4.0…

java電腦運行視頻演示_javaweb視頻第一天(二)

無論通過哪種方式得到的class類對象,是同一個。比較的是地址碼這里教會你:如何去使用class對象現在就知道這個:如何使用反射,并且說反射是實現了什么樣的功能。如何通過反射得到里面的相應字段,得到里面的相應函數等等…

模型驅動 ModelDriven

ModelDriven:模型驅動,對所有action的模型對象進行批處理. 我們在開發中, 在action中一般是用實體對象,然后給實體對象get,set方法。 RegAction{   User user ;   //get/set} 然后在jsp頁面中給action中的user屬性綁定值是通過如下方式 &…

本月風味– Neo4j和Heroku

Neo4j今年早些時候發起了一項挑戰,即“ 種子播云 ”,以使人們使用Neo4j附加組件在Heroku上創建模板或演示應用程序。 經過許多內部辯論之后,我決定進入,但由于缺乏想法而陷入絕望。 當我什么都沒做的時候,這個主意就出…

1 + 11 + 1111+ 11111+ ..... + 11111(2016個) 結果是幾位數

# -*- coding: utf-8 -*- """ Created on Mon Mar 21 20:38:06 2016author: yanjie """1 11 1111 11111 ..... 11111(2016個) 結果是幾位數 用什么數據結構 有幾個6 寫算法a []; m 0; six 0; for i in range(2016,0,-1):b (im) % 10;m (…

[回歸分析][10]--相關誤差的問題

[回歸分析][10]--相關誤差的問題這一篇文章還是來分析相關誤差的問題。 1.游程數 定義:游程數--殘差穿過x-軸的次數 用這個可以檢查如殘差有一塊在x軸上面,一塊在x軸下面的情形。 如上面這樣的殘差 下面構造兩個統計量: 其中 n…

Spring 3 MVC異常處理程序

我遇到的大多數Spring 3錯誤處理示例代碼似乎都提供了其用法的最簡單概述,但是,有人說,如何處理錯誤比正常代碼的工作方式更為重要。 前一天,當我在Spring(2)錯誤處理程序中遇到一個簡單的GOTCHA時&#xf…

java編譯找不到符號_javac編譯時找不到符號?

我是個新手,在linux使用java編程時,出現這個情況。我把要引的包放在classpath中,紅色部分:export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$HADOOP_HOME/hadoop-1.0.4.core.jar:${CLASSPATH}通過echo $CLASSP…