2017-06-30 2 views
0

Ich versuche, Schwarm von Drohnen mit Java Swing zu simulieren.Synchronisierung von jPanels

Der Flug der Drohne als Schwarm durch Verfolgung von IR-Punkten.

Jede Schwarm Mitglied Klasse JPanel erweitern und Farbe Funktion, deren Aufgabe es ist IR Punkte auf seiner Tafel malen nach Führer Position

@Override 
public void paint(Graphics g) { 
    super.paint(g); 

    for (int x = currX_1 - currIRdim; x < currX_1 + currIRdim; x++) { 
     for (int y = currY_1 - currIRdim; y < currY_1 + currIRdim; y++) { 
      g.setColor(Color.RED); 
      g.drawLine(x, y, x, y); 
     } 
    } 

    for (int x = currX_2 - currIRdim; x < currX_2 + currIRdim; x++) { 
     for (int y = currY_2 - currIRdim; y < currY_2 + currIRdim; y++) { 
      g.setColor(Color.RED); 
      g.drawLine(x, y, x, y); 
     } 
    } 
} 

der Schwarm Führer und die Drohne neben ihm die Platten aus den folgenden Mitgliedern aktualisiert außer Kraft setzen auf jede Bewegung

private void updateFollowers(AgentIrPanel[] screensToUpdate, String command) { 
    int xdiff = screensToUpdate[0].getDiffX(); 
    int dimdiff = screensToUpdate[0].getDiffDim(); 
    switch (behaviour) { 
     case SWARM_LEADER: 
      screensToUpdate[0].setCurrX_1(screensToUpdate[0].getCurrX_1() + xdiff); 
      screensToUpdate[0].setCurrX_2(screensToUpdate[0].getCurrX_2() + xdiff); 
      screensToUpdate[0].repaintPoints(); // call jpanel.repaint() 

      screensToUpdate[1].setCurrIRdim(screensToUpdate[1].getCurrIRdim() - dimdiff); 
      screensToUpdate[1].repaintPoints(); 
      break; 
     case FOLLOW_LEFT: 
      screensToUpdate[0].setCurrIRdim(screensToUpdate[0].getCurrIRdim() - dimdiff); 
      screensToUpdate[0].repaintPoints(); 
    } 
} 

folgende Mitglieder auf ihren Platten 2 IR-Punkt des bekommen und durch die Unterschiede zu den vorherigen Punkten erkannt, entscheiden, welche Richtung sollten sie

bewegen
private String secRowReading() { 
    BufferedImage img = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2 = img.createGraphics(); 
    this.paint(g2); 

    if ((new Color(img.getRGB(X_1 - IRdim ,Y_1 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_2 - IRdim ,Y_2 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_1 - IRdim + diffX, Y_1 - IRdim)).equals(Color.RED)) 
      && (new Color(img.getRGB(X_2 - IRdim + diffX, Y_1 - IRdim)).equals(Color.RED))){ 
     ans = "right"; 
    }else if ((new Color(img.getRGB(X_1 - IRdim ,Y_1 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_2 - IRdim ,Y_2 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_1 - IRdim - diffX, Y_1 - IRdim)).equals(Color.RED)) 
      && (new Color(img.getRGB(X_2 - IRdim - diffX, Y_1 - IRdim)).equals(Color.RED))){ 
     ans = "left"; 
    }else if ((new Color(img.getRGB(X_1 - IRdim ,Y_1 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_2 - IRdim,Y_2 - IRdim)).equals(Color.BLACK)) 
      && (new Color(img.getRGB(X_1 - IRdim + diffDim ,Y_1 - IRdim + diffDim)).equals(Color.RED)) 
      && (new Color(img.getRGB(X_2 - IRdim + diffDim ,Y_2 - IRdim + diffDim)).equals(Color.RED))) { 
     ans = "front"; 
    }else if ((new Color(img.getRGB(X_1 - IRdim - diffDim,Y_1 - IRdim -diffDim)).equals(Color.RED)) 
      && (new Color(img.getRGB(X_2 - IRdim - diffDim,Y_2 - IRdim -diffDim)).equals(Color.RED))){ 
     ans = "back"; 
    }else { 
     ans = "stop"; 
    } 

    g2.dispose(); 
    return ans; 
} 

das Problem ist - die folgenden Drohnen sind nicht erfolgreich mit diesem zusammen, nur wenn sie separat betrieben wurden. Während des Fluges erkennt einer der Anhänger die Änderung, die der Anführer auf ihn angewendet hat, nicht rechtzeitig und stoppt, was den gesamten Flug durcheinander bringt.

Ich habe versucht, das Lesen jeder folgenden Drohne mit Timer() zu verzögern, aber ohne Erfolg. Wie man es synchronisiert, um richtig zu arbeiten?

+0

...................... hallo? –

Antwort

2

Jede Schwarm Mitglied Klasse JPanel erweitern und Farbe Funktion, deren Rolle außer Kraft gesetzt ist IR Punkte auf seiner Platte nach Führern Position

Und hier ist ein Problem zu malen. Tu das nicht. Lassen Sie Ihre Sprites nicht eine "schwerere" Klasse als nötig ausführen, was Ihr Programm unnötig kompliziert. Stattdessen sollten Ihre Sprites keine Komponentenklassen sein, d. H. Keinen Swing- oder AWT-Komponententyp erweitern und stattdessen in eine JPanel zeichnen, deren paintComponent-Methode überschrieben wurde und deren super.paintComponent(g) aufgerufen wurde.

Ich würde die Swarm-Klasse ein public void draw(Graphics2D g2) Methode geben, erstellen Sie eine Sammlung von ihnen, vielleicht List<Swarm>, und dann in der Methode paintcomponent, durchlaufen die Liste, in der Graphics2D Objekt aus der JVM erhalten vorbei, jedes Sprite Zeichnen/Schwarmobjekt.

Andere Probleme: Achten Sie darauf, das Verhalten und die Logik Ihrer Swarm-Objekte aus dem GUI-Code zu extrahieren. Der Logikcode sollte Teil des Modells Ihres Programms sein, nicht Teil der View (der GUI), deren Aufgabe es ist, den Status des Modells anzuzeigen und dem Benutzer die Interaktion mit dem Modell zu ermöglichen (über den Controller).

+0

Ich habe deine Richtlinien befolgt, jetzt funktioniert alles super und ich habe viel über die Fehler gelernt, die ich gemacht habe, danke! – ZaKad