Repaint, update, paint | Kleines Spiel

L

lite2

Hallo zusammen,
ich bin gerade dabei Java zu lernen.
Aktuell versuche ich ein kleines Spiel zu erstellen.
Auf meinem Frame wird zufällig ein Kreis erstellt, der sich langsam schließt.
Bevor er weg ist soll man mit der Maus rein fahren.
Mein Problem ist aktuell, dass mein Frame sich nicht neu zeichnet.
Wenn ich das Fenster von Hand kurz vergrößere oder verkleinere sieht man wie der Kreis schrumpft.
Ich weiß, dass einiges ziemlich "gefuscht" ist, bitte erklärt mir wie man es "richtig" macht.
Hier nun mein Programmcode:


Datei spiel.java
Code:
import java.lang.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;


public class spiel extends Frame {
  
  public static int x,y,i;
  public static int cordX = 1;
  public static int cordY = 1;
  public rechnung calc = new rechnung();



  spiel(){

    calc.start();


    super.setBounds(300,300,700,400);
    super.setVisible(true);
    super.setTitle("Spiel");
    
    this.addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e){
        System.exit(0);
      }
      });
    
    this.addMouseMotionListener(new MouseAdapter(){
      public void mouseMoved(MouseEvent k){
        cordX = k.getX();
        cordY = k.getY();
        System.out.println(cordX+" : "+cordY);
      }
     });
    
    }

    public void paint(Graphics g) {
    g.setColor(Color.red);
    g.drawOval(spiel.x, spiel.y, spiel.i, spiel.i);
    }
    
    public void update(Graphics g){
    g.clearRect(spiel.x, spiel.y, spiel.i+10, spiel.i+10);
    }
    


  public static void main(String[] args) {

     new spiel();



  }
}

und

Datei: rechnung.java

Code:
import java.lang.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;


public class rechnung extends Thread  {


    public void run() {
    
     spiel.x = (int)((Math.random()) *600 + 1);
     spiel.y = (int)((Math.random()) *300 + 1);
     
     for(spiel.i = 100;spiel.i> 0;spiel.i--){
      System.out.println(spiel.i);
      try{
      spiel.repaint();
      this.sleep(100);
      }catch(Exception e){}

     }


    }
    

}


Vielen Dank für jede Hilfe :)
 
Nachdem du die update Methode überschrieben hast, solltest du in ihr auf jeden Fall aber nochmal die paint() methode aufrufen:

Java:
public void update(Graphics g){
    g.clearRect(spiel.x, spiel.y, spiel.i+10, spiel.i+10);
    paint(g);
}
 
Oke, danke schonmal.
Funktioniert leider trotzdem noch nicht so richtig :(
Noch andere Verbesserungen/Vorschläge? :)

Edit1

Ich glaube das Problem liegt in der "rechnung.java".
Ich denke ich rufe die update bzw die repaint Methode falsch auf.


Code:
import java.lang.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;


public class rechnung extends Thread  {
  
    spiel sp;



    public void run() {

    
     sp.x = (int)((Math.random()) *600 + 1);
     sp.y = (int)((Math.random()) *300 + 1);
     
     for(sp.i = 100;sp.i> 0;sp.i--){
      System.out.println(sp.i);
      try{

        sp.update();
        this.sleep(100);
        //sp.repaint();
        
      }catch(Exception e){}

     }


    }
    

}


Code:
       sp.update();
        this.sleep(100);
        //sp.repaint();

sp.update(Graphics g); sp.update möchte als Parameter Graphics g übergeben. Wie stelle ich es an, dass sie Methode in "spiel.java" richtig aufgerufen wird?
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

was mir als erstes aufgefallen ist: Klassennamen schreibt man groß.

Zu deinem Problem: wieso rufst du statt update nicht einfach repaint auf, dann musst du dir um Graphics keine Gedanken machen?
Dann müsstest du in der paint-Methode nur noch am Anfang ein super.paint(g) hinschreiben und könntest alles mit update weglassen.

Gruß,
Martin
 

Neue Beiträge

Zurück