Tôi có tờ ma này:Làm thế nào để trích xuất một phần của hình ảnh này trong Java?
Pacman sprites http://i39.tinypic.com/145nvp.png
Làm thế nào tôi có thể đọc tập tin ảnh để trích xuất một phần của nó được sử dụng như một sprite?
Tôi có tờ ma này:Làm thế nào để trích xuất một phần của hình ảnh này trong Java?
Pacman sprites http://i39.tinypic.com/145nvp.png
Làm thế nào tôi có thể đọc tập tin ảnh để trích xuất một phần của nó được sử dụng như một sprite?
Nếu khu vực sprites được đọc thành BufferedImage
, phương pháp getSubimage
có thể được sử dụng để lấy một ảnh phụ của trang tính ma.
Phương pháp getSubimage
sẽ lấy x
, y
, và width
và height
của subimage mong muốn, vì vậy ma mong muốn có thể thu được. Vì hầu hết các sprites dường như có cùng kích thước, tôi sẽ nghĩ rằng hầu hết chúng có thể được lấy ra bởi một vòng lặp lồng nhau for
để lặp qua hình ảnh lớn. Ví dụ, nếu hình ảnh ma được nạp bằng cách sử dụng lớp ImageIO
(chẳng hạn như phương pháp read
) và mỗi sprite có kích thước 10 pixel x 10 pixel, trong đó có 5 hàng theo 5 cột sprites, sprites có thể thu được bằng cách như sau:
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
);
}
}
việc nắm bắt được, tất nhiên, các mã trên sẽ chỉ làm việc nếu tất cả các sprites có cùng kích thước, do đó sẽ cần phải có một số điều chỉnh thực hiện để làm việc cho đưa ra bảng sprite. (Góc trên cùng bên phải có kích thước khác với các hình khác.)
một số mã xin vui lòng? –
Xin lỗi về điều đó, tôi đã nhấn nhầm nút trả lời bài đăng. Tôi sẽ thêm nhiều hơn vào câu trả lời. – coobird
có vẻ như * i * và * j * chỉ mục sẽ được hoán đổi trong * getSubImage() * gọi –
Nếu bạn chỉ muốn vẽ họa tiết, lớp Đồ họa của Java có phương pháp drawImage sẽ kéo một khu vực cụ thể của hình ảnh ra bạn. Bạn chỉ cần xác định hình ảnh nguồn, nơi bạn muốn vẽ sprite trên đối tượng đồ họa của bạn (x, y, chiều rộng, chiều cao), và trong khung hình ảnh của sprite (x, y, width, height) .
Giả sử chiều rộng và chiều cao của sprite là cùng một chiều rộng và chiều cao mà bạn muốn vẽ trên diện tích bản vẽ, bạn có thể xác định phương pháp riêng của mình để vẽ một khung sprite như sau
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
có bao nhiêu cột trong bảng sprite của bạn. Hai dòng đầu tiên của phương thức tính x bất kỳ vị trí y nào của khung sprite trong trang tính của bạn.
Những sprites lớn trong trang tính của bạn sẽ yêu cầu xử lý đặc biệt. Bạn có thể vẽ chúng bằng các ô (vì vậy bạn sẽ vẽ bốn sprites cho mỗi hình ảnh lớn trong trường hợp này), hoặc bạn có thể tự tìm ra x, y, width và height để sử dụng cho các sprites đó.
Nếu tờ ma của bạn là một tấm bình thường (tất cả sprites cùng kích thước) và nó được sắp xếp theo một mô hình 5 x 15 như bạn có, bạn sẽ vẽ khung 20 với phương pháp gọi sau
Toolkit tk = Toolkit.getDefaultToolkit();
Image pacman = tk.getImage(getURL("pacman.png"));
...
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25);
Ở đây, x và y là vị trí bạn muốn vẽ sprite trên đối tượng đồ họa của bạn, 15 là số cột trong trang ma trận của bạn, 19 là khung (đánh số bắt đầu từ 0), và 25 là chiều rộng và chiều cao của mỗi sprite (tôi xấp xỉ).
Điều này có thể phù hợp cho http://gamedev.stackexchange.com/. –