2014-04-18 2 views
0

이 코드는 간단한 자바 게임으로되어 있습니다. 녹색으로 움직이는 사각형 하나 (플레이어)와 몇 개의 다른 사각형 (적)이 있습니다. 프레임에 대한 키 수신기를 설정 했으므로 녹색 사각형을 움직일 수 있습니다.하지만 플레이어의 x 및 y 좌표를 눈에 띄게 변경하려면 paintCoponent 메서드에서 다시 그리기를 호출해야합니다. 이렇게하면 녹색 직사각형을 이동할 수 있지만 다른 직사각형은 새로운 좌표로 다시 생성됩니다.이 불필요한 효과를 중지하려면 어떻게해야합니까?자바 그리기 문제

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.Random; 

public class Drawing extends JPanel implements KeyListener 
{ 
public static JFrame frame; 
public static int[] x=new int[10]; 
public static int[] y=new int[10]; 
public static int a; 
public static Random random; 
public static int p_x=0; 
public static int p_y=0; 

public static void drawframe(int width,int height) 
{ 
    frame=new JFrame("The game"); 
    frame.setSize(width,height); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setResizable(false); 
    frame.addKeyListener(new Drawing()); 
} 

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

    drawenemies(g,6); 
    setradius(g); 
    setplayer(g); 
} 

public void drawenemies(Graphics g,int amount) 
{ 
    random=new Random(); 
    a=amount; 

    for(int i=1;i<=amount;i++) 
    { 
     x[i]=random.nextInt(frame.getWidth()); 
     y[i]=random.nextInt(frame.getHeight()); 

     g.fillRect(x[i], y[i], 20, 20); 
    } 
} 

public void setradius(Graphics g) 
{ 
    g.setColor(Color.RED); 

    for(int i=1;i<=a;i++) 
    { 
     g.drawRect(x[i]-15, y[i]-15, 50, 50); 
    } 
} 

public void setplayer(Graphics g) 
{ 
    g.setColor(Color.GREEN); 
    g.fillRect(p_x, p_y, 20, 20); 
} 

public static void main(String args[]) 
{ 
    drawframe(500,500); 
    Drawing instance=new Drawing(); 
    frame.add(instance); 

} 

@Override 
public void keyPressed(KeyEvent e) 
{ 
    if(e.getKeyCode()==39) 
    { 
     p_x=p_x+10; 
    } 
} 




public void keyReleased(KeyEvent arg0){} 
public void keyTyped(KeyEvent arg0){} 

} 

답변

1

코드는 사용자가 정의한 동작을 나타내지 않습니다.

그러나 의 두 개의 인스턴스가 그리기가 :

frame.addKeyListener(new Drawing()); 
//.... 
Drawing instance=new Drawing(); 

상단 하나를 제거하고 주요에서 하나를 사용하십시오 또한

Drawing instance=new Drawing(); 
frame.add(instance); 
frame.addKeyListener(instance); 

재 페인트를 호출하지 않습니다() in paintComponent (Graphics) 이것은 지속적으로 페인트 호출을 생성합니다. 상태를 약간 수정 한 후에 호출하십시오. 의 keyPressed (KeyEvent)입니다.

도 참조하십시오. Painting in AWT and Swing.