2011-06-13 5 views
-5

내 코드가 OO가 아니라고 친구에게 들었습니다. 어떻게하면 더 많은 객체 지향과 재사용이 가능합니까? 레벨이라 불리는 클래스를 만들려고 노력했는데, 레벨에서 이미지를 인쇄했지만 인쇄되지 않았기 때문에 작동하지 않았습니다.이 코드를 객체 지향적으로 만드시겠습니까?

public class Main extends Applet implements Runnable, KeyListener, 
java.awt.event.MouseListener { 
double x_pos = 300; 
double y_pos = 200; 
int radius = 20; 
int appletsize_x = 640; 
int appletsize_y = 440; 
double speed = 3; 
float speedModifier = 1f; 
Image grass; 
Image hero; 
Image hero45; 
Image hero90; 
Image hero135; 
Image hero180; 
Image hero225; 
Image hero270; 
Image hero315; 
Image sprite; 
Image tree; 
Image path; 

private boolean leftPressed; 
private boolean rightPressed; 
private boolean downPressed; 
private boolean upPressed; 

private Image dbImage; 
private Graphics dbg; 

public void init() { 
    Dimension dim = getMaximumSize(); 
    this.setSize(appletsize_x, appletsize_y); 
    MediaTracker mt = new MediaTracker(this); 
    tree = getImage(getCodeBase(), "tree_64.png"); 
    grass = getImage(getCodeBase(), "grassTile.png"); 
    path = getImage(getCodeBase(), "path.png"); 
    hero = getImage(getCodeBase(), "hero.png"); 
    hero45 = getImage(getCodeBase(), "hero45.png"); 
    hero90 = getImage(getCodeBase(), "hero90.png"); 
    hero135 = getImage(getCodeBase(), "hero135.png"); 
    hero180 = getImage(getCodeBase(), "hero180.png"); 
    hero225 = getImage(getCodeBase(), "hero225.png"); 
    hero270 = getImage(getCodeBase(), "hero270.png"); 
    hero315 = getImage(getCodeBase(), "hero315.png"); 
    sprite = getImage(getCodeBase(), "hero.png"); 
    mt.addImage(hero, 0); 
    mt.addImage(path, 0); 
    mt.addImage(tree, 0); 
    mt.addImage(grass, 0); 
    mt.addImage(hero45, 0); 
    mt.addImage(hero90, 0); 
    mt.addImage(hero135, 0); 
    mt.addImage(hero180, 0); 
    mt.addImage(hero225, 0); 
    mt.addImage(hero270, 0); 

    try { 
     mt.waitForID(0); 
    } catch (InterruptedException ie) { 
    } 
} 

public void start() { 

    this.addKeyListener(this); 
    this.addMouseListener(this); 
    Thread th = new Thread(this); 
    th.start(); 
} 

public void stop() { 

} 

public void destroy() { 

} 

public void run() { 

    // lower ThreadPriority 
    this.requestFocusInWindow(); 
    Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

    while (true) { 

     if (downPressed && leftPressed) { 
      double y_decr, x_incr; 
      y_decr = Math.sqrt(Math.pow(speed, 2))/1.5; 
      x_incr = Math.sqrt(Math.pow(speed, 2))/1.5; 
      y_pos += y_decr; 
      x_pos -= x_incr; 
     } else if (downPressed && rightPressed) { 
      y_pos += Math.sqrt(Math.pow(speed, 2))/1.5; 
      x_pos += Math.sqrt(Math.pow(speed, 2))/1.5; 
     } else if (upPressed && rightPressed) { 
      y_pos -= Math.sqrt(Math.pow(speed, 2))/1.5; 
      x_pos += Math.sqrt(Math.pow(speed, 2))/1.5; 
     } else if (upPressed && leftPressed) { 
      y_pos -= Math.sqrt(Math.pow(speed, 2))/1.5; 
      x_pos -= Math.sqrt(Math.pow(speed, 2))/1.5; 
     } else { 
      // Hitting (right) 
      if (x_pos > this.getSize().width - radius) { 

       // x_speed = -x_speed; 
      } 
      if (leftPressed == true) { 
       x_pos -= speed * speedModifier; 
      } 

      if (rightPressed == true) { 
       x_pos += speed * speedModifier; 
      } 

      if (upPressed == true) { 
       y_pos -= speed * speedModifier; 
      } 

      if (downPressed == true) { 
       y_pos += speed * speedModifier; 

      } 
     } 

     // Hitting right 

     if (x_pos > this.getSize().width - 32) { 
      x_pos = this.getSize().width - 32; 

     } // Hitting left 
     if (x_pos < 0) { 
      x_pos = 0; 
     } 
     // } // Hitting top 
     if (y_pos < 0) { 
      y_pos = 0; 

     } 

     // Hitting bottom 
     if (y_pos > this.getSize().height - 32) { 
      y_pos = this.getSize().height - 32; 

     } 


     repaint(); 

     try { 
      // Stop thread for 1 milliseconds 
      Thread.sleep(20); 
     } catch (InterruptedException ex) { 
      // do nothing 
     } 

     // set ThreadPriority to maximum value 
     Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 
    } 
} 

public void paint(Graphics g) { 
    int layout = 0; 
    int coll = 0; 
    while (coll <= 440) { 
     drawRows(layout, grass, g, coll); 
     coll = coll + 32; 
    } 
    drawCollums(0, path, g, 180); 
    g.drawImage(tree, 50, 40, this); 
    g.drawImage(tree, 300, 20, this); 
    g.drawImage(tree, 500, 300, this); 
    int x_posI = (int) x_pos; 
    int y_posI = (int) y_pos; 

    if (downPressed && leftPressed) { 
     this.sprite = hero225; 
    } else if (downPressed && rightPressed) { 
     this.sprite = hero135; 
    } else if (upPressed && rightPressed) { 
     this.sprite = hero45; 
    } else if (upPressed && leftPressed) { 
     this.sprite = hero315; 
    } else if (leftPressed == true) { 
     this.sprite = hero270; 
    } else if (rightPressed == true) { 
     this.sprite = hero90; 
    } else if (upPressed == true) { 
     this.sprite = hero; 
    } else if (downPressed == true) { 
     this.sprite = hero180; 
    } 

    // this.sprite will contain value set on last "movement" 
    g.drawImage(this.sprite, x_posI, y_posI, this); 


} 



public void update(Graphics g) { 

    if (dbImage == null) { 
     dbImage = createImage(this.getSize().width, this.getSize().height); 
     dbg = dbImage.getGraphics(); 
    } 

    dbg.setColor(getBackground()); 
    dbg.fillRect(0, 0, this.getSize().width, this.getSize().height); 

    dbg.setColor(getForeground()); 
    paint(dbg); 

    g.drawImage(dbImage, 0, 0, this); 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     leftPressed = true; 

    } 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     rightPressed = true; 

    } 
    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     upPressed = true; 
    } 
    if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     downPressed = true; 
    } 

} 

@Override 
public void keyReleased(KeyEvent e) { 

    if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     leftPressed = false; 
    } 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 

     rightPressed = false; 
    } 
    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     upPressed = false; 

    } 
    if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     downPressed = false; 
    } 
} 

@Override 
public void keyTyped(KeyEvent e) { 

} 

@Override 
public void mouseClicked(MouseEvent e) { 
    System.out.println("HIT!"); 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseEntered(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseExited(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mousePressed(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseReleased(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

public void drawRows(int x, Image image, Graphics g, int coll) { 
    while (x <= appletsize_x) { 
     g.drawImage(image, x, coll, this); 
     x += 32; 
    } 
} 

public void drawCollums(int y, Image image, Graphics g, int coll) { 
    while (y <= appletsize_x) { 
     g.drawImage(image, coll, y, this); 
     y += 32; 
    } 
} 
} 
+6

[God objects] (http://en.wikipedia.org/wiki/God_object)에 대해 읽어보고 먼저 작성하지 않도록하십시오.이것은'(코드 덤프오고, 죄송합니다)'에 대한 것입니다. –

+0

저는 누군가가 당신의 코드를 리팩터링 할 것이라고 생각지 않습니다. 당신이하는 일을 말조차하지 않았습니다. 객체 지향 프로그래밍에 대한 책을 읽고 간단한 예제부터 가능한 한 많이 배우십시오. 이 코드에는 실제로/OOP가 거의 없습니다. –

+2

내 이전 댓글에 대한 추가 정보. 서로 다른 책임 집합마다 별도의 클래스가 있다면 코드가이를 반영했을 것이며 그렇게 될 수도 있습니다. 전체 수업을 읽지는 않았지만, 우려를 나누면 독서에 도움이되었을 것입니다. –

답변

3

그럼 한 가지, 모든 이미지 배열에 있어야합니다 (코드 덤프오고, 미안 해요). 그리고 그들은 좋은 루프에서로드 할 수 있도록 파일 이름을 포함해야합니다. 당신은 복사의 3 페이지 이상 & 붙여 넣기 코드, 그건 절대적으로 끔찍한 ... 만약 당신이 약간로드 할 방법을 변경하려면?

그러면 Math.sqrt(Math.pow(speed, 2))이 나에게 뛰어납니다. 이는 Math.abs(speed)에 해당하며 약 1/200x는 빠릅니다.

다음 부분도 특히 재미 있습니다. 나는 그것이 (그리고 대부분은 당신의 부분에 설계 결함이다, 아니다) 필요한 여부에 대해 언급하지 않지만 .. 나중에 ..

 // Stop thread for 1 milliseconds 
     Thread.sleep(20); 
+0

+1, 가혹한 o_O, 그러나 사실 ... – mre

+0

나는 그 것이 가혹하다고 생각하지 않는다. 나는 그의 코드를 개선하기 위해 구체적인 포인트를 주었다. – Blindy

+0

나는 그것을 제거하고, 그것은 약간 재미있는 휴식을 일으켰습니다. – Derek

1

이 응용 프로그램에 대한 새 패키지를 구축하고 모든 데이터 구조를 안에 그룹화하십시오. 영웅을위한 수업을 만들고 나무와 풀에 대한 수업을 만듭니다. 클래스를 사용하여 속성을 공유하고 클래스 계층을 만드는 방법을 볼 수 있습니다.

는 여기에 당신에게 객체 지향 과정을 줄 길 수도, 몇 가지 단서이다)

하지만이 트랙을 따라 읽기.

또한 threads elegantly을 중지하는 방법을 알아야합니다.

그리고 내부 클래스를 Listener에 사용할 수 있으며 MouseAdater를 사용할 수도 있습니다.

감사합니다, 스테판

4

당신은 그 또는 그녀가 무엇을 의미하는지 당신의 친구를 요청해야합니다. 추측한다면 애플릿 클래스가 많은 일을하고 있다고 말할 수 있습니다. 애니메이션 루프입니다. 핵심 처리기입니다. 마우스 처리기입니다. 그것은 UI입니다. 그것들은 함께 작동하도록 설계된 별도의 객체로 분리 될 수 있습니다.

또 다른 개선 사항은 4 개의 ...Pressed 플래그를 0에서 7까지의 정수로 변환하여 8 가지 방향을 나타내는 것입니다. 예를 들어 :

0 1 2 
7 3 
6 5 4 

(당신은 방향 번호 당신이 원하는 방식을 지정할 수 있습니다.) 그런 다음 이미지의 배열로 인덱스로 방향 번호를 사용할 수 있습니다. (이것은 객체 지향적 인 것과는 아무런 관련이 없습니다. 그러나 코드를 단순화 할 것입니다.)

2

OOP에 관한 책과 기사를 읽으시기 바랍니다.이 특별한 경우 MVC 패턴 (MVC article in wikipedia)을 살펴 보시기 바랍니다. . 좋은 OO 개념을 위해서는 이벤트 (예 : keyPressed(KeyEvent e))를 실제 "그래픽 구축"클래스와 동일한 클래스로 처리하면 안됩니다.

0

game을 연구하면 키보드를 사용하여 그리드 주위로 플레이어를 움직일 수 있습니다.

관련 문제