Jak wyodrębnić część tego obrazu w Javie? [zamknięte]
Mam taki arkusz sprite ' a:
Pacman sprites http://i39.tinypic.com/145nvp.png
Jak mogę odczytać ten plik obrazu, aby wyodrębnić jego część do użycia jako sprite ?
2 answers
Jeśli obszar sprites odczytuje się w BufferedImage
, na getSubimage
metoda może być użyta do uzyskania Podobrazia arkusza sprite.
Metoda getSubimage
zajmie x
, y
, oraz width
i height
pożądanego podimage, dzięki czemu można uzyskać pożądany sprite. Ponieważ większość sprite ' ów wydaje się mieć ten sam rozmiar, myślę, że większość z nich może być pobrana przez zagnieżdżoną pętlę for
, aby iterację przez duży obraz.
Na przykład, jeśli obrazek sprite jest załadowany korzystanie z ImageIO
klasy (np. read
W przeciwieństwie do poprzednich wersji, nie można ich używać w trybie offline, ale w trybie offline można je używać w trybie offline.]}
BufferedImage bigImg = ImageIO.read(new File("sheet.png"));
// The above line throws an checked IOException which must be caught.
final int width = 10;
final int height = 10;
final int rows = 5;
final int cols = 5;
BufferedImage[] sprites = new BufferedImage[rows * cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
sprites[(i * cols) + j] = bigImg.getSubimage(
j * width,
i * height,
width,
height
);
}
}
Haczyk polega oczywiście na tym, że powyższy kod będzie działał tylko wtedy, gdy wszystkie sprite 'y są tego samego rozmiaru, więc konieczne będzie pewne dostosowanie, aby działać dla danego arkusza sprite' ów. (Ponieważ prawy górny róg wydaje się różny pod względem wielkości od i inni)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-23 12:33:07
Jeśli chcesz po prostu narysować sprite' y, Klasa Grafiki Javy ma metodę drawImage, która wyciągnie dla ciebie określony obszar obrazu. Musisz tylko określić obraz źródłowy, gdzie chcesz narysować sprite na swoim obiekcie graficznym (x, y, szerokość, wysokość) i w jakiej ramce obrazu znajduje się sprite (X, y, szerokość, wysokość).
Zakładając, że szerokość i wysokość sprite ' a są tą samą szerokością i wysokością, którą chcesz narysować na obszarze rysowania, możesz można zdefiniować własną metodę rysowania ramki sprite ' a w następujący sposób
void drawSpriteFrame(Image source, Graphics2D g2d, int x, int y,
int columns, int frame, int width, int height)
{
int frameX = (frame % columns) * width;
int frameY = (frame / columns) * height;
g2d.drawImage(source, x, y, x+width, y+height,
frameX, frameY, frameX+width, frameY+height, this);
}
columns
ile kolumn znajduje się w Twoim arkuszu sprite. Pierwsze dwie linie metody obliczają x dowolną pozycję y ramki sprite w arkuszu.
Jeśli Twój arkusz sprite był zwykłym arkuszem (wszystkie te same rozmiary) i był ułożony we wzór 5 x 15 tak jak Twój, narysowałbyś 20 klatkę za pomocą następującego wywołania metody
Toolkit tk = Toolkit.getDefaultToolkit();
Image pacman = tk.getImage(getURL("pacman.png"));
...
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25);
Tutaj x i y są pozycją, którą chcesz narysować sprite na swoim obiekcie graficznym, 15 to liczba kolumn w arkuszu sprite, 19 to ramka (numeracja zaczyna się od 0), a 25 to szerokość i wysokość każdego sprite ' a (i przybliżona).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 14:11:08