2009-03-07 48 views

Trả lời

46

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à widthheight 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.)

+0

một số mã xin vui lòng? –

+0

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

+1

có vẻ như * i * và * j * chỉ mục sẽ được hoán đổi trong * getSubImage() * gọi –

12

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ỉ).

Các vấn đề liên quan