2013-10-31 2 views
1

나는 간단한 게임을 만들고 있는데, 플레이어는 기본적으로 위험한 암석을 피하면서 좌우로 움직이는 캐릭터를 조정하고 포인트를 증가시키기 위해 다른 보석을 잡으려고합니다.적당히 참조하는 객체

그러나 저는 OO 디자인을 연습하기 위해 MVC 레이아웃을 사용하려고합니다. P :

  1. 나는 화면에있는 모든 개체를 보유하고 GameScreen 클래스가 여기에

    이 처음 문제없이이 일을하기 때문에 내가 잘하면 내가이 잘못을하고있는 중이 야, 무슨이다 .
  2. 나는 모든 애니메이션과 렌더링뿐만 아니라 카메라를 처리하는 WorldRenderer 클래스를 보유하고 있습니다.
  3. 마지막으로 사용자로부터 모든 입력을 처리하는 컨트롤러 클래스입니다.

이제 게임 스크린이 내 객체를 만들고 렌더러가 내 객체 상태 및 사용자 입력에 따라 작업을 수행합니다. 그래서 모든 것이 잘 작동합니다.

예를 들어, 컨트롤러가 Jim (문자)을 WALKING STATE로 변경하고 왼쪽을 향하고 있으면 부울을 참으로 변경하고 컨트롤러가 A를 눌렀다 고 전 세계 렌더러에 알리고 텍스처를 D가 눌려지면 월드 렌더러에게 리플 립 등을 알려줍니다. 아무 것도 누르지 않으면 Jim이 유휴 상태로 설정되고 유휴 텍스처가 그려집니다. D :

이제 코드를 체크 아웃 할 수는 있습니다 .... 웃음이

// Draw textures/sprites 
    batch.begin(); 
    if (GameScreen.jim.currentState == 1) { 
     if (GameScreen.jim.facingLeft 
       && !GameScreen.jim.sprites[1].isFlipX()) { 
      for (int i = 0; i < GameScreen.jim.sprites.length; i++) { 
       GameScreen.jim.sprites[i].flip(true, false); 
      } 
     } else if (!GameScreen.jim.facingLeft 
       && GameScreen.jim.sprites[1].isFlipX()) { 
      for (int i = 0; i < GameScreen.jim.sprites.length; i++) { 
       GameScreen.jim.sprites[i].flip(true, false); 
      } 

     } 
     batch.draw(GameScreen.jim.currentFrame, GameScreen.jim.bounds.x, 
       GameScreen.jim.bounds.y, GameScreen.jim.bounds.getWidth(), 
       GameScreen.jim.bounds.getHeight()); 
    } 
    if (GameScreen.jim.currentState == 0) { 
     if (GameScreen.jim.facingLeft && !GameScreen.jim.jim0.isFlipX()) { 
      GameScreen.jim.jim0.flip(true, false); 
     } else if (!GameScreen.jim.facingLeft 
       && GameScreen.jim.jim0.isFlipX()) { 
      GameScreen.jim.jim0.flip(true, false); 
     } 
     batch.draw(GameScreen.jim.jim0, GameScreen.jim.bounds.x, 
       GameScreen.jim.bounds.y, GameScreen.jim.bounds.getWidth(), 
       GameScreen.jim.bounds.getHeight()); 
    } 
    batch.end(); 

그래, 즉의 완전한 닉 봐. 이것은 실제로 작동합니다. 깨지지 않은 것을 고치지 말고 더 많은 것을 배울 때까지이 코드를 수정하지 않을 것입니다. 그러나 더 나은 것이 무엇인지를 아는 것이 좋습니다. 나는 끊임없이 내 짐 다음 변수를 얻기 위해 GameScreen를 참조하는 데

GameScreen.jim.jim0, GameScreen.jim.bounds.x, 
       GameScreen.jim.bounds.y, 

,이 만들어 짐에 배열 등 필드 : 나는이 모든 물건을 좋아하지 않는다. 이 코드는 가장 끔찍한 코드 작성 방법 일뿐만 아니라 완전히 끔찍해 보입니다. :) 짐이 잘 때문에

Jim.jim0; 

이 널 예외가 발생, 아무것도 : 나는 짐 클래스 그렇게하고 대신 할 수없는 방법을 직접 GameScreen를 참조 할 수없는 경우

지금 나는 생각했다. 나는 그를 창조하지 않았다.

지금 나는 내 클래스의 상단에이 작업을 수행하는 경우 : 다음

Jim jim; 

및 사용 :

jim.jim0; 

여전히 널 (null) 예외를.

이 방법을 사용해야합니까? 내가 만든 Jim에 도달하기 전에 먼저 GameScreen을 참조해야하는 것을 피하는 방법에 대해 어떻게 생각합니까? 이건 불가능한가요?

죄송합니다. 텍스트의 벽에는 유감스럽게도 많은 정보가 있으며, 내가 쉐 이후에 대해 설명해주는 것이 좋습니다.

+0

아무것도 설정하지 않았으므로 NullPointerException이 발생합니다. 'Jim jim = new Jim(); '을 시도하십시오. –

답변

2

일부 혼란을 줄이려면 GameScreen 클래스의 정적 가져 오기를 사용할 수 있습니다. 가정은 같은 패키지에있다 :

import static GameScreen.*; 

는 동일한 패키지에 없을 경우 : 다음

import static your.package.here.GameScreen.*; 

최소한 참조 jim 직접 예는 수

if (jim.currentState == 1) { 

이 작동합니다 , 당신은 이미 jim 객체를 만들었습니다.

+0

코드가 좀 더 멋지게 보이게 만들 수 있습니다.이 방법으로 생성 할 수있는 단점이나 문제점이 있습니까? – Gibbo

+0

정적 가져 오기의 가장 큰 단점은 이미 범위에있는 개체와 정적 가져 오기로 범위에 포함시키는 개체 간의 이름 충돌이 발생할 수 있다는 것입니다. 그러나'jim' 객체를위한 것이라면 아무 문제가 없다고 생각합니다. 여러 개의 정적 가져 오기가 있으면 혼란스러운 코드가 될 수 있지만이 클래스를 정적으로 가져온 경우에는 괜찮습니다. – rgettman

관련 문제