Java 2D游戏编程-SpriteSheet动画

时间:2014-08-06 02:21:30

标签: java animation 2d

我目前正在开发一个小型的2D Java游戏,我刚刚完成了修复我从CodeNMore的YouTube教程中获得的任何错误/错误等。

我的游戏中的所有内容都与他保持同步,我一直致力于扩展我的游戏。 所以,我为一个面向不同方向的角色创建了一个精灵。不幸的是,关于如何显示图像,我几乎没有任何线索。

为了进一步解释,CodeNMore使用以下代码行: [来自SpriteSheet.java]

public BufferedImage crop(int col, int row, int w, int h){
        return sheet.getSubimage(col * 16, row * 16, w, h);
}

我遇到的问题是,我不知道如何动画/更改spritesheet上的字符精灵,只要它们朝某个方向移动。

即。如果玩家面向右侧,我需要图像(默认情况下,在第0列,第0行)更改为第1列第3行。

一旦完成,我必须弄清楚如何为玩家制作动画。 (希望我能自己弄明白)。

您需要查看的所有内容都可以从此媒体中心下载:

http://www.mediafire.com/download/dfdkudun91wdup5/tile_rpg_part_20.zip

它是CodeNMore一直在处理的确切文件,只是在/ res中使用我的spritesheet。

1 个答案:

答案 0 :(得分:1)

这是我使用的动画类

import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class Animation {
private int speed;
private int frames;

private int index = 0;
private int count = 0;

private BufferedImage[] images;
private BufferedImage currentImg;

public Animation(int speed, BufferedImage... args){
    this.speed = speed;
    images = new BufferedImage[args.length];
    for(int i = 0; i < args.length; i ++){
        images[i] = args[i];
    }
    frames = args.length;
}

public Animation(int speed, boolean flip, BufferedImage... args) {
    if (flip) {
        this.speed = speed;
        images = new BufferedImage[(args.length * 2) - 2];
        for (int i = 0; i < args.length; i++) {
            images[i] = args[i];
        }
        BufferedImage[] temp = new BufferedImage[args.length - 2];
        for (int i = args.length - 2; i > 0; i--) {
            temp[args.length - i - 2] = images[i];
        }
        for (int i = args.length; i < images.length; i++) {
            images[i] = temp[i - args.length];
        }
        frames = images.length;
    }else{
        this.speed = speed;
        images = new BufferedImage[args.length];
        for (int i = 0; i < args.length; i++) {
            images[i] = args[i];
        }
        frames = args.length;
    }
}

public void runAnimation(){
    index ++;
    if(index > speed){
        index = 0;
        nextFrame();
    }
}

private void nextFrame(){
    for(int i = 0; i < frames; i ++){
        if(count == i)
            currentImg = images[i];
    }

    count ++;

    if(count >= frames)
        count = 0;
}

public void drawAnimation(Graphics g, int x, int y, int scaleX, int scaleY){
    g.drawImage(currentImg, x, y, scaleX, scaleY, null);
}
}

要使用它,只需为每个图像循环创建此类的实例,并在速度参数中为每个帧和args中的图像之间提供多少刻度。然后在你的tick方法中(或你勾选的对象)调用run动画,并在你想渲染动画时在render方法中调用drawAnimation方法。如果将flip参数添加为true,它将自动反转您的图像序列Eg。你给它Img1,Img2,Img3,Img4,Img5。它会将其作为Img1,Img2,Img3,Img4,Img5,Img4,Img3,Img2进行处理。