javafx动画_JavaFX:创建Sprite动画

javafx动画

到目前为止,尽管我的大多数文章都涉及JavaFX属性和绑定,但是今天我想写一讲我也致力于JavaFX运行时的另一部分:动画API。

在本文中,我将解释如何在JavaFX中编写自定义动画,以及如何使用这种方法为Sprite动画创建类。 (这对于我在第33次会议上的会议来说也是一种好习惯。我计划在短短一个小时内用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

javafx动画

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java自定义迭代器作用_Java实现的自定义迭代器功能示例

本文实例讲述了Java实现的自定义迭代器功能。分享给大家供大家参考,具体如下:编写自己的Iterator,实现Iterator接口,这里多说一句,实现Iterable后,可以用“foreach”循环遍历你的对象。import java.util.It…

FZU Problem 2238 Daxia Wzc's problem

Daxia在2016年5月期间去瑞士度蜜月,顺便拜访了Wzc,Wzc给他出了一个问题: Wzc给Daxia等差数列A(0),告诉Daxia首项a和公差d; 首先让Daxia求出数列A(0)前n项和,得到新数列A(1); 然后让Daxia求出数列A(1)前n项和,得到新数列A(2); 接着让Daxia求出数列A(2)前n项和,得到新…

生成器设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 …

java项目遇到的问题_java系列:项目中遇到的一些问题(持续更新中)

JSONArray去重的问题 JSONArray array = ["2","0","0","0","0","0"]; private String[] instanceAaary(JSONArray array) throws JSONException{String[] strs = new String[array.length()]; for (int i = 0; i …

【转】从 ArcGIS for Desktop 发布地图服务

原文链接:http://resources.arcgis.com/zh-CN/help/tutorials/01z300000007000000.htm 本教程的目的是将地图服务直接从 ArcGIS for Desktop 发布到 ArcGIS for Server 中。本教程与名为“在 ArcMap 中准备您的 Web 地图”的上一教程类似,需要使用 ArcGI…

Java tree set_Java TreeSet tailSet()方法

Java TreeSet tailSet()方法java.util.TreeSet.tailSet(E fromElement) 方法用于返回一组大于或等于指定元素的元素。1 语法public SortedSet tailSet(E fromElement)2 参数fromElement:这是返回集的最小边界值(包括该边界值)3 返回值返回此集合中元素大于或等于fro…

java map练习_JAVA Map练习

JAVA Map练习作者:萤火之森2015-04-21 12:46浏览:1203package pack3;import java.util.HashMap;import java.util.Iterator;import java.util.*;import java.util.Set;/*** 每一个学生都有对应的归属地* 学生Student 地址String* 学生属性:姓…

Objective-C 反射机制

该文章属于<简书 — 刘小壮>原创&#xff0c;特此感谢&#xff1a;<简书 — 刘小壮> http://www.jianshu.com/p/5bbde2480680 了解反射机制 Objective-C语言中的OC对象&#xff0c;都继承自NSObject类。这个类为我们提供了一些基础的方法和协议&#xff0c;我们可以…

java 模块化osgi_OSGi简介–模块化Java

java 模块化osgiOSGi联盟是这种搁浅的管理机构&#xff0c;它始于1999年。其最初目标是为网络设备创建开放搁浅。 基于此思想&#xff0c;此规范也针对Java引入。 Eclipse在Java中是第一个。 他们于2004年6月推出了基于OSGi的Eclipse IDE。 OSGi是在Java中定义动态模块的方法。…

java成绩查询_JavaWeb项目第三次总结_成绩查询的实现

查询图书的功能实现如何知道浏览器往服务器传入的参数1、在编写好查询页面后&#xff0c;使用火狐浏览器的friebug (全部—>POST—>参数)2、编写GradeListServlet&#xff0c;重写doGet()和doPOST()方法服务器处理页面请求的过程1、重写doPOST()方法。处理过程1、连接数据…

Train Problem I hdu 1022(栈)

http://acm.split.hdu.edu.cn/showproblem.php?pid1022 题意&#xff1a;给出火车的进站与出站顺序&#xff0c;判断是否可以按照给出的出站顺序出站。 #include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <…

Spring数据和Redis

本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成班。 您将学习如何安装Redis并启动服务器。 此外&#xff0c;您将在Redis命令行中乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c;同时还介绍了…

java的原生数据类型_Java中的8种原生数据类型(Primitive Data Types)分析

八种数据类型类型 int short long byte float double char boolean字节数 4 2 8 1 4 8 4 JVM相关大小 -2147483648~2147483647 -32768~32767 -9223372036854775808~9223372036854775807 -128~127 3.40282347E38F 1.79769313486231570E308tip:八种类型我是这样记忆的&#xff1a…

史上最全的SpringMVC学习笔记

SpringMVC学习笔记---- 一、SpringMVC基础入门&#xff0c;创建一个HelloWorld程序 1.首先&#xff0c;导入SpringMVC需要的jar包。 2.添加Web.xml配置文件中关于SpringMVC的配置<!--configure the setting of springmvcDispatcherServlet and configure the mapping-->&…

python 进程池 等待数量_【2020Python修炼记】python并发编程(六)补充—进程池和线程池...

1、2、 为啥要有 进程池和线程池进程池来控制进程数目&#xff0c;比如httpd的进程模式&#xff0c;规定最小进程数和最大进程数3、创建进程池的类pool如果指定numprocess为3&#xff0c;则进程池会从无到有创建三个进程&#xff0c;然后自始至终使用这三个进程去执行所有任务&…

shader weaver_Oracle通过邀请Weaver和Chin推动JavaFX向前发展

shader weaver昨天&#xff0c;我发布了愚人节帖子&#xff0c;内容涉及加入NASA协助探索红色大行星。 那篇文章与事实相距不远……美国宇航局开发的技术的所有细节都是100&#xff05;准确的。 哎呀&#xff0c;即使我辞职也是事实&#xff01; 唯一不正确的部分是我将加入的公…

mysql快速上手3

上一章给大家说的是数据库的视图&#xff0c;存储过程等等操作&#xff0c;这章主要讲索引&#xff0c;以及索引注意事项&#xff0c;如果想看前面的文章&#xff0c;url如下&#xff1a; mysql快速上手1mysql快速上手2索引简介 索引是对数据库表中一个或多个列&#xff08;例如…

python图像锐化_Python图像处理介绍--图像模糊与锐化

欢迎关注 “小白玩转Python”&#xff0c;发现更多 “有趣”引言在之前的文章中&#xff0c;我们讨论了边缘检测内核。在本文我们将讨论如何在图像上应用模糊与锐化内核&#xff0c;将这些内核应用到彩色图像上&#xff0c;同时保留核心图像。一如既往&#xff0c;我们从导入所…

看一下CDI 2.0 EDR1

CDI是最近对Java EE最好的补充之一。 该观点在用户和集成商之间广泛共享。 当前版本的CDI 1.2于2014年4月发布。现在&#xff0c;在2015年中期&#xff0c;我们将面对CDI 2.0规范的早期草案。 CDI 2.0将在Java 8和更高版本上运行。 最终版本计划于2016年发布&#xff0c;该路线…

redis key设计技巧

1: 把表名转换为key前缀 如, user: 2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid 3: 第3段放置主键值,如2,3,4...., a , b ,c 4: 第4段,写要存储的列名 用户表 user , 转换为key-value存储 userid username passworde email 9 Lisi 1111111 li…