わかりましたので、たくさんのクラスがあり、オブジェクト形状を持つオブジェクトを回転させたいと思います。これは 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() は静的コンテキストから参照できません