0

Android用のゲームプログラミングを学ぶのに役立つAndroid用のテトリスゲームを作ろうとしています。私の goLeft/Rights は、ボタンが押されると右に壊れます。左に移動するためのコードは、フィールド int 配列とリスト パーツ配列とは別のクラスにあります。fields 配列は、参照変数 (TetrisWorld tetrisworld;) によってアクセスされます。パーツ リスト配列は公開されているため、goLeft() コードにある変数 (パーツ) コードを介してアクセスします。if(tetrisworld.fields[x][part.y] != 0) 左のコード:

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--;
        }
    }
}

fields int 配列のコード:

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

WORLD_WIDTH と WORLD_HEIGHT はどちらも静的な最終整数で、幅は 9、高さは 19 です。

if(tetrisworld.fields[0][0] == 0) を入れてみましたが、それでもクラッシュするので、変数とは関係ないと思います。また、それを確認するコードをまだ追加していなくても、範囲外にはなりません。これは、x = 5 の周りにテロイドが発生しているためです。ハプニング

goLeft/Right メソッドを「world = TetrisWorld();」を持つ gamescreen クラスに移動しようとしました。そして、それはまだ同じ場所でバグアウトします

アップデート:

追加するだけでOK:

tetrisworld != null

最初のifステートメントで修正されましたが、私の質問は、なぜ修正されたのですか? このチェックがないと動けないのはなぜですか?私の知る限り、それは明らかにゼロの原因ではありません。今では完全にレスポンシブです。

しかし、これを解決するためのより簡単な方法は、SOOOO簡単fieldsに静的に変更することです...そして、それにアクセスするように:TetrisWorld.fieldsだから私の更新されたコードは次のとおりです:

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--;
        }
     }
  }
4

3 に答える 3

0

わかりました。http: //en.wikipedia.org/wiki/Null_Object_patternを参照して、答えを見つけたと思います。

どうやら、null参照がある場合、最初にNPEをチェックしないと、JavaはNPEをスローしますか?それはすでに別のクラスで作成されているので、何もせずに初期化する方法はありますか?TetrisWorld tetrisworld = new TetrisWorld();それで私は千のエラー、実際のスタックオーバーフローを受け取ります!lul ...それでも100%ポジティブではありません。コメントして確認し、おそらくこれについてより良い方法を提案してください。

于 2012-01-29T01:44:49.257 に答える
0

IndexOutOfBoundsException にヒットしているようです。

あなたがやっているときx = part.x - 1;、あなたのx変数はタンゼロよりも小さくなる可能性があるため、コードは次のように動作しますif(tetrisworld.fields[-1][part.y] != 0

于 2012-01-22T08:49:38.490 に答える
0

java.lang.NullPointerExceptionで配列にアクセスしようとすると、 が発生しているようですtetrisworld。あなたが言及した行には、これが発生する可能性のあるいくつかの方法があります。

if(tetrisworld.fields[x][part.y] != 0) {
  1. tetrisworldnull の可能性があります。
  2. fieldsメンバーはtetrisworldnull の可能性があります。
  3. を使用して検索している 2 番目の配列tetrisworld.fields[x]
  4. の値はpartnull の可能性があります。

tetrisworldソースコードをざっと見てみると、次を使用した宣言でも、初期化しないように見えます。

TetrisWorld tetrisworld = new TetrisWorld();

goLeft()または、メソッドが呼び出される前に発生したことが確実な他の時点で。

于 2012-01-23T09:21:18.817 に答える