我一直在网上寻找一个完整的解决方案,但截至目前,我只能找到不适合的作品。
我正在寻找一个可以查看图像文件的程序,遍历文件并隔离精灵然后保存它们。之后,我需要一种方法来重新访问精灵信息,以便我可以显示它,但我希望能够根据我自己的公式显示切片。想想像小型地形瓷砖的高级战争这样的游戏。我想能够半随机地显示这些瓷砖,但在我自己的参数范围内。
我还希望能够加载与上图相同大小精灵的不同图像文件,但将这些图像用于动画。
所以我有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从未被调用,但我不确定何时调用它,我不确定是否还有其他东西丢失。
同样,为什么上述代码不起作用?
由于
答案 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,您可以看到动画并手动对齐。如果你给我你的电子邮件,我可以发送消息来源,或者我可以将它上传到某个地方。