【问题标题】:Java JPanel resize ImageJava JPanel 调整图像大小
【发布时间】:2013-11-12 15:55:05
【问题描述】:

我正在尝试制作一个简单的 java 游戏,其中一个大球吃小球。我这样做了。现在我希望大球在吃小球时“长大”,但我不知道如何在 Java 中调整图像的大小。提前致谢!

MovableBall.java:

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;

public class MovableBall {

    private String craft = "ball.png";

    private int dx;
    private int dy;
    private int x;
    private int y;
    private int width;
    private int height;
    private int mx = 200, my = 150;
    private Image image;

    public MovableBall() {
        ImageIcon ii = new ImageIcon(this.getClass().getResource(craft));
        image = ii.getImage();

        x = 5;
        y = 5;
        width = image.getWidth(null);
        height = image.getHeight(null);
    }

    public void move() {
        x += dx;

        y += dy;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public Image getImage() {
        return image;
    }

    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            dx = -1;
        }

        if (key == KeyEvent.VK_RIGHT) {
            dx = 1;
        }

        if (key == KeyEvent.VK_UP) {
            dy = -1;
        }

        if (key == KeyEvent.VK_DOWN) {
            dy = 1;
        }
    }

    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            dx = 0;
        }

        if (key == KeyEvent.VK_RIGHT) {
            dx = 0;
        }

        if (key == KeyEvent.VK_UP) {
            dy = 0;
        }

        if (key == KeyEvent.VK_DOWN) {
            dy = 0;
        }
    }

    public Rectangle getBounds() {
        return new Rectangle(x, y, width, height);
    }
}

FoodBoard.java:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JPanel;
import javax.swing.Timer;

public class FoodBoard extends JPanel implements ActionListener {

    private Timer timer;
    private MovableBall ball;
    private Food[] foods = { new Food(), new Food(), new Food(), new Food(),
            new Food(), new Food() };
    private int B_WIDTH;
    private int B_HEIGHT;

    public FoodBoard() {
        addKeyListener(new TAdapter());
        setBackground(Color.black);
        setSize(400, 300);
        setDoubleBuffered(true);
        ball = new MovableBall();

        // WURRY important:
        setFocusable(true);
        // every 5 ms the timer will call the actionPerformed() method
        timer = new Timer(5, this);
        timer.start();
    }

    public void addNotify() {
        super.addNotify();
        B_WIDTH = getWidth();
        B_HEIGHT = getHeight();
    }

    public void checkIfEaten() {
        Rectangle r3 = ball.getBounds();

        for (int j = 0; j < foods.length; j++) {
            Food a = foods[j];
            Rectangle r2 = a.getBounds();

            if (r3.intersects(r2)) {
                a.setVisible(false);
            }
        }
    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;

        for (int i = 0; i < foods.length; i++) {
            Food f = foods[i];
            if (f.isVisible()) {
                g2d.drawImage(f.getImage(), f.getX(), f.getY(), this);
            }
        }
        g2d.drawImage(ball.getImage(), ball.getX(), ball.getY(), this);

        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        ball.move();
        checkIfEaten();
        repaint();
    }

    private class TAdapter extends KeyAdapter {
        public void keyReleased(KeyEvent e) {
            ball.keyReleased(e);
        }

        public void keyPressed(KeyEvent e) {
            ball.keyPressed(e);
        }
    }
}

【问题讨论】:

标签: java graphics


【解决方案1】:

你可以像这样调整图像的大小,

Image new_image = old_image.getScaledInstance( new_width, new_height,  java.awt.Image.SCALE_SMOOTH ) ;

为确保球不超过最大尺寸,

if(prevImage.getWidth(null) >= max_width || prevImage.getHeight(null) >= max_height)
{
    System.out.println("MAX Size reached !");
}
else
{
    // increase the size
    Image new_image = old_image.getScaledInstance( new_width, new_height,  java.awt.Image.SCALE_SMOOTH ) ;
}

【讨论】:

  • 嗨。我在 checkIfEaten() 的 if 中写了Image prevImage = ball.getImage(); ball.setImage(prevImage.getScaledInstance( prevImage.getWidth(null) + 10, prevImage.getWidth(null) + 10, Image.SCALE_DEFAULT));,它会导致球永远变大。任何想法?谢谢!
  • 您可以检查图像是否已达到最大尺寸,然后停止增加其尺寸。查看我的编辑。
  • 谢谢。你知道为什么它一直在执行 if 里面的代码吗?
  • 它应该这样做直到达到最大尺寸。
  • 我得想办法让它不被无休止地调用。否则它会一直吃掉一个球,长大,再也不会长大,因为它达到了它的最大尺寸。再次感谢!
【解决方案2】:

如果你有一个 Image 对象,你真的不需要担心调整它的大小,只需使用

yourImage.getScaledInstance(newWidth, newHeight, Image.SCALE_DEFAULT);

您可能想要更改 newWidth/newHeight 参数,但除此之外,您应该很高兴!你可以阅读更多here.

希望这会有所帮助!

【讨论】:

  • 嗨!我把它放在checkIfEaten()Image im=ball.getImage(); im.getScaledInstance(im.getWidth(null)+5,im.getHeight(null)+5,im.SCALE_DEFAULT); 但它什么也没做。我是不是写错地方了?非常感谢!
  • 好吧,我不习惯 Java 的这一部分,但据我所知,im.SCALE_DEFAULT 是不对的。 SCALE_DEFAULT 是 Image 类中定义的变量,因此当您使用它时,您必须执行 Image.SCALE_DEFAULT 并且它应该可以工作。另外,在执行 getWidth() 时,我认为您不必输入 null,但这不会损害您的游戏。
  • 问题是,一旦我缩放它,我并没有将它设置为球的图像。感谢您的回复:) 我现在面临我在 Rustagi 的回答中评论的问题:P
  • 不客气 :) 但不要在 for 循环中调整代码大小,因为这很可能是它不断调整自身大小的原因。
  • 事情是,它不应该总是被调用,我把它写在 if 里面。我被卡住了,我不知道把球的方法放在哪里。我对编程不太了解,但是如果我为每个食物球定义一个事件,“visibilityChanged”或类似的东西,然后从那里调用球的方法增长,是否正确?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2012-05-24
  • 2018-10-23
  • 1970-01-01
  • 2012-05-16
  • 2014-09-01
  • 2015-10-18
相关资源
最近更新 更多