2009-02-07 29 views
21

Tôi đang phát triển một trò chơi nền tảng đơn giản bằng cách sử dụng Java sử dụng BlueJ làm IDE. Ngay bây giờ tôi có máy nghe nhạc/kẻ thù sprites, nền tảng và các mặt hàng khác trong trò chơi được vẽ bằng cách sử dụng đa giác và hình dạng đơn giản. Cuối cùng tôi hy vọng sẽ thay thế chúng bằng những hình ảnh thực tế.Làm cách nào để đặt hình nền trong Java?

Hiện tại, tôi muốn biết giải pháp đơn giản nhất để đặt hình ảnh (URL hoặc từ nguồn cục bộ) làm 'nền' của cửa sổ trò chơi/canvas của tôi là gì?

Tôi sẽ đánh giá cao nếu nó không phải là một cái gì đó dài hoặc phức tạp như kỹ năng lập trình của tôi không phải là rất tốt và tôi muốn giữ cho chương trình của tôi càng đơn giản càng tốt. Vui lòng cung cấp mã ví dụ với các chú thích để xây dựng trên chức năng của chúng, và cũng có thể nếu nó nằm trong lớp riêng của nó, cách gọi các phương thức liên quan được sử dụng bởi các lớp khác.

Cảm ơn bạn rất nhiều.

Trả lời

27

Câu trả lời sẽ thay đổi đôi chút tùy thuộc vào việc ứng dụng hoặc applet đang sử dụng AWT hoặc Swing.

(. Về cơ bản, các lớp học bắt đầu bằng J như JAppletJFrame là Swing, và AppletFrame là AWT)

Trong cả hai trường hợp, các bước cơ bản sẽ là:

  1. Vẽ hoặc tải hình ảnh vào đối tượng Image.
  2. Vẽ hình nền trong trường hợp bức tranh của Component bạn muốn vẽ nền trong.

Bước 1. tải hình ảnh có thể là bằng cách sử dụng các lớp Toolkit hoặc bởi lớp ImageIO.

Phương pháp Toolkit.createImage có thể được sử dụng để tải Image từ một địa điểm xác định trong một String:

Image img = Toolkit.getDefaultToolkit().createImage("background.jpg"); 

Tương tự, ImageIO thể được sử dụng:

Image img = ImageIO.read(new File("background.jpg"); 

Bước 2. Bức tranh phương pháp cho các Component mà nên nhận được nền sẽ cần phải được ghi đè và sơn Image vào thành phần.

Đối với AWT, phương pháp ghi đè lên là phương pháp paint, và sử dụng phương pháp drawImage của đối tượng Graphics được trao vào paint phương pháp:

public void paint(Graphics g) 
{ 
    // Draw the previously loaded image to Component. 
    g.drawImage(img, 0, 0, null); 

    // Draw sprites, and other things. 
    // .... 
} 

Đối với Swing, phương pháp ghi đè lên là paintComponent phương pháp của JComponent và vẽ Image như với những gì đã được thực hiện trong AWT.

public void paintComponent(Graphics g) 
{ 
    // Draw the previously loaded image to Component. 
    g.drawImage(img, 0, 0, null); 

    // Draw sprites, and other things. 
    // .... 
} 

Simple Component Ví dụ

Dưới đây là một Panel mà tải một tập tin hình ảnh khi khởi tạo, và rút ra hình ảnh đó trên chính nó:

class BackgroundPanel extends Panel 
{ 
    // The Image to store the background image in. 
    Image img; 
    public BackgroundPanel() 
    { 
     // Loads the background image and stores in img object. 
     img = Toolkit.getDefaultToolkit().createImage("background.jpg"); 
    } 

    public void paint(Graphics g) 
    { 
     // Draws the img to the BackgroundPanel. 
     g.drawImage(img, 0, 0, null); 
    } 
} 

Để biết thêm thông tin về bức tranh:

+0

Cảm ơn câu trả lời của bạn. Tôi có một số câu hỏi- 1. Hình ảnh có liên quan ở đâu? Bạn có thể cung cấp cho một ví dụ nguồn gốc của hình ảnh như tôi không chắc chắn làm thế nào nó nên được đặt ra. – Dew

+0

2. Giả sử tôi tạo một lớp được gọi là 'Nền' bằng cách sử dụng mã ở trên, tôi cần gọi phương thức nào, trong lớp 'Trò chơi' của tôi (điều khiển chế độ xem, kích thước của cửa sổ trò chơi) từ lớp Nền tới làm cho hình nền xuất hiện? Xin vui lòng cho một ví dụ. – Dew

+0

Đây là mã tôi hiện đang sử dụng để đặt màu nền của cửa sổ trò chơi của tôi- chế độ xem = new WorldView (thế giới, chiều rộng, chiều cao); view.setBackground (Màu mới (230, 245, 255)); – Dew

1

Đầu tiên tạo một lớp mới mở rộng lớp WorldView. Tôi đã gọi cho lớp học mới của tôi Background. Vì vậy, trong lớp mới này, hãy nhập tất cả các gói Java bạn cần để ghi đè phương thức paintBackground. Điều này phải là:

import city.soi.platform.*; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.image.ImageObserver; 
import javax.swing.ImageIcon; 
import java.awt.geom.AffineTransform; 

Tiếp theo sau tên lớp, hãy đảm bảo rằng nó mở rộng WorldView. Một cái gì đó như thế này:

public class Background extends WorldView 

Sau đó tuyên bố trò chơi biến kiểu Game và một biến hình ảnh của loại Image một cái gì đó như thế này:

private Game game; 
private Image image; 

Sau đó, trong constructor của lớp này đảm bảo các trò chơi loại Game là chữ ký của hàm tạo và trong cuộc gọi tới super, bạn sẽ phải khởi tạo WorldView, khởi chạy trò chơi và khởi tạo biến hình ảnh, như sau:

super(game.getCurrentLevel().getWorld(), game.getWidth(), game.getHeight()); 
this.game = game; 
bg = (new ImageIcon("lol.png")).getImage(); 

Sau đó, bạn chỉ cần ghi đè phương thức paintBackground theo cách giống như cách bạn đã thực hiện khi ghi đè phương pháp paint trong lớp Player. Chỉ cần như thế này:

public void paintBackground(Graphics2D g) 
{ 
float x = getX(); 
float y = getY(); 
AffineTransform transform = AffineTransform.getTranslateInstance(x,y); 
g.drawImage(bg, transform, game.getView()); 
} 

Bây giờ cuối cùng bạn phải khai báo một tham chiếu mức lớp để lớp mới, bạn chỉ cần thực hiện trong lớp Game và khởi này trong constructor Game, một cái gì đó như thế này:

private Background image; 

And in the Game constructor: 
image = new Background(this); 

Cuối cùng, tất cả những gì bạn phải làm là thêm nền vào khung! Đó là điều tôi chắc chắn tất cả chúng ta đều mất tích. Để làm điều đó bạn phải làm một cái gì đó như thế này sau khi biến frame đã được tuyên bố:

frame.add(image); 

Hãy chắc chắn rằng bạn thêm mã này ngay trước frame.pack();. Cũng đảm bảo bạn sử dụng hình nền không quá lớn!

Bây giờ là xong! Tôi nhận thấy rằng các công cụ trò chơi có thể xử lý các định dạng hình ảnh JPEG và PNG nhưng cũng có thể hỗ trợ những người khác. Mặc dù điều này giúp bao gồm một hình nền trong trò chơi của bạn, nó không phải là hoàn hảo!Bởi vì một khi bạn đi đến cấp độ tiếp theo tất cả các nền tảng của bạn và sprites là vô hình và tất cả các bạn có thể nhìn thấy là hình nền của bạn và bất kỳ JLabels/Jbuttons bạn đã bao gồm trong trò chơi.

0

Hoặc thử này;)

try { 
    this.setContentPane(
    new JLabel(new ImageIcon(ImageIO.read(new File("your_file.jpeg"))))); 
} catch (IOException e) {}; 
+0

bây giờ ... điều gì sẽ xảy ra nếu bạn thêm các thành phần vào khung? – kleopatra

-1

Con đường là điều duy nhất bạn thực sự phải lo lắng về việc nếu bạn đang thực sự mới đến Java. Bạn cần kéo hình ảnh của mình vào tệp dự án chính và tệp sẽ hiển thị ở cuối danh sách.

Sau đó, đường dẫn tệp khá thẳng về phía trước. Mã này đi vào hàm tạo cho lớp.

img = Toolkit.getDefaultToolkit().createImage("/home/ben/workspace/CS2/Background.jpg"); 

CS2 là tên dự án của tôi và mọi thứ trước đó dẫn đến không gian làm việc.

+1

Câu hỏi đặt ra là làm thế nào để hiển thị một hình ảnh làm Nền, không phải cách tải hình ảnh từ tập tin. –

+0

Trên thực tế, @userunknown, làm thế nào để tải hình ảnh từ tập tin là hoàn toàn một phần của vấn đề OP đã nhầm lẫn về. –

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