Lập trình game java cơ bản - Vẽ hình lên frame

Xin chào các bạn, mấy ngày hôm nay bận chỉnh chu cái blog mà chưa có thời gian viết bài mới, mong các bạn thông cảm nha :p.

Hôm nay chung ta sẽ đi vào tìm hiểu cách load 1 hình ảnh lên frame (bài hôm trước chúng ta đã viết chữ lên frame được rồi đúng không nào.

Để thú vị ta sẽ vẽ hình chú chó nâu này nhé, các bạn có thể kiếm hình khác để vẽ :D
Rồi! Bài hôm trước chúng ta đã viết chữ lên frame bằng cách viết trực tiếp lên đối tượng JFrame, nhưng hôm nay chúng ta sẽ load hình lên đối tượng JPanel rồi sau đó mới add đối tượng này và JFrame của chúng ta để hiển thị. Với cách làm này thì ta sẽ vẽ lên JPanel xong xuôi đã rồi mới "dán" vào JFrame, và khi game chạy ta sẽ thấy nó "mượt" hơn :v (với game data nhiều mới thấy chứ load 1  đôi cái hình chắc cũng ko cảm nhận rõ lắm).

Chúng ta tiến hành tạo một thư mục để chứa hình ảnh, ở đây mình đặt tên là  "image ".

Bạn copy ảnh cần vẽ vào thư mục này.
Sau đó chúng ta sẽ tạo một class LoadImage kế thừa class JPanel.
Nhắc lại chút kiến thức trước: để kế thừa trong java ta dùng từ khóa extends.

Đầu tiên ở class LoadImage chúng ta sẽ khai báo 1 đối tượng:
private Image image;

Lưu ý: do Image là một lớp trừu tượng nên ta không thể tạo mới một đối tượng Image trực tiếp được.

Cho nên chúng ta sẽ cần dùng đến class ImageIcon (trong javadoc có nói qua về lớp này, bạn đọc để hiểu hơn, nôm na là nó sẽ load một hình, có thể từ đường dẫn chúng ta truyền vào, vv).

package com.blogspot.gameiter;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class LoadImage extends JPanel {
    private Image image;
    public LoadImage() {
      ImageIcon imageIcon = new ImageIcon("image/cho_nau.jpg");
      image = imageIcon.getImage();
    }
}
Đây là cách để ta tạo đối tượng Image, hiểu nôm na là thằng imageIcon sẽ load ảnh từ file name chúng ta truyền vào, sau đó thằng image sẽ lấy hình đó từ thằng imageIcon.

Tiếp theo là vẽ hình lên đối tượng JPanel.

Lớp JPanel có phương thức painComponent(Graphics g) lớp này có chức năng vẽ các thành phần lên container.

Mẹo: để gõ nhanh trên eclipse ta gõ vài chữ đầu phương thức cần override rồi  nhấn tổ hợp phím Ctrl + Space, eclipse sẽ gợi ý tất cả phương thức liên quan.
Ở đây khi nhấn Ctrl + Space các bạn sẽ thấy nó hiện ra những hai phương thức painComponent(Graphics g),nhưng các bạn lưu ý dùng phương thức có access modifier  là protected nhé. Do ở đây ta dùng JPanel, mà JPanel kế thừa từ JComponent, còn nếu ta dùng Panel thì sẽ dùng phương thức có
Tiếp tục :D...
Sau khi thêm code vẽ hình vào ta sẽ có:
package com.blogspot.gameiter;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class LoadImage extends JPanel {
    private Image image;
    public LoadImage() {
      ImageIcon imageIcon = new ImageIcon("image/cho_nau.jpg");
      image = imageIcon.getImage();
    }
    @Override
    protected void paintComponent(Graphics g) {
      g.drawImage(image, 100, 100, this); // Vẽ hình tại tọa độ (x, y) = (100, 100)
    }
    @Override
    public void paintComponents(Graphics g) {
      // Không dùng phương thức với JPanel
    }
}

Tham số this truyền vào ở đây có nghĩa là ta vẽ ngay trên JPanel LoadImage.
Xong, rất đơn giản để load hình đúng không nào các bạn. Bây giờ ta tạo 1 đối tượng JFrame và add nó vào chạy thử thôi :
Bài hôm nay kết thúc ở đây, xin chào và hẹn gặp lại các bạn :D.
SHARE

Xuho

  • Image
  • Image
  • Image
  • Image
  • Image

1 comments:

  1. ad ơi cho mình hỏi mình có tải ảnh vào file project trong máy nhưng lúc mở eclipse lên thì k thấy

    ReplyDelete