2015-06-15 4 views
1

Я занимаюсь игрой в java, и моя проблема заключается в настройке фона. Я пробовал использовать g.drawImage(), но, как его перекрашивает каждый раз, заставляйте fps падать много. Поэтому я исправил эту проблему fps, установив фон JLabel и ImageIcon. Но ярлык накладывает графику, как я могу это исправить?Графика наложения jlabel image Icon

public class GameScreen extends Screen implements Observer { 

private static GameScreen gamescreen; 
private Game game; 
private JLabel label = new JLabel(); 
private ImageIcon icon = new ImageIcon("./res/img/bg1.png"); 

private GameScreen() { 
    setGame(Game.getInstance()); 

    setLayout(null); 
    label.setIcon(icon); 
    label.setBounds(0, 0, 600, 600); 

    add(label); 
} 

public static GameScreen getInstance() { 
    if(getGameScreen() == null) { 
     setGameScreen(new GameScreen()); 
    } 
    return getGameScreen(); 
} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    //PaintWorld 
    new DrawableWorld().draw(g, getWidth(), getHeight()); 
    //Paint players 
    new DrawablePlayer().draw(g, getWidth(), getHeight(), getGame().getPlayers()); 
    //Paint hud 
    new DrawableHud().draw(g, getWidth(), getGame().getPlayers()); 
} 

@Override 
public void update(Observable o, Object arg) { 
    repaint(); 
} 
//getters & setters.. 

Пример: Example

PS: Все DrawableClasses расширяет экран, который расширяет JPanel

+0

Try использовать [BackgroundPanel] (https://tips4java.wordpress.com/2008/10/12/background-panel/) – alex2410

+0

Случается же, он накладывает графику :( – Frank

ответ

1

g.drawImage является очень быстрым (в определенной степени) операции. Вы масштабируете изображение во время рисования? Вы используете подсказки рендеринга «максимального качества»?

+0

yeh, getScaledInstance (getWidth(), getHeight(), Image.SCALE_SMOOTH) – Frank

+0

Так масштабируйте его один раз, сохраните на новом изображении и нарисуйте только это новое изображение. –

+0

Это должен быть комментарий, а не комментарий ответ – CodeNewbie

0

@serg.nechaev ответ.

public class GameScreen extends Screen implements Observer { 

private static GameScreen gamescreen; 
private Game game; 
//New static vars 
private static BufferedImage image; 
private static Image img; 
private static int w = 0; 
private static int h = 0; 

private GameScreen() { 
    setGame(Game.getInstance()); 
    setImage(); 
} 

public static GameScreen getInstance() { 
    if(getGameScreen() == null) { 
     setGameScreen(new GameScreen()); 
    } 
    return getGameScreen(); 
} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    //Scaling once 
    if(w != getWidth() || h != getHeight()) { 
     img = getImage().getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH); 
     w = getWidth(); 
     h = getHeight();  
    } 
    else{ 
     g.drawImage(getImg(), 0, 0, this); 
    } 

    //PaintWorld 
    new DrawableWorld().draw(g, getWidth(), getHeight()); 
    //Paint players 
    new DrawablePlayer().draw(g, getWidth(), getHeight(), getGame().getPlayers()); 
    //Paint hud 
    new DrawableHud().draw(g, getWidth(), getGame().getPlayers()); 
} 

@Override 
public void update(Observable o, Object arg) { 
    repaint(); 
} 
//getters & setters.. 
    public BufferedImage getImage() { 
    return image; 
} 

public void setImage() { 
    try { 
     GameScreen.image = ImageIO.read(new File("./res/img/bg1.png")); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public Image getImg() { 
    return GameScreen.img; 
} 

Результата с хорошим кадром: enter image description here

+0

'Создание некоторых статических переменных' Не используйте статические переменные. Переменные являются свойствами этого класса и не должны быть статическими. Кроме того, почему вы создаете новые классы в методе рисования? Метод рисования должен быть просто для рисования, а не для создания новых объектов. – camickr