Rechteck zeichnen auf JPanel?

jannik

Grünschnabel
Hey Leute,

ich hab bereits auf einem anderen Board nachgefragt, allerdings gibt es hier hoffentlich ein paar mehr Java-Benutzer.

Ich habe ein großes JPanel für eine Art Spiel, das soll das Spielfeld darstellen bzw die "Map".
Darauf lass ich 4 verschiedene Spielfiguren als weitere kleine JPanels sich bewegen mittels der Pfeiltasten. Dies klappt auch wunderbar. Nur habe ich jetzt das Problem, dass ich eine Art Schleimspur hinter den Spielern machen möchte, die entsteht, wenn man über die Map mit dem Spieler "läuft. (So in der Art wie Snake)...
Aber bei mir bleibt das JPanel einfach schwarz :(

Hier ist der Code fürs zeichnen, also erstmal ein Beispiel
Code:
solved

Ich habe den Code nicht in einer Paint/Paint Component Funktion drin, ich müsste es außerhalb machen, erscheint mir irgendwie leichter zu realisieren.

Hier ist mein komplettes Projekt: (Der SinglePlayer()-Teil sollte wichtig sein ;)
Code:
solved

Wäre echt nett, wenn ihr mir weiterhelfen könntet, ich habe jetzt ziemlich viel Zeit verbraucht, um den Fehler zu finden, ohne Glück :(.

Vielen Dank im Vorraus!
Jannik
 
Zuletzt bearbeitet:
du denkst nur dass das panel schwarz bleibt aber in wirklichkeit wird dein rechteck einfach wieder übermalt...

Java:
while (true) {
    Graphics gr = meinJPanel.getGraphics();
    gr.setColor(Color.black);
    gr.fillRect(0,0,100,100);
}

so würde es gehen aber das is wohl nicht in deinem sinn...
deshalb empfehl ich dir die paintComponent zu benutzen auch wenns etwas mehr code ist...
 
Zuletzt bearbeitet:
Okay, danke für die Antwort.

Könntest du mir da etwas auf die Sprünge helfen? Wie baue ich PainComponent() ein und kann nach und nach das Panel bemalen. Die Rechteckigen schleimspuren sollen ja nicht alle am anfang gleich dfa sein sondern nach und nach entstehen, je nachdem, wie man mit der Spielfigur auf dem Panel rumfährt ;)

Wäre echt super, wenn das irgendjemand mir erklären könnte ;)
 
das könntest du z.b so machen:

Java:
 class Schleimspur extends JPanel {

      int x,y,width,height;
      boolean drawSchleimspur;

      public Schleimspur () {
          drawSchleimspur=false;
          x=0;
          y=0;
          width=0;
          height=0;
      }

      @Override
      public void paintComponent (Graphics g) {
         super.paintComponent(g);
         if (drawSchleimspur) {
            g.setColor(Color.black);
            g.fillRect(x,y,width,height);
         }
      }

      public void drawSchleimspur (int x, int y, int width, int height) {
        this.x=x;
        this.y=y;
        this.width=width;
        this.height=height;
        drawSchleimspur=true;
        repaint();
      }

      public void delSchleimspur () {
        drawSchleimspur=false;
        repaint();
      }
  }
 
Zuletzt bearbeitet:
danke, dass ist schonmal ein Anfang. :)

Das Problem ist halt nun, dass ich nicht nur ein Rechteck brauche, sondern möglicherweise unendliche viele, außerdem werden andere Spieler eine Dreiecke sogar überfahren, das müsste ja eigentlich kein Problem sein. Ich erklärs mal mit einem Bild:

Code:
http://img402.imageshack.us/img402/8418/bgry.png

Ich hab grad nix von erlaubten ImageHostern in den Rules gefunden, wenn ich was falsch mache, bitte mitteilen :)
 
dann musst du dir die position von jedem rechteck merken bzw wer wann wo was überfahren hat... scheint mir ziemlich aufwändig zu sein... wie hast du denn das "spielfeld" aufgebaut?

[EDIT]
eine möglichkeit ist für jeden spieler einen vector anzulegen wo du immer die rechtecke einfügst, und dann einfach alle rechtecke zeichnen, die in den vektoren vorhanden sind. dazu brauchst du noch nen boolean, ob das rechteck gezeichnet werden soll oder nicht (also falls die spur von jemand anders überfahren wurde) oder du löscht das entsprechende rechteck dann aus dem vector
[/EDIT]
 
Zuletzt bearbeitet:
klar :-)

Java:
class SchleimspurPart {

     int x,y,width,height;

     public SchleimspurPart (int x,int y,int width,int height) {
        this.x=x;
        this.y=y;
        this.width=width;
        this.height=height;
     }
 }

die klasse verwendest du dann so:

Java:
Vector<SchleimspurPart> red=new Vector<SchleimspurPart>();

das machst du für jeden spieler

und dann nur noch in der paintComponent zeichnen:

Java:
public void paintComponent (Graphics g) {
      super.paintComponent(g);
      g.setColor(Color.red);
      for (int i=0;i<red.size();i++) {
          SchleimspurPart sp=red.get(i);
          g.fillRect(sp.x,sp.y,sp.width,sp.height);
      }
  }

natürlich eine for-schleife für jeden vector und davor die farbe ändern

rechtecke fügst du so hinzu:

Java:
red.add(new SchleimspurPart(0,0,50,50));

dann noch n repaint() nach jedem add dann passt des

und wenn eine spur überfahren wird dann musst du im vector nach dem entsprechenden rechteck suchen und es aus dem vector löschen
 
Zuletzt bearbeitet:
Dankeschön :) Ich werde es morgen ausprobieren :) Wie ich das mit dem Löschen hinkriege ist allerdings fraglichlich, da es auch mal vorkommt, das ein Rechteck nur mal halb oder dreiviertel oder auch nur ein bisschen geschitten wird ;) Hmmm...

Ich hatte vorhin noch eine andere Idee, unzwar Folgendes:
-> Man nimmt einfach ein schwarzes Image als Hintergrund des Panels, sozusagen als "Buffer" und zeichnet da alles rauf. Man bewegt einen Spieler, zeichnet auf das Bild und packt es wieder als Hintergrundbild aufs Panels.

So müsste man das mit den Vektoren eigentlich auch umgehen können und auch dieses immer wieder neu zeichnen.

Was hälst du davon, würde das gehen? Wie sieht das mit der Rechenzeit/Performance aus?

Edit:\
Also laut eines Kollegen wäre meine alternative Überlegung schneller, aber ich bin da echt skeptisch, da es bestimmt nicht so schnell vonstatten geht, auf ein Bild zu zeichen, als auf einem JPanel. Oder? :D Ach ich hab keine Ahnung, ob das überhaupt geht, aber ich gucke einfach mal, was du so schreibst :)
 
Zuletzt bearbeitet:
klar so könnte man das natürlich auch machen :-) ich stimme auch deinem kolleg zu, dass diese methode schneller is, jedenfalls wenn die vectoren viele rechtecke enthalten
 

Neue Beiträge

Zurück