2013-11-01 3 views
2

Я пытаюсь создать простую java-игру, где большой шар ест меньше шаров. Я это сделал. Теперь я хочу, чтобы большой шар «расти», когда он ест маленькие шары, но я не знаю, как изменить размер изображения на Java. Заранее спасибо!Java JPanel resize Изображение

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); 
     } 
    } 
} 
+1

Вы близко - посмотрите @ http://docs.oracle.com/javase/tutorial/2d/images/drawimage.html - у вас есть возможность рисовать масштабированное изображение, которое может имитировать рост. Тем не менее, он может быть неровным, поэтому при необходимости вы можете загрузить изображение большего разрешения. –

ответ

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) ; 
} 
+0

Привет. Я написал 'Image prevImage = ball.getImage(); \t \t \t \t ball.setImage (prevImage.getScaledInstance ( \t \t \t \t \t \t prevImage.getWidth (нуль) + 10, \t \t \t \t \t \t prevImage.getWidth (нуль) + 10, Image.SCALE_DEFAULT)) ; ' внутри if of checkIfEaten(), и это приводит к тому, что мяч становится больше навсегда. Есть идеи? Благодаря! – RominaV

+0

Вы можете проверить, достиг ли максимальный размер изображения, а затем прекратить увеличивать его размер. См. Мое редактирование. –

+0

Спасибо. Вы знаете, почему он продолжает выполнять код внутри if? – RominaV

1

Если у вас есть объект изображения, вы действительно не нужно беспокоиться об изменении размера, просто использовать

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

Вы хотели бы изменить/newHeight параметры newWidth, но кроме этого, вы должны будь хорошим! Вы можете читать намного больше here.

Надеюсь, это поможет!

+0

Привет! Я помещал это в 'checkIfEaten()': 'Image im = ball.getImage(); \t \t \t \t im.getScaledInstance (im.getWidth (нуль) + 5, im.getHeight (нуль) + 5, im.SCALE_DEFAULT); ' Но это ничего не делать. Я пишу его не в том месте? Большое спасибо! – RominaV

+0

Ну, я не привык к этой части Java, но с тем, что я знаю, im.SCALE_DEFAULT не прав. SCALE_DEFAULT - это определенная переменная в классе Image, поэтому, когда вы ее используете, вы должны делать Image.SCALE_DEFAULT, и она должна работать. Кроме того, когда вы делаете getWidth(), я не думаю, что вам нужно поместить нуль, но это не повредит вашей игре. – user2277872

+0

Проблема заключалась в том, что, как только я масштабировал ее, я не задал ее как образ шара. Спасибо за ваш ответ :) Я сейчас столкнулся с проблемой, которую я прокомментировал в ответе Рустаги: P – RominaV

Смежные вопросы