2012-01-22 11 views
0

저는 안드로이드 용 게임 프로그래밍을 배우기 위해 안드로이드 용 테트리스 게임을 만들려고합니다. 내 goLeft/권리는 버튼을 누를 때 오른쪽 나누기, 왼쪽으로가는 코드는 필드 int 배열과 목록 부분 배열로 구분 된 클래스에 있습니다. 필드 배열은 참조 된 변수 (TetrisWorld tetrisworld;)에 의해 액세스됩니다. 파트 목록 배열은 public이므로 이렇게 goLeft() 코드에있는 변수 (부분) 코드를 통해 액세스합니다. 이는 고장시 : 왼쪽위한 경우 (! tetrisworld.fields는 [X] [part.y] = 0) 코드 :테트리스, 안드로이드/자바에 대한 int 배열에서 왼쪽/오른쪽을 확인하십시오.

public void goLeft() { 
    int x = 0; 
    for(int i = 0; i < 4; i++) { 
     TetrisParts part = parts.get(i); 
     x = part.x - 1; 
     if(tetrisworld.fields[x][part.y] != 0) { 
      noleft = true; 
      break; 
     } 
    } 
    if(noleft == false) { 
     for(int i = 0; i < 4; i++) { 
      TetrisParts part = parts.get(i); 
      part.x--; 
     } 
    } 
} 

필드의 int 배열하는 코드 :

int fields[][] = new int[WORLD_WIDTH][WORLD_HEIGHT]; 

WORLD_WIDTH 및 WORLD_HEIGHT 너비가 9이고 높이가 19 인 정적 최종 정수입니다.

if (tetrisworld.fields [0] [0] == 0) 퍼팅을 시도했는데 충돌이 발생하여 생각하지 않습니다. 변수들로 처리하십시오. 또한 x = 5 주위에 산란하는 teroid가 있기 때문에 코드를 추가하지 않아도 코드가 추가되지 않더라도 왼쪽/오른쪽으로 갈 수 없기 때문에 바깥으로 나가지 않습니다. 일어났습니다

나는 "world = TetrisWorld();"가있는 gamescreen 클래스로 goLeft/Right 메소드를 옮겨 보았습니다. 그리고 여전히 같은 자리

UPDATE에서 버그 아웃 :

좋아 단지 추가 : 첫 번째로

tetrisworld != null 

문은, 내 질문에 지금, 왜 그것을 해결 되었습니까 고정하면? 왜이 수표없이 이동할 수 없습니까? 분명히 내가 아는 바로는 null이 아닙니다. 지금은 완전히 반응합니다.

그러나 쉬운 방법은 정적에 fields을 변화 쉬운 SOOOO 인이 해결했다고 ... 그때는 리카에 액세스하는 것은 너무 : TetrisWorld.fields 그래서 내 업데이트 된 코드는 다음과 같습니다 당신이 경우 IndexOutOfBoundsException를 치는 것 같은

public void goLeft() 
    { 
    noleft = false; 
    for (int i = 0; i < 4; i++) 
    { 
    part = parts.get(i); 
    if (part.x - 1 < 0 || TetrisWorld.fields[part.x - 1][part.y] != 0) 
     { 
     noleft = true; 
     break; 
     } 
    } 
    if (noleft == false) 
    { 
    for (int i = 0; i < 4; i++) 
     { 
     part = parts.get(i); 
     part.x--; 
     } 
    } 
    } 
+2

Java 프로그램이 거의 충돌하지 않습니다. 대부분의 경우 유형, 메시지 및 스택 추적을 사용하여 예외가 발생합니다. 그들을 읽고, 당신이 그들을 이해할 수없는 경우에 게시하십시오. –

+0

'tetrisworld'의 값은 어떻게 설정하고 있습니까? –

+1

초보자를위한 게임? 어, 오, 그게 문제를 비명 지어. 그런 일을하기 전에 안드로이드의 기초를 배워야합니다. 게임은 내 경험으로 프로그램하기가 더 어려운 것 중 하나입니다. – JoxTraex

답변

0

좋아? 이미 TetrisWorld tetrisworld = new TetrisWorld();을 수행하지 않고 초기화하는 방법이 있습니까? 왜냐하면 다른 클래스에서 이미 생성 되었기 때문에 수천 개의 오류가 발생하므로 실제 스택 오버플로가 발생합니다. lul ... 아직 100 % 긍정적이지는 않습니다. 확인을 위해 의견을 말하고 가능한 한 더 좋은 방법을 제안하십시오.

+0

이미 생성 된'TetrisWorld'를 필요로하는 클래스에 전달합니다. –

+0

만약 당신이'TetrisWorld tetrisworld;에 대해 이야기하고 있다면 나는 벌써 그랬고 널 포인터 예외를 얻었고'fields [] []'를 정적으로 만들었고 고정 시켰습니다 –

0

가 보이는 .

x = part.x - 1;을하고, 당신의 x 변수는 따라서 코드가 tetrisworld의 배열에 액세스하려고 할 때 당신이 java.lang.NullPointerException을 얻고있는 것 같습니다 if(tetrisworld.fields[-1][part.y] != 0

+0

나는 tetroid 주위에 x = 5 중심 x = 0에 가까이 가지 않기 때문에 나는 심지어 goleft/right를 할 수 없기 때문에 나는 아직 그 코드를 추가하지 않았다. 내가 말했듯이 한 번 가야한다고 그 말을해야만합니다. –

+0

그럼, 스택 트레이스가 필요합니다. 장치 logcat을주의 깊게보고 추적을 얻으십시오. 앱이 자동으로 실패 할 수 없습니다. – Olegas

+0

Ok는 내가 발견 할 수있는 모든 것을 추가했다. 그러나 그 중 몇 가지는 의미가 없지만 어쨌든 추가되었다. @Olegas –

0

처럼 행동한다, 작은 황갈색 제로가 될 수 있습니다.

if(tetrisworld.fields[x][part.y] != 0) { 
  1. tetrisworld가 null이 될 수 있습니다 : 당신이 언급 선에서이 문제가 발생할 수있는 몇 가지 방법이 있습니다.
  2. tetrisworldfields 구성원은 null 일 수 있습니다.
  3. tetrisworld.fields[x]을 사용하여 찾고있는 두 번째 배열입니다.
  4. part 값은 null 일 수 있습니다.

당신이 결코 사용하거나 선언에서, tetrisworld을 초기화하지 것처럼 나에게 보이는 소스 코드를 통해 빠른 모양을 갖는

TetrisWorld tetrisworld = new TetrisWorld(); 

또는 특정 일부 다른 지점에서 은 goLeft() 전에 일어난하기 메서드가 호출됩니다. http://en.wikipedia.org/wiki/Null_Object_pattern

은 분명히 자바는 null 참조가있을 경우 먼저 확인하지 않는 경우 NPE가 발생합니다 : 내가 참조, 답을 찾을 생각

+0

'새 TetrisWorld(); '를 추가하면 나는 50 개의 오류가 생겼다. 그것은 world = TetrisWorld();를 가지고 있기 때문에 left와 right 메소드를 gamescreen 클래스로 옮겼습니다. 그러나 여전히 같은 위치에서 멈추었습니다. 그리고 버튼은 항상 지금 등록하지 않고 몇 번의 시도가 필요합니다 ... updated source @Free –

+0

또한 한번은'goLeft()'메소드의 시작 부분에서'field [] []'의 모든 값을 0으로 설정하는 코드를 추가하여 null이 아니 었습니다. 그리고 나는 값에 대해 0을 넣으려고했다 :'if (tetrisworld.fields [0] [0]! = 0) {'그리고 여전히 똑같은 것을한다. –

+0

X와 Y 값들에 0을 가하면 여전히 동일하게된다. 오류라면'tetrisworld'와'tetrisworld.fields'가 null이 아님을 확인하는 것이 좋습니다. if 문을 'if (tetrisworld! = null && tetrisworld.fields! = null && tetrisworld.fields [x] [part.y]! = 0)'로 변경하면 동작이 전혀 변경되지 않습니까? –