2015-05-16 3 views
2

Я использую Graphics g для рисования изображения для своего плеера и карты. Всякий раз, когда игрок перемещается, я хочу обновить изображение проигрывателя до нового местоположения без обновления изображения карты. Как я могу это сделать?Java-графика - перерисовка изображения без удаления другого

Заранее благодарим за любые ответы!

Извините за мой грязный код.

Main: 
package Main; 
import java.awt.Dimension; 

import javax.swing.JFrame; 

public class Main { 
    public static JFrame frame; 

    static int size = 32; 
    static int width = size*20; 
    static int height = size*17; 

    static playerObj p = new playerObj(200,200); 

    static tileMap grid = new tileMap(); 

    public static void main(String[] args) { 
     frame = new JFrame("Game"); 
     frame.getContentPane().setPreferredSize(new Dimension(width-9, height-9)); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.add(new drawGraphics()); 
     frame.setVisible(true); 
    } 
} 

drawGraphics: 
package Main; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JPanel; 

public class drawGraphics extends JPanel implements Runnable { 
    private static final long serialVersionUID = 1L; 

    boolean running = true; 
    boolean renderMap = true; 

    playerObj p = Main.p; 
    int size = Main.size; 
    static int x = 0; 
    static int y = 0; 

    Thread thread = new Thread(this); 

    public drawGraphics() { 
     setFocusable(true); 
     addKeyListener(new controls()); 
     start(); 
    } 

    public void start() { 
     thread.start(); 
    } 

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

     if (renderMap) { 
      map(d); 
     } 

     player(g); 

     repaint(); 
    } 

    public void player(Graphics g) { 
     try { 
      BufferedImage pImg = ImageIO.read(new File("images/player.png")); 
      g.drawImage(pImg, p.getX(), p.getY(), null); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void map(Graphics g) { 
     System.out.println("2dfsdf"); 
     Graphics2D d = (Graphics2D) g; 
     for (int i = 0; i < tileMap.map.length; i++) { 
      for (int j = 0; j < tileMap.map[i].length; j++) { 
       d.setColor(tileMap.map[i][j].getC()); 
       d.fillRect(tileMap.map[i][j].getX(), tileMap.map[i][j].getY(), 
         Main.size, Main.size); 
       if (tileMap.map[i][j].solid()) { 
        d.setColor(Color.BLACK); 
        d.drawRect(tileMap.map[i][j].getX(), 
          tileMap.map[i][j].getY(), Main.size, Main.size); 
       } 
      } 
     } 
    } 

    public void move() { 
     if (controls.up) { 
      controls.goUp(); 
      y--; 
      repaint(); 
     } 
     if (controls.down) { 
      controls.goDown(); 
      y++; 
      repaint(); 
     } 
     if (controls.left) { 
      controls.goLeft(); 
      x--; 
      repaint(); 
     } 
     if (controls.right) { 
      controls.goRight(); 
      x++; 
      repaint(); 
     } 
     if (controls.place) { 
      repaint(); 
     } 
    } 

    public void run() { 
     while (running == true) { 
      move(); 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

Использование графики где? – ChiefTwoPencils

+0

поделиться своим кодом – sparsh610

+0

На JFrame. Было бы лучше, если бы я просто скопировал и вставил часть своего кода в сообщение? – TIMMEHf32432

ответ

3

Не рисовать прямо в JFrame, а в JPanel, который отображается в JFrame.

Если вы используете Swing в качестве вашей графической библиотеки, затем нарисуйте фон как BufferedImage и нарисуйте его первым в методе paintComponent. Затем проведите Ваш спрайт изображения на любом месте, необходимых в следующем:

@Override // this is in a JPanel extended class 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    if (backgroundImg != null) { 
     g.drawImage(backgroundImg, 0, 0, null); 
    } 
    if (spriteImg != null) { 
     g.drawImage(spriteImg, spriteX, spriteY, null); 
    } 
} 

Некоторые проблемы с кодом:

  • Не перегружайте paint, а затем вызвать super.paintComponent внутри него.
  • Вместо этого переопределите paintComponent и вызовите тот же супер метод внутри.
  • Никогда не звоните repaint() внутри краски или краски. Компонент. Вместо этого используйте Swing Timer.
  • В вашем методе player(...) вы перечитываете изображение в каждый момент вызова метода, что замедляет вашу картину до обхода. Не делайте этого, но вместо этого прочитайте изображение за один раз и сохраните его в переменной.
+0

Теперь я добавил свой код в свой вопрос. – TIMMEHf32432

+0

@ TIMMEHf32432: см. Правки, пожалуйста, –

+0

Спасибо, я исправлю их сейчас! – TIMMEHf32432