Изоляция изображений спрайтов для анимации и отображения - PullRequest
0 голосов
/ 08 февраля 2012

Я искал в Интернете, чтобы попытаться найти полное решение, но на данный момент я могу найти только те части, которые не подходят друг другу.

Я ищу программу, которая может просмотреть файл изображения, пройтись по файлу и изолировать спрайты, а затем сохранить их. После этого мне нужен способ повторного доступа к этой информации о спрайте, чтобы я мог ее отобразить, но я хотел бы иметь возможность отображать плитки на основе моих собственных формул. Думайте об игре как о продвинутых войнах с маленькими плитками местности. Я хочу иметь возможность отображать эти плитки почти случайно, но в рамках моих собственных параметров.

Я также хотел бы иметь возможность загрузить другой файл изображения, который имеет спрайты того же размера, что и изображение выше, но использовать эти изображения для анимации.

Итак, у меня есть 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 посмотрел на мой файл, взял фрагмент размером 64x64, начиная с 0,0, а затем сохранил его и отобразил в кадре, когда он был добавлен в него. Я уверен, что проблема в том, что метод drawSprite никогда не вызывается, но я не уверен, когда его вызывать, и я не уверен, что ничего не хватает.

Опять же, почему вышеупомянутый код не работает?

Спасибо

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Вам следует переопределить метод paintComponent (Graphics) в вашем классе MyDrawP и вызвать ваш 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

0 голосов
/ 08 февраля 2012

Когда я репетировал студента, мы использовали спрайт-листы для создания анимации для игр. Есть несколько программ для вырезания спрайтов, которые могут помочь, но ни одна из них не сделала то, что я хотел, поэтому я написал свою собственную. В Java вы можете выполнить низкоуровневую обработку пикселей, чтобы выяснить, где начинаются и заканчиваются спрайты, а затем «вырезать» их.

В основном превратите ваш лист спрайтов в BufferedImage и используйте getPixel, чтобы узнать, где начинаются и заканчиваются спрайты. Затем вы можете записать каждый спрайт на отдельное изображение, используя getSubimage. Однако, жесткая часть выравнивает спрайтов, поэтому ваша анимация не прыгает повсюду. Я создал графический интерфейс, чтобы вы могли видеть анимацию и выполнять выравнивание вручную. Если вы дадите мне свою электронную почту, я могу отправить источник или загрузить его куда-нибудь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...