Mar*_*c H 4 java swing javafx-2
哇... JavaFx 2在游戏编程方面让我陷入了循环。我试图确定如何最好地处理玩家控制的精灵动画。(即使敌人,事物和玩家动起来)。
我知道如何编写代码以读取Spritesheet并在AS3或Java Swing中设置游戏循环...但是,我很难解决我的动画循环如何与任何组件交互的问题。 FX就是渲染。
我已经研究过api。有一个TranslateTransition类。但是,与其他语言相比,它似乎过多。而其他一切似乎完全基于接口或过于局限。
我正在阅读Weaver的Pro JavaFx2 ...而我在复制该编码样式时遇到了麻烦。但我可以找到它:)不知道是爱还是恨这只野兽。
有什么建议么?
阅读此博客文章:http : //blog.netopyr.com/2012/03/09/creating-a-sprite-animation-with-javafx/
这是有史以来JavaFX Sprite动画的最佳实现:)
小智 5
我在这个聚会上有点晚了,但我想我会用 JavaFX 为精灵动画贡献我的解决方案。您可以将以下类粘贴到自己的项目中,以使用 ImageView 显示精灵动画,该动画与帧速率无关。
import javafx.animation.AnimationTimer;
import javafx.geometry.Rectangle2D;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
public class ImageViewSprite extends AnimationTimer {
private final ImageView imageView; //Image view that will display our sprite
private final int totalFrames; //Total number of frames in the sequence
private final float fps; //frames per second I.E. 24
private final int cols; //Number of columns on the sprite sheet
private final int rows; //Number of rows on the sprite sheet
private final int frameWidth; //Width of an individual frame
private final int frameHeight; //Height of an individual frame
private int currentCol = 0;
private int currentRow = 0;
private long lastFrame = 0;
public ImageViewSprite(ImageView imageView, Image image, int columns, int rows, int totalFrames, int frameWidth, int frameHeight, float framesPerSecond) {
this.imageView = imageView;
imageView.setImage(image);
imageView.setViewport(new Rectangle2D(0, 0, frameWidth, frameHeight));
cols = columns;
this.rows = rows;
this.totalFrames = totalFrames;
this.frameWidth = frameWidth;
this.frameHeight = frameHeight;
fps = framesPerSecond;
lastFrame = System.nanoTime();
}
@Override
public void handle(long now) {
int frameJump = (int) Math.floor((now - lastFrame) / (1000000000 / fps)); //Determine how many frames we need to advance to maintain frame rate independence
//Do a bunch of math to determine where the viewport needs to be positioned on the sprite sheet
if (frameJump >= 1) {
lastFrame = now;
int addRows = (int) Math.floor((float) frameJump / (float) cols);
int frameAdd = frameJump - (addRows * cols);
if (currentCol + frameAdd >= cols) {
currentRow += addRows + 1;
currentCol = frameAdd - (cols - currentCol);
} else {
currentRow += addRows;
currentCol += frameAdd;
}
currentRow = (currentRow >= rows) ? currentRow - ((int) Math.floor((float) currentRow / rows) * rows) : currentRow;
//The last row may or may not contain the full number of columns
if ((currentRow * cols) + currentCol >= totalFrames) {
currentRow = 0;
currentCol = Math.abs(currentCol - (totalFrames - (int) (Math.floor((float) totalFrames / cols) * cols)));
}
imageView.setViewport(new Rectangle2D(currentCol * frameWidth, currentRow * frameHeight, frameWidth, frameHeight));
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过以下方式实现这一点:
ImageViewSprite anim = new ImageViewSprite(ImageView, new Image("/pathToImage"), columns, rows, totalNumberOfFrames, FrameWidth, FrameHeight, FPS);
anim.start();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5315 次 |
| 最近记录: |