wird das so hinhauen?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hallo,
ich habe jetzt 2 gescheiterte versuche hinter mir, ein tetris spiel zu programmieren.
es scheitert hautpsächlich immer daran, dass ich es nicht hinbekomme den spielverlauf richtig zu zeichnen.

ich habe mir diesmal mehr mühe bei der planung gegeben. da ich noch anfänger bin, und das coden selbst noch viel zeit braucht, möchte ich euch erstmal fragen, ob das so machbar wäre, bevor ich in die tasten hau.
denn nach 20 stunden wieder gegen ne wand zu rennen, zum dritten mal, will ich ungern.

Ich gebe euch hier mal Grundzüge von vier Klassen. Ich bitte euch, vorallem auf die Implementierung der ganzen
draw-methoden, bzw. paintComponent-Methode zu achten!
Ich wäre wirklich sehr dankbar, wenn ihr euch das anseht, auch wenn es ein paar Minuten dauert.

Aber eins hab ich inzwischen schon gelernt: Mit nix anfangen wenn man nicht weiss dass es später hinhaut :meld:

Code:
public class Block extends Rectangle{
	
	private boolean falls;
	private Color color;
	
	/* getter */
	public int getLine(){return (int)getY();}
	public Color getColor(){return color;}
	public boolean falls(){return falls;}
	
	/* abilities */
	public void draw(Graphics g){
		g.fillRect(x,y,width,height); // public attribute von Rectangle
	}
	
	/* constructor */
	public Block(int x, int y, Color color){
		super(x,y,Data.BLOCKSIZE,Data.BLOCKSIZE);
		this.color = color;
		falls = true;
	}
}


Code:
public class Quad{
	
	private Block ul, ur, ll, lr; // upper left, upper right, analog lower
	private boolean falls;
	private boolean dumped;
	
	/* getter */
	public Block[] getBlocks(){
		return {ul, ur, ll, lr};
	}
	
	/* abilities */
	public void move(int dir){
		switch(dir){
			case Data.LEFT: // x+y werte der blöcke anpassen...
		}
	}
	
	/* constructor */
	public Quad(){
		ul = new Block(200,0,Data.BLUE);
		ur = new Block((int)ul.getX()+Data.BLOCKSIZE,0,Data.BLUE);
		ll = new Block((int)ul.getX(),Data.BLOCKSIZE,Data.BLUE);
		lr = new Block((int)ul.getX()+Data.BLOCKSIZE, Data.BLOCKSIZE, Data.BLUE);
		falls = true;
		dumped = false;
	}
}

Code:
public class Collection(){
	
	private ArrayList<Block> collection;
	
	/* abilities */
	public void add(Block[] elements){
		for (int i = 0; i<elements.lenght; i++){
			collection.add(elements[i]);
		}
	}
	
	public void clearLine(int y){
		// alle blöcke in der ArrayList mit diesem y-wert
		// aus der collection löschen.
	}
	
	public void draw(Graphics g){
		for(int i = 0; i<collection.size(); i++){
			collection.get().draw(g);
		}
	}
	
	/* constructor */
	public Collection(){
		collection = new ArrayList<Block>(Data.MAXBLOCKS);
	}
}

Code:
public GameView extends JFrame{
	
	// hat nicht nur ein Panel, sondern auch noch buttons, labels etc.
	// die hier aber unwichtig sind.
	private GamePanel gamepanel;
	
	public GameView(Collection c){
		// die üblichen sachen: setSize, closeoperation
		
		gamepanel = new GamePanel(c);
		setVisible(true);
	}
}

class GamePanel extends JPanel{
	
	private Collection collection;
	
	// hat noch KeyListener usw.
	
	@Override
	protected void paintComponent(Graphics g){
		super.paintComponent(g);
		collection.draw();
	}
	
	GamePanel(Collection c){
		collection = c;
	}
}

Erklärung zu den Klassen: Im Tetris gibt es ja verschiedene Elemente, die jeweils aus 4 Blöcken bestehen.
"Quad" ist hier z.B. ein Würfel aus 4 Blöcken.
Ich will für jedes Element im Tetris (sind glaub ich 6 verschiedene) so eine Klasse machen, die eben ein Array von Blöcken hat.
So etwas ist nötig für die Bewegung und Rotation, die der Spieler dann mit so nem Element macht. Ich kann also nicht einfach nur Blöcke haben, denke ich zumindest?!
Mein Container enthält alle Blöcke, die es im Spiel gibt. Er wächst also im Spielverlauf (und schrumpft auch, wenn man eine Linie voll hat uns sie verschwindet).
Das Panel kennt diesen Container, und kann ihm sagen, dass er alle Elemente im Spiel zeichnen soll.

Okay, und so z.B. würde ich das dann in der main-methode machen:

Code:
	public static void main(String[] args){
		
		Collection c = new Collection();
		GameView v = new GameView(c);
		
		/* das is jetzt so halb pseudo-code */
		while( !gameover){
			Quad q = new Quad()
			c.add(q.getBlocks());
			while (momentanes element noch nicht fertig) {
				q.move(LEFT);
				} // nur auf steuerung reagieren

		}
			
	}

Denkt ihr, dass das die richtige Herangehensweise ist? Werde ich das so durchziehen können?
Die Hauptfrage ist:
Bekommt jetzt die Collection überhaupt mit, wenn man den Quad bewegt? Also ich komm da noch etwas
durcheinander, ob er jetzt wirklich auf diesem Element arbeitet, oder auf ner Kopie oder so.

Dann hab ich noch ne konkrete Frage: So, wie das im Moment implementiert ist, komme ich nicht an die Farbe eines Blocks heran! Aber ich muss die Zeichenfarbe meines Panels dieser Farbe anpassen, bevor ich male, da jeder Block ne andre Farbe haben kann.

Und ich will eigentlich, dass mein Panel lediglich die Collection kennt, und diese selbständig malt, wegen Kapselung und Polymorphismus und was es da noch für tolle Lehrbuch-Begriffe gibt :ü
Wie würdet ihr das lösen?

Bin sehr dankbar über eure Antworten!
 
S

SlaterB

Gast
klingt ziemlich zu hoch für dich, aber versuchen hilft auch weiter,

dagegen gilt nicht unbedingt
> Aber eins hab ich inzwischen schon gelernt: Mit nix anfangen wenn man nicht weiss dass es später hinhaut

--------

> Werde ich das so durchziehen können?

kann man so noch nicht sagen, die paar Blöcke sind nur ein Teil des Spiels und selbst das nur in Anfängen

collection.draw();

ist z.B. Quatsch für eine Collection


Tipp zum Zeichnen: es bringt nix, die Blöcke genau zu positionieren oder gar mehrfach zu erzeugen,
ein Block und mehrere höhere Klassen sind gut,

die Liste der Steine ist da aber was anderes, eine Menge von Objekten einer Logikklasse mit Steintyp, Position, Drehung usw.

beim Zeichnen wird dann die aktuelle Position an die draw-Operation überreicht, die diese einrechnet

----------

fange auf jeden Fall einfach an, arbeite schrittweise,
was nützen dir höhere Figuren, wenn du normale Blöcke noch nicht auf den Bildschirm siehst,
die 4-Block-Figuren zu modellieren ist nicht falsch, aber erstmal brotlose Kunst,

wenn es an die tatsächliche GUI mit Spielablauf und Bewegung geht,
dann fange lieber erstmal mit den einzelnen Blöcken an,
zu Beginn auch nur einen statt gleich eine Collection,
nach und nach dann Stapelung, unterschiedliche Farben usw.

aber darüber musst du dir jetzt noch keinen Kopf zerbrechen

------

wenn nicht die Grafik den ganzen Spielablauf/ das Verständnis so gut unterstützen würde,
könnte man fast vorschlagen, das ganze erstmal nur als Konsolenanwendung zu bauen, nur mit System.out.println:

Runde 1:
neuer Stein in Reihe 9, Typ: ..
Runde 2:
Stein 1 von Reihe 9 nach 8
...
 
G

Guest

Gast
okay danke!

also ich hab jetzt ein wenig gemacht, und kann ohne weiteres die verschiedenen tetris-steine nach links und rechts bewegen, sowie auch drehen (natürlich bewegen sie sich auch automatisch nach unten).

ich kann auch überprüfen, ob ein element mit einem anderen kollidiert und das element dann absetzen und ein neues erstellen lassen. also soweit cool.

aaaber.. im moment steck ich fest, da diese kollisionsabfrage sich als nicht optimal rausgestellt hat..
das problem ist, dass ich einen block zurückschiebe, falls er nach einer bewegung kollidiert hat. (weil sonst ja
ein block in einem anderen steckt). leider kann ich kaum reproduzieren wie der letzte move aussah...

sprich ob z.B. das ding gedreht wurde, bevor es mit einem anderen objekt zusammengestossen ist..

also da muss ich mich mal hinsetzen und mir was intelligenteres überlegen, ist inzwischen auch schon wieder recht verkorkst geworden alles :/

was ich aber komisch finde (und das habe ich schon öfter woanders erwähnt) und was bei meinem snake-spiel ja auch schon so war, obwohl mir keiner glauben wollte:

ich hab immer per sleep() pausen dazwischen. is klar, sonst kann man ja nich spielen.
allerdings schwanken im game diese pausen enorm, also wirklich spürbar. d.h. wohl dass es riesige rechenunterschiede gibt, obwohl das nicht sein kann.

bei mir hat diese sleep-methode noch nie richtig funktioniert irgendwie...
woran kann sowas liegen?
Ich hab übrigens gar keinen Thread... ich sag einfach in meiner mainmethode "Thread.sleep(200)" oder so..
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JavaFX Background-Bild wird in .exe nicht angezeigt AWT, Swing, JavaFX & SWT 6
B im JFrame gesetzte Hintergrundfarbe wird beim Ausführen nicht gezeigt AWT, Swing, JavaFX & SWT 2
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
G JavaFX LineChart Datenpunkte Markierung wird abgeschnitten AWT, Swing, JavaFX & SWT 1
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
G Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
S Next_Button wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 6
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
J setOnCloseRequest wird nicht ausgelöst AWT, Swing, JavaFX & SWT 3
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
B JavaFX Bei Scenen-Wechsel im primaryStage wird aktuelle Fenstergröße nicht mit übernommen AWT, Swing, JavaFX & SWT 16
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
kodela BufferStrategy wird nicht gefunden AWT, Swing, JavaFX & SWT 5
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
S ImageView wird dem Gridpane nicht zugefügt AWT, Swing, JavaFX & SWT 1
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Bluedaishi TableView mit Combox wert wird nicht in die TableView gesetzt AWT, Swing, JavaFX & SWT 38
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
G JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
kodela Swing Letzte Änderung in der Tabelle wird nicht gespeichert AWT, Swing, JavaFX & SWT 5
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
S JavaFX Wird es überhaupt genutzt? AWT, Swing, JavaFX & SWT 3
FRI3ND GUI wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Wert in JTextField wird falsch ausgegeben AWT, Swing, JavaFX & SWT 2
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Aus welchen Grund wird der Button nicht angezeigt im GridPane? AWT, Swing, JavaFX & SWT 1
J MouseListener wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 4
E Swing Liste in Scrollpane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Controller wird zu groß, was tun ? AWT, Swing, JavaFX & SWT 5
CptK Wieso wird nur ein Teil meiner Buttons angezeigt? AWT, Swing, JavaFX & SWT 1
T Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Aktion ausführen wenn ein JRadiobutton deselektiert wird. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
zhermann TableView wird nicht gefüllt AWT, Swing, JavaFX & SWT 14
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
zhermann JavaFX Main App wird nicht geöffnet AWT, Swing, JavaFX & SWT 6
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
A Swing Tabelle wird bei Betätigung des Button nicht befüllt AWT, Swing, JavaFX & SWT 17
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9
M Swing Inhalt meines JTables wird falsch dargestellt AWT, Swing, JavaFX & SWT 8
T Default Table wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
K JavaFX Stage wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
X JavaFX AreaChart area höhe wird nicht richtig dargestellt AWT, Swing, JavaFX & SWT 2
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
S Swing Konstruktor wird nicht rechtzeitig fertig? AWT, Swing, JavaFX & SWT 4
D JavaFX Erkennen wenn eine Anwendung geschlossen wird und etwas tun? AWT, Swing, JavaFX & SWT 4
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
C Liste - ListView wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
N JavaFX TextArea Updaten bevor Prozess gestartet wird AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben