2014-04-19 2 views
-1

키패드를 통해 제어되는 모양이 있으며 타이머와 연결되어 있습니다. 모양이 특정 좌표 점에 도달하면 타이머가 중지됩니다. 그렇다면 타이머를 멈춘 곳의 도형을 그대로 남겨두고도 원래의 시작 위치로 되돌려 놓는 방법은 어떻게 될까요? 게시물의 코드에서 잘못된 너무 많은 일이있을 때다른 모양이 원하는 x 및 y 좌표에 도달 한 후에 동일한 모양을 표시하는 방법은 무엇입니까?

public class ForStack extends JPanel implements KeyListener,ActionListener{ 
    Timer t = new Timer(800, this); 

    int count = 0; 
    double x = 0, y = 0, velX = 0, velY = 0; 

public ForStack(){ 
t.start(); 
addKeyListener(this); 
setFocusable(true); 

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

    Rectangle2D rectangle = new Rectangle2D.Double(x,y,50, 50); 
    g2.setColor(Color.BLACK); 
    g2.fill(rectangle); 

    int counter = 0;int x = 0; int y = 0; 
    g.setColor(Color.RED); 


if (counter == 0){ 
do{ 
    g.drawRect(x,y,50,50); 
    x += 50; 
    counter++; 
}while(counter != 6); 

} 


x=0; 
y=0; 
if (counter == 6){ 
    do{ 
     g.drawRect(x,50,50,50); 
     x += 50; 
     counter++; 
    }while(counter != 12); 
} 


x=0; 
y=0; 
if (counter == 12){ 
    do{ 
     g.drawRect(x,100,50,50); 
     x += 50; 
     counter++; 
    }while(counter != 18); 
} 


x=0; 
y=0; 
if (counter == 18){ 
    do{ 
     g.drawRect(x,150,50,50); 
     x += 50; 
     counter++; 
    }while(counter != 24); 
} 


x=0; 
y=0; 
if (counter == 24){ 
    do{ 
     g.drawRect(x,200,50,50); 
     x += 50; 
     counter++; 
    }while(counter != 30); 
    } 


x=0; 
y=0; 
if (counter == 30){ 
    do{ 
     g.drawRect(x,250,50,50); 
     x += 50; 
     counter++; 
    }while(counter != 36); 
} 


x=0; 
y=0; 
if (counter == 36){ 
    do{ 
     g.drawRect(x,300,50,50); 
     x += 50; 
     counter++; 
    }while(counter != 42); 
} 


x=0; 
y=0; 
if (counter == 42){ 
    do{ 
     g.drawRect(x,350,50,50); 
     x += 50; 
     counter++; 
    }while(counter != 48); 
} 


x=0; 
y=0; 
if (counter == 48){ 
    do{ 
     g.drawRect(x,400,50,50); 
     x += 50; 
     counter++; 
    }while(counter != 54); 
} 


x=0; 
y=0; 
if (counter == 54){ 
    do{ 
     g.drawRect(x,450,50,50); 
     x += 50; 
     counter++; 
    }while(counter != 60); 
} 
} 

@Override 
public void actionPerformed(ActionEvent e){ 
if(x == 0 & y == 400){ 
    t.stop();  
}  

    repaint(); 
    x += velX; 
    y += velY; 
} 


@Override 
public void keyPressed(KeyEvent e){ 
    int code = e.getKeyCode(); 
if (code == KeyEvent.VK_DOWN){ 
    velY += 50; 
    velX += 0; 
} 
else if (code == KeyEvent.VK_LEFT){ 
    velX -= 50; 
    velY = 0; 
} 
else if (code == KeyEvent.VK_RIGHT){ 
    velX += 50; 
    velY = 0; 
} 


} 
    @Override 
    public void keyTyped(KeyEvent e) {} 
    @Override 
    public void keyReleased(KeyEvent e){} 


public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    frame.add(new ForStack()); 
    frame.setVisible(true); 
    frame.setSize(800,600); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} // end of main 
} // end of class 
+0

&가 :(난 정말 이해가 안되지 & &를 사용하고 싶습니다. 어떻게 내가 잘못하고있는 중이 야? –

+0

더 도움이 필요하면 더 빨리,이 [MCVE]를 게시 (HTTP : //stackoverflow.com/help/mcve) (최소한의 완전하고 검증 가능한 예제) –

답변

1

는 일반적으로, 나는이 문제에 대한 답은 너무 많은 수정을 필요로 떨어져, 자신의 아래 코드를 깨고 모든 리팩토링 포함하는 경향이있다. 나는 그렇게하지 않을 것이다. 나는 너에게 맡길거야. 나는 내가 알아 차 렸던 것을 지적하고 그것을 시도하고 고치기 위해 당신에게 맡깁니다.

  1. 모든 그동안 루프 제거하십시오. 로직을 너무 많이 사용하여 paint 메소드에 포함 시켰습니다. 나는 정말로 당신이 그 논리로 성취하려는 것을 생각하지 못하지만, 단지 이 완전히 틀린 것처럼 보입니다..

  2. 당신이 할 수있는 일은 List 또는 Rectangles입니다. 목록에 다른 Rectangle을 추가하십시오. 한 번에 하나씩 만 애니메이션으로 나타납니다. 나머지는 모두 마지막 지점에 배치됩니다. List에 대한 인덱스 사용 타이머에서 해당 인덱스를 확인하고 해당 인덱스가 같은 경우에만 애니메이션을 적용합니다. paint 메서드에서 List를 반복하여 모두 그려야합니다. 요점은 당신의 그림을 당신의 논리와 분리시키는 것입니다.

  3. paint을 무시하지 마십시오 , 대신 paintComponent

  4. 사용 Key Bindings 대신 KeyListener

  5. if(x == 0 & y == 400){인가 당신이 정말 원하는거야? 아마도 || 당신이 원하는 경우, 당신은

+0

while 루프는 그리드를 표시합니다. 게시물을 보내 주셔서 감사합니다. –

+0

그리드를 표시하려면 [this 대답] (http://stackoverflow.com/a/22728604/2587435). 그것은 반복 루프 잔뜩 대신 루프를 사용합니다. –