Rotation von Formen in Tetris

Hallo zusammen,
Ich möchte Tetris Programmieren und habe auch schon einiges dahingehend getan, allerdings bin ich jetzt an dem Punkt angelangt, an dem ich die Rotation von den fallenen Formen programmieren möchte. Meine Objekte bestehen immer aus vier einzelnen Block Objekten.
Zusätzlich habe ich die Klasse BlockHandler, in der alles rund um die Steuerung von den Formen gemacht wird.
Block[][] ist ein Array, das als Koordinatensystem dient um meine Objekte zu ordnen.
Hier ein beispiel eines Quadrats, aus vier kleinen Block Objekten:
Java:
package Blocks;

public class Square extends Forms{
   
    private BlockHandler blockH;
   
    private Block first;
    private Block second;
    private Block third;
    private Block fourth;
   
    public Square(BlockHandler pBlockH) {
        super();
       
        blockH = pBlockH;
       
        first = blockH.addBlock(4,15);
        second = blockH.addBlock(4,14);
        third = blockH.addBlock(5,15);
        fourth = blockH.addBlock(5,14);
       
    }
   
    public void rotate() {
       
    //in diesem Falle nicht nötig, habe aber als Beispiel ein weitgehend fertiges Objekt genommen  
    }

    @Override
    public void move() {
       
        if(blockH.block[second.getX()][second.getY()-1] == null && blockH.block[fourth.getX()][fourth.getY()] == null) {
           
            blockH.moveDown(first.getX(),first.getY());
            blockH.moveDown(second.getX(),second.getY());
            blockH.moveDown(third.getX(),third.getY());
            blockH.moveDown(fourth.getX(),fourth.getY());
        }
        else {
            blockH.newForm();
        }
    }
}

Mein Problem ist die Rotation. Meine einzige Idee ist es für jedes Objekt, für jede Drehungsstufe, alles einzeln zu testen. Das währe allerdings sehr viel aufwand.
Hier ein Beispiel wie das gemeint ist:

Code:
if(rotation == 0) {
           
            if(first.getX() != 15 && blockH.block[first.getX()][first.getY()+1] == null && blockH.block[second.getX()][second.getY()+1] == null) {
                if(blockH.block[second.getX()][third.getY()-1] == null) {
                    blockH.moveBlock(first.getX(),first.getY(),second.getX() +1,first.getY()+1);
                    blockH.moveBlock(third.getX(),third.getY(),second.getX() +1,third.getY()-1);
                    blockH.moveBlock(fourth.getX(),fourth.getY(),first.getX() +1,first.getY()+1);
                   
                    rotation = 1;
                }
            }
        }

Das bräuchte ich dann noch vier mal für jede der sieben Formen. Deshalb wollte ich fragen, ob das irgendwie einfacher geht.

Danke schonmal für die Hilfe.
 
B

BestGoalkeeper

Gast
Vielleicht hilft dir das schon weiter (ich weiß es sieht fürchterlich kompliziert aus, möglichweise ist es das auch...)
Java:
import java.util.Arrays;

public class TestProgram {
	public static void main(String[] args) {
		Block l = new Block(BlockType.L);
		for (int i = 0; i < 5; i++) {
			int[][] game = new int[5][5];
			l.insertIn(game, 1, 1);
			l.rotate();
			for (int[] is : game) {
				System.out.println(Arrays.toString(is));
			}
			System.out.println();
		}
	}
}

enum BlockType {
	SQUARE(new int[][] { { 1, 1 }, { 1, 1 } } ), 
	L(new int[][] { { 1, 0, 0 }, { 1, 0, 0 }, { 1, 1, 0 } } ),
	S(new int[][] { { 1, 0, 0 }, { 1, 1, 1 }, { 0, 0, 1 } } ),
	LINE(new int[][] { { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } } );

	int[][] figure;

	BlockType(int[][] figure) {
		this.figure = figure;
	}
}

class Block {
	BlockType t;
	int orientation = 0;

	Block(BlockType t) {
		this.t = t;
	}

	void insertIn(int[][] game, int x, int y) {
		int w = t.figure.length;
		double w2 = (w - 1) / 2.0;
		int cosa = (int) Math.cos(Math.toRadians(90 * orientation));
		int sina = (int) Math.sin(Math.toRadians(90 * orientation));
		for (int x1 = 0; x1 < w; x1++) {
			for (int y1 = 0; y1 < w; y1++) {
				double x2 = x1 - w2;
				double y2 = y1 - w2;
				int x3 = (int) (cosa * x2 - sina * y2 + w2);
				int y3 = (int) (sina * x2 + cosa * y2 + w2);
				game[y + y1][x + x1] = t.figure[y3][x3];
			}
		}
	}

	void rotate() {
		orientation = (orientation + 1) % 4;
	}
}
 

M.L.

Top Contributor
Weiterhin könnte man eine 3D-Bibliothek verwenden, die einem bestimmte Dinge (z.B. farbige Kuben/Würfel und Drehungen) erleichtert, z.B. JOGL
 

mihe7

Top Contributor
Irgendwie kapiere ich nicht, wozu man hier trigonometrische Funktionen bzw. eine Lib bräuchte. Eine 90° Rotation besteht doch einfach darin, die Spalten des 2D-Arrays des betreffenden Teils zeilenweise auszugeben, oder?
 
B

BestGoalkeeper

Gast
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Array Rotation Java Basics - Anfänger-Themen 4
CptK Methoden Koordinaten relativ zur Rotation eines Bildes bestimmen Java Basics - Anfänger-Themen 8
A Koordinaten transformieren (Rotation) Java Basics - Anfänger-Themen 4
M Bewegung + Rotation eines Objektes Java Basics - Anfänger-Themen 2
L Java3d und Rotation Java Basics - Anfänger-Themen 6
J 2D Rotation eines Vierecks Java Basics - Anfänger-Themen 2
B Berechnung zu einer Schleife formen Java Basics - Anfänger-Themen 6
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
J Formen plötzlich nicht mehr aufrufbar! Java Basics - Anfänger-Themen 8
D aus 2 arrays ein zweidimensionales formen Java Basics - Anfänger-Themen 9
I Formen symmetrisch vs. chaotisch ;-) Java Basics - Anfänger-Themen 10
B Geometrische Formen optional darstellen Java Basics - Anfänger-Themen 3
J "Tetris" - Problem bei der Grafik Java Basics - Anfänger-Themen 5
H Tetris anfang Java Basics - Anfänger-Themen 6
L Tetris-Segment "malen" Java Basics - Anfänger-Themen 7
K Tetris Spielschleife Java Basics - Anfänger-Themen 3
J Tetris-Stein wird nicht gezeichnet! Java Basics - Anfänger-Themen 9
J Tetris - Spielfeldgröße Java Basics - Anfänger-Themen 9
J Tetris - Problem Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben