2012-10-12 3 views
0

나는 모든 것을 가지고 팩맨 게임을 만들었지 만, 문제는 유령과 애니메이션에 많은 코드가 필요하다는 것입니다.다른 오브젝트를위한 Java의 for-each 루프

예 :

마다 고스트 3 필요한 경우 고스트 당 코드의 20 개 라인이고 순간 문 난 쓸모 코딩의 3 × 20 = 60 라인 인 게임 3 유령이 있으면 ..

내 php 경험과 함께 말하자면 ... foreach 루프 나 비슷한 것을 사용하십시오.하지만 자바에서 어떻게해야합니까? 누군가가 내게 모범을 보여줄 수 있습니까? 내가 지금하는 방법은 아래에 게시됩니다 :

유령 개체 만들기; 당신은 객체 지향 방식으로이 접근하지 않는 것처럼

int g1x = 0; 
boolean g1r = true; 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    // pacman movement 
    diameter = 75; 
    pacman.drawPacMan(g, getHorPlaats(), getVerPlaats(), diameter, getView(), Color.yellow); 
    // ghosts movement 
    if(g1r == true) { 
     g1x += ghostSpeed;   
    }  
    if(g1r == false) {   
     g1x -= ghostSpeed; 
    } 
    if(g1x == 500 || g1x == 0) { 
     g1r = !g1r; 
    } 
    System.out.println(g1r); 
    ghost1.drawGhost(g, g1x, 40, diameter, Color.red); 
    ghost2.drawGhost(g, 170, 70, diameter, Color.blue); 
} 
+0

해결하려는 문제가 정확히 무엇입니까? 코드가 너무 많습니까? 코드의 비효율적 인 재사용? 유령의 움직임을 처리하는 데 많은 시간이 필요합니까? –

+2

@ Dr.Dredel OP는 그의 문제를 아주 분명하게 진술했습니다. 그것은 코드 디자인입니다. –

답변

7

그것은 나에게 같습니다

DrawPacMan ghost1 = new DrawPacMan(); 
DrawPacMan ghost2 = new DrawPacMan(); 

은과 그림은 같이 간다. 왜 귀신의 수집을 사용하지 마십시오. List<Ghost> 및 그 위치, 색상 등 Ghost 개체를 정의?

이 줄 :

ghost1.drawGhost(g, g1x, 40, diameter, Color.red); 

다음

ghost.draw(g); 

로 교체 될 것입니다 그리고 당신은 각 draw()를 호출 목록을 반복하는 것입니다.

for(Ghost ghost : ghosts) { 
    ghost.draw(g); // pass in the graphics context 
    } 

은 위치, 색상, 상태 등 그리고 당신은 당신이 원하는만큼 만들 수 있습니다을 알고 각각의 유령 :

List<Ghost> ghosts = new ArrayList<Ghost>(); 
    for (int i = 0; i < 10; i++) { 
     ghosts.add(new Ghost()); 
    } 
+0

@OPThis 더 나은 방법입니다 ... 어쩌면 전략 패턴에 대해 조금 읽어 – Atul

+0

예를 들어 주셔서 감사합니다! 내 목록은 어떻게 생겼을 까? 나는 Java에 익숙하지 않고 아직 대부분의 기능을 모른다. – Reshad

+0

@Reshad - 수정 된 대답은 –

0
  1. 이 같은 기능의 다른 매개 변수로 유령 개체를 전달을 paintComponent (Graphics g, Ghost gr)
  2. 조건문을 인라인으로 만들 수 있습니다. g1r == true? g1x + = 고스트 스피드 : g1x - = 고스트 스피드
2

자바에 익숙하지 않은 것 같아서 여전히 최고의 관용구를 알고 있기 때문에 귀하의 질문에 대한 답이 아니라는 것을 조언 해 드리겠습니다. 그래서 좀 더 일반적인 의미에서. 귀하의 코드

if(g1r == true) { 
    g1x += ghostSpeed;   
}  
if(g1r == false) {   
    g1x -= ghostSpeed; 
} 

g1x += ghostSpeed * (g1r? 1 : -1); 

일반적인 참고로 다시 작성할 수 있습니다 : 결코 리터럴 값에 논리 값을 비교합니다. b == trueb과 동일하고 b == false!b과 동일합니다.

당신은 펜싱-의 코드로 선행하지 않는

if (g1x == 500 || g1x == 0) { 
    g1r = !g1r; 
} 

아마 런타임에 버그가 발생합니다이 코드 : g1x 쉽게 제한을 통해 단계 수 있습니다.대신 작성해야합니다

if (g1x >= 500) { g1x = 500; g1r = false; } 
else if (g1x <= 0) { g1x = 0; g1r = true; } 
+0

팁 주셔서 감사합니다! 두 번째 것은 내가 생각하고있는 동안 혼란스러워했고 코드는 내가 썼다 그래서 나는 다시 보지 않았다. 그러나 이것은 훨씬 더 많은 논리처럼 보인다! 이 방법으로 바꿀거야 :) – Reshad