隔离用于动画和显示的精灵表子图像

时间:2012-02-07 20:45:59

标签: java swing

我一直在网上寻找一个完整的解决方案,但截至目前,我只能找到不适合的作品。

我正在寻找一个可以查看图像文件的程序,遍历文件并隔离精灵然后保存它们。之后,我需要一种方法来重新访问精灵信息,以便我可以显示它,但我希望能够根据我自己的公式显示切片。想想像小型地形瓷砖的高级战争这样的游戏。我想能够半随机地显示这些瓷砖,但在我自己的参数范围内。

我还希望能够加载与上图相同大小精灵的不同图像文件,但将这些图像用于动画。

所以我有2张精灵表,有一堆64x64像素的精灵。其中一个图像文件是我的所有地形图块。另一个是我的单位瓷砖。我希望能够阅读精灵并以我喜欢的方式展示它们。

我不能为我的生活找出这样做的方法。我已经研究过Subimaging和drawImage,但是我无法让它们正确地存储或重新显示信息。

感谢。

编辑:所以我为了自己的利益和其他人的缘故简化了我的问题。

为什么以下代码不起作用?

package animation;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class AnimTest
{
public static void main(String[] args)
{
    AnimTest test = new AnimTest();
    test.go();
}

public void go()
{
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    MyDrawP drawP = new MyDrawP();
    frame.getContentPane().add(drawP);
    frame.setSize(500,500);
    frame.setVisible(true);
}
    }

   class MyDrawP extends JPanel
    {

public void drawSprite(Graphics g)
{
    try {
        BufferedImage bigImg = ImageIO.read(new File("C:/Users/scott/Desktop/Personal Work/Pixel Art/terrain.png"));

        final int width = 64;
        final int height = 64;

        int x = 0;
        int y = 0;

        bigImg.getSubimage(x, y, width, height);
        g.drawImage(bigImg, 5, 5, this);

    } catch (IOException e) {
        e.printStackTrace();
    }
}
    }

很抱歉这个烂摊子,我不知道如何正确格式化代码块。

现在使用该代码,我希望MyDrawP类查看我的文件,从0,0开始抓取64x64的一部分,然后将其保存并在添加到框架中时将其显示在框架中。我很确定问题是方法drawSprite从未被调用,但我不确定何时调用它,我不确定是否还有其他东西丢失。

同样,为什么上述代码不起作用?

由于

2 个答案:

答案 0 :(得分:1)

您应该覆盖MyDrawP类中的paintComponent(Graphics)方法,并从那里调用drawSprite

然后,您应该重新设计“提取”子图像并在JPanel上绘制它们的方式:

bigImg.getSubimage(x, y, width, height)

将返回一个子图像(实际上总是你提供的代码中的0,0),所以你应该有类似的东西:

Image subImage = bigImg.getSubimage(x,y,width,height)

当然,下一行应该使用subImage而不是bigImg ......

最后你必须实现“随机”选择要绘制的子图像的方式,以及你想在JPanel上绘制它的位置。

请参阅http://docs.oracle.com/javase/tutorial/uiswing/painting/step2.html

答案 1 :(得分:0)

当我辅导学生时,我们使用精灵表来为游戏制作动画。有一些精灵切割程序可以帮助,但没有一个做我想要的,所以我写了自己的。在Java中,您可以进行一些低级像素处理,以确定精灵的开始和结束位置,然后将其“剪切”出来。

基本上将您的精灵表转换为BufferedImage并使用getPixel找出精灵的开始和结束位置。然后,您可以使用getSubimage将每个精灵写入单独的图像。但是,难以对齐精灵,因此您的动画不会遍布整个地方。我创建了一个GUI,您可以看到动画并手动对齐。如果你给我你的电子邮件,我可以发送消息来源,或者我可以将它上传到某个地方。