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:
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:
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!
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!