Hi,
Ich bin dabei mir ein Tetris zu schreiben (bzw. schon ziemlich fertig damit).
Ich habe 1 Thread der das Spiel laufen lässt (Steine fallen runter) und einen Keylistener für links/rechts/drehen.
Beide greifen auf die Methode move() zu, die dann mein Spiel bewegt etc.
in move() wird nachdem die Sachen bewegt wurden repaint() aufgerufen.
Mein printer zeichnet einfach stur das Feld vom Spiel.
Das Problem: repaint() ruft paint() nicht immer sofort auf, und so passiert es dass wenn ich die links/rechts pfeile gedrückt halte die figuren mal komplett über den Bildschirm fliegen ohne einen Zwischenschritt anzuzeigen.
Ich hoffe ihr könnt mir folgen, hier die Funktionen dazu:
Keylistener:
run und move:
paint:
Im Anhang mal alles kompiliert und den sourcecode damit ihr das Problem sehen könnt.
Ich bin dabei mir ein Tetris zu schreiben (bzw. schon ziemlich fertig damit).
Ich habe 1 Thread der das Spiel laufen lässt (Steine fallen runter) und einen Keylistener für links/rechts/drehen.
Beide greifen auf die Methode move() zu, die dann mein Spiel bewegt etc.
in move() wird nachdem die Sachen bewegt wurden repaint() aufgerufen.
Mein printer zeichnet einfach stur das Feld vom Spiel.
Das Problem: repaint() ruft paint() nicht immer sofort auf, und so passiert es dass wenn ich die links/rechts pfeile gedrückt halte die figuren mal komplett über den Bildschirm fliegen ohne einen Zwischenschritt anzuzeigen.
Ich hoffe ihr könnt mir folgen, hier die Funktionen dazu:
Keylistener:
Java:
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
//if(pressed)return;
if(e.getKeyCode()==KeyEvent.VK_UP){
this.main.move("drehen");
}
if(e.getKeyCode()==KeyEvent.VK_DOWN){
this.main.move("fallen");
}
if(e.getKeyCode()==KeyEvent.VK_LEFT){
this.main.move("links");
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT){
this.main.move("rechts");
}
pressed = true;
}
Java:
public void run() {
this.repaint();
block.enterStein();
nextStein=new Stein(1+(int)(Math.random()*7));
while(!ende){
this.move("fallen");
//System.out.println(level);
if(reihen>10){
reihen=0;
level++;
}
try{
Thread.sleep(500-(level*25)); //verzögerung bis zum nächsten fallen
}
catch(InterruptedException e){}
}
}
public void move(String richtung){
if(richtung=="fallen"){
if(!this.block.fallen()){// Stein ist unten angekommen
if(!this.block.enterStein(nextStein))ende=true;//Neuer Stein kann nicht gesetzt werden -> ende
for(int i=0;i<this.block.getSpielfeld().length;i++){
if(this.block.zeileVoll(i)){
reihen++; //volle Zeile löschen
this.block.clearZeile(i);
}
}
nextStein=new Stein(1+(int)(Math.random()*7));
//System.out.println(nextStein);
}
}
else this.block.move(richtung); // links, rechts, drehen
this.repaint();
}
Java:
public void paintComponent(Graphics g){
//super.paint(g);
//long anfang=System.currentTimeMillis();
//System.out.println("Zeit seit dem letzten paint: " + (lastFall-lastRepaint));
for(int i=0;i<this.block.getPrint().length;i++){
for(int j=0;j<this.block.getPrint()[0].length;j++){
if(block.getPrint()[i][j])g.setColor(farbe);
else g.setColor(Color.WHITE);
g.fillRect(j*groesse,i*groesse,24, 24);
}
}
}
Im Anhang mal alles kompiliert und den sourcecode damit ihr das Problem sehen könnt.