-1

わかりましたので、たくさんのクラスがあり、オブジェクト形状を持つオブジェクトを回転させたいと思います。これは 2 次元配列であり、オブジェクト クラスの親クラスで構築されます。形状を変更して回転を行うメソッドmultiplyarrayを呼び出すメソッドrotate()で属性(形状)を変更したい。しかし、形状にアクセスできない、または少なくとも形状を変更する方法がわからないことに気付きました。親クラスに public setShape メソッドがあるとは思いません。とにかくここにコードがあります:

public static int[][] multiplyMatrix(int[][] m1) {

    int[][] m2 = { { 0, 0, 0, 1 }, { 0, 0, 1, 0 }, { 0, 1, 0, 0 },
            { 1, 0, 0, 0 }, };

    int[][] result = new int[4][4];

    // multiply
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++)
            for (int k = 0; k < 4; k++)
                if (m1[i][k] * m2[k][j] > 0) {
                    result[i][j] = 1;
                } else {
                    result[i][j] = 0;
                }

    return result;
}

回転方法:

synchronized void rotateClockwise() {
    currentPiece.shape = multiplyMatrix(shape);

    //gives me an error
    updateLocation();
}

コンストラクター (3 つのメソッドはすべて同じクラスにあります):

    public Piece(int shape[][]) {
    super(shape);
    currentX = 7;
    currentY = 2;
    updateLocation();
}

このメソッドは別のクラスにあり、属性を変更するインスタンス オブジェクトが含まれています。

public void keyPressed(KeyEvent event) {
    int key = event.getKeyCode();
    switch (key) {
    case KeyEvent.VK_UP: // up arrow
    case KeyEvent.VK_KP_UP:
        currentPiece.rotateCounterclockwise();
        break;
    case KeyEvent.VK_DOWN: // down arrow
    case KeyEvent.VK_KP_DOWN:
        currentPiece.rotateClockwise();
        break;
    case KeyEvent.VK_LEFT: // left arrow
    case KeyEvent.VK_KP_LEFT:
        currentPiece.moveLeft();
        break;
    case KeyEvent.VK_RIGHT: // right arrow
    case KeyEvent.VK_KP_RIGHT:
        currentPiece.moveRight();
        break;
    case KeyEvent.VK_SPACE: //  space bar
        currentPiece.drop();
    }
}

createPiece メソッド (shape 属性にアクセスしたい):

public static Piece createPiece() {
    int[][] s = SHAPES[(int) (Math.random() * SHAPES.length)];
    switch ((int) (Math.random() * 10)) {
    case 0:
    case 1:
    case 2:
    case 3:
    default:
        return new Piece(s);
    }
}

コード全体は次の場所にあります (特定の変更はありません)。

http://mathcs.slu.edu/~fritts/cse131/labs/lab9/index.html

アップデート:

super が Grid でこのコンストラクターを呼び出すことがわかりました。

public Grid(int[][] contents) {
    this.contents = contents;
    Dimension d = new Dimension(getColumns()*Tetris.SQUARE_SIZE,
                                getRows()*Tetris.SQUARE_SIZE);
    setSize(d);
    setPreferredSize(d);
    setOpaque(false);
}

今、私はこれを試しました:

synchronized void rotateClockwise() {
Grid.contents = multiplyMatrix(Grid.contents);
updateLocation();

}

それは私に与えます:

非静的メソッド getContents() は静的コンテキストから参照できません

4

1 に答える 1

1

スーパークラスのコードは示していませんがshape、サブクラスでフィールドのミラーを作成し、getter をオーバーライドして setter を追加するという方法が 1 つ考えられます。例えば

  public class Super {
      private Shape shape;
      public Super(Shape shape) { this.shape = shape; }
      public Shape getShape() { return this.shape; }
  }

  public class Sub extends Super {
      private Shape myShape;

      public Sub(Shape shape) {
          super(shape);
          this.myShape = shape;
      }

      @Override
      public Shape getShape() { return this.myShape; }

      public void setShape(Shape shape) { this.myShape = shape; }
  }

このアプローチはSuper、これを許可するように設計されている場合にのみ機能します。特に、値をフェッチするためにSuper使用する必要があります。getShape()Shape

(ここで拡張機能をサポートするように設計されていない場合、恐ろしい回避策がありSuperますが、先生はあなたがここでそれらを使用することを期待していないと確信しています....)

于 2013-02-14T22:51:21.983 に答える