Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 隔离用于动画和显示的精灵图纸子图像_Java_Swing - Fatal编程技术网

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

Java 隔离用于动画和显示的精灵图纸子图像,java,swing,Java,Swing,我一直在网上四处寻找,试图找到一个完整的解决方案,但到目前为止,我只能找到不匹配的部分 我正在寻找一个程序,可以看看一个图像文件,通过文件循环,隔离精灵,然后保存它们。之后,我需要一种方法来重新访问该精灵信息,以便我可以显示它,但我希望能够显示基于我自己的公式瓷砖。想象一个类似于高级战争的游戏,它有一个小的地形块。我希望能够在我自己的参数范围内半随机地显示这些瓷砖 我还想能够加载一个不同的图像文件,具有相同大小的精灵作为上述图像,但使用这些图像的动画 所以我有两个精灵表,有一堆64x64像素的精

我一直在网上四处寻找,试图找到一个完整的解决方案,但到目前为止,我只能找到不匹配的部分

我正在寻找一个程序,可以看看一个图像文件,通过文件循环,隔离精灵,然后保存它们。之后,我需要一种方法来重新访问该精灵信息,以便我可以显示它,但我希望能够显示基于我自己的公式瓷砖。想象一个类似于高级战争的游戏,它有一个小的地形块。我希望能够在我自己的参数范围内半随机地显示这些瓷砖

我还想能够加载一个不同的图像文件,具有相同大小的精灵作为上述图像,但使用这些图像的动画

所以我有两个精灵表,有一堆64x64像素的精灵。其中一个图像文件是“我的所有地形平铺”。另一个是我的单位瓷砖。我希望能够阅读精灵和显示他们的任何方式我喜欢

我一辈子都不知道该怎么做。我已经研究了子映像和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方法从未被调用,但我不确定何时调用它,也不确定是否缺少其他任何东西

同样,为什么上面的代码不起作用

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();
    }
}
    }

谢谢

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


基本上,将精灵工作表转换为
BufferedImage
,并使用
getPixel
找出精灵的开始和结束位置。然后可以使用
getSubimage
将每个精灵写入一个单独的图像。但是,硬部分正在对齐精灵,以便动画不会到处跳跃。我创建了一个GUI,这样您就可以看到动画并手动进行对齐。如果你给我你的电子邮件,我可以发送源代码,也可以上传到某个地方。

你应该在MyDrawP类中重写paintComponent(Graphics)方法,然后从那里调用你的
drawSprite

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

bigImg.getSubimage(x, y, width, height)
将返回一个子映像(实际上,在您提供的代码中始终是0,0处的子映像),因此您应该有如下内容:

Image subImage = bigImg.getSubimage(x,y,width,height)
当然,下一行应该使用子图像而不是bigImg

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

请参见

,可能会有所帮助。