2016-05-13 4 views
0

Ich versuche, eine AraayList zu scannen, die in der Hauptklasse in der Turtle-Klasse erstellt wurde, um verschiedene Kriterien zu überprüfen. Ich habe den Code so weit wie möglich für Sie vereinfacht.Verwenden einer ArrayList in einer anderen Klasse zum Scannen von Objekten

Die Hauptklasse:

import javax.swing.*; 
 
import java.awt.*; 
 
import java.util.ArrayList; 
 
import java.awt.event.*; 
 
import javax.swing.event.ChangeEvent; 
 
import javax.swing.event.ChangeListener; 
 

 
class TurtleProgram 
 
{ \t 
 
\t public ArrayList<DynamicTurtle> turtles; 
 

 
\t public static void main(String[] args) 
 
\t { 
 
\t \t new TurtleProgram(); 
 
\t } 
 

 
\t public TurtleProgram() 
 
\t { 
 
\t \t //INSTANTIATED JFRAME WITH BUTTONS/SLIDER AND CREATED LISTENER METHODS 
 

 
\t \t turtles = new ArrayList<DynamicTurtle>(); //THE ARRAYLIST I AM WANTING TO USE IN ANOTHER CLASS 
 
\t \t turtles.add(new RandomTurtleB(canvas, 400, 300, 100, 0)); //THIS ARRAYLIST BECOMES LARGER WHEN BUTTONS ON JFRAME TO ADD NEW TURTLES 
 
\t \t 
 
\t \t gameLoop(); //LOOP FOREVER 
 
\t } \t \t \t 
 

 
\t private void gameLoop() 
 
\t { 
 
\t \t int deltaTime = 20; 
 
\t \t 
 
\t \t while(true) 
 
\t \t { 
 
\t \t \t for (int i = 0; i < turtles.size(); i++) 
 
\t \t \t { 
 
\t \t \t \t (turtles.get(i)).unDrawTurtle(); //REMOVE FROM CANVAS \t \t \t \t 
 
\t \t \t \t (turtles.get(i)).wrapPosition((turtles.get(i)).getPositionX(), (turtles.get(i)).getPositionY()); //MAKE SURE TURTLES NOT OFF SCREEN 
 
\t \t \t } 
 

 
\t \t \t for (int i = 0; i < turtles.size(); i++) 
 
\t \t \t { 
 
\t \t \t \t (turtles.get(i)).update(1000); //MAKE THE TURTLES MOVE WITH A CHANCE OF TURNING 
 
\t \t \t } 
 

 
\t \t \t for (int i = 0; i < turtles.size(); i++) 
 
\t \t \t { 
 
\t \t \t \t (turtles.get(i)).drawTurtle(); //DRAW TO CANVAS \t \t \t 
 
\t \t \t } 
 

 
\t \t \t for(int i = 0; i < turtles.size(); i++) 
 
\t \t \t { 
 
\t \t \t \t (turtles.get(i)).cohesian(); //THIS IS HOW I WOULD LIKE TO ADDRESS THE COHESIAN METHOD 
 
\t \t \t } 
 
\t \t 
 
\t \t 
 
\t \t Utils.pause(deltaTime/2); 
 
\t \t } \t 
 
\t } 
 
}

Dann würde Ich mag die aktuelle Schildkröte gegen andere Schildkröten zu überprüfen, um zu sehen, ob es in der Kohäsion() -Methode der Nähe ist Aktionen auszuführen:

class Turtle 
 
{ 
 
    protected Canvas canvas; // private field reference to a canvas private   
 
    private CartesianCoordinate myLocation, oldLocation; 
 
    private boolean penDown = true; 
 
    private double angle, maxX, maxY, nowPosX, nowPosY, maximumX, maximumY, x, y; 
 
    public double d, e, first, second; 
 
    private int speed; 
 

 
    public Turtle(Canvas canvas, CartesianCoordinate initLocation) 
 
    { 
 
     this.canvas = canvas; 
 
     this.myLocation = new CartesianCoordinate(0,0);   
 
     penDown = true; 
 
     myLocation = initLocation.copy();   
 
    }  
 

 
    public void cohesian() 
 
    { 
 
     double flockingDistanceLimit = 200; 
 
     double numberOfFlockers = 0; 
 
     double combinedX = 0; 
 
     double combinedY = 0; 
 
     double averageCombinedX, averageCombinedY, averageCombinedY, moveToFlock, turnToFlock, distanceToPotentialFlock;   
 

 
     for (DynamicTurtle t : turtles) //CANNOT USE THE ARRAYLIST TO SCAN THROUGH ITS ELEMENTS 
 
     { 
 
      if(this.getPositionX() != t.getPositionX() && this.getPositionY() != t.getPositionY()) //MAKE SURE TURTLE ISNT SCANNING ITS SELF 
 
      { 
 
       distanceToPotentialFlock = Math.sqrt(Math.pow((this.getPositionX()-t.getPositionX()),2) + Math.pow((this.getPositionY()-this.getPositionY()),2)); //FIND DISTANCE BETWEEN CURRENT AND SCANNED TURTLE 
 

 
       if(distanceToPotentialFlock < flockingDistanceLimit) //MAKE SURE THE FOUND TURTLE IS WITHIN RANGE USING THE DISTANCE BETWEEN POINTS METHOD 
 
       { 
 
        combinedX = combinedX + t.getPositionX(); //FIND SUMMATION OF X POSITIONS 
 
        combinedY = combinedY + t.getPositionY(); //FIND SUMMATION OF Y POSITIONS 
 
        numberOfFlockers++; //AS A FLOCKER HAS BEEN FOUND INCREMENT THE NUMBER OF FLOCKERS 
 
       } 
 
      } 
 

 
      if(numberOfFlockers > 0) 
 
      { 
 
       averageCombinedX = (combinedX/numberOfFlockers); //FIND AVERAGE X POSITION 
 
       averageCombinedY = (combinedY/numberOfFlockers); //FIND AVERAGE Y POSITION 
 
       moveToFlock = Math.sqrt(Math.pow(averageCombinedX,2) + Math.pow(averageCombinedY, 2)); //CALCULATE DISTANCE TO CENTER OF FLOCKING 
 
       turnToFlock = Math.atan(averageCombinedY/averageCombinedX); 
 

 
       if(turnToFlock < 0) 
 
       { 
 
        turnToFlock = 360 - (-turnToFlock); //ADJUSTING FOR NEGATIVES 
 
       } 
 
      } 
 
     } 
 
    } 
 

 
    public void wrapPosition(double x, double y) 
 
    { 
 
     this.maxX = x; 
 
     this.maxY = y; 
 

 
     if(maxX < 0) 
 
     { 
 
      this.setPositionX(800); 
 
     } 
 

 
     else if(maxX > 800) 
 
     { 
 
      this.setPositionX(0); 
 
     } 
 

 
     if(maxY < 0) 
 
     { 
 
      this.setPositionY(600); 
 
     } 
 

 
     else if(maxY > 600) 
 
     { 
 
      this.setPositionY(0); 
 
     }   
 
    } 
 
} 
 

 

Wenn ich Hilfe bei der Verwendung der ArrayList in der Turtle-Klasse in der cohesian() -Methode haben könnte, wäre es sehr hilfreich. Vielen Dank im Voraus.

Antwort

0

Entweder übergeben Sie die Arraylist als Parameter cohesian oder deklarieren es als statisches Feld

+0

Hallo @aviad, habe ich versucht, die Arraylist als Parameter hinzu:. {(Turtles.get (i)) cohesian (Schildkröten); } und die kohäsionsmethode erlauben so eine arraylist wie folgt: {public static void cohesian (ArrayList turtles)} aber ich kann es immer noch nicht zur Arbeit bringen, könntest du weiterhelfen? Prost. – jHornsby

+0

Übergeben Sie den gleichen Parameter an gameLoop auf die gleiche Weise – aviad

+0

Danke für die Antwort @aviad, aber ich bekomme jetzt eine Fehlermeldung "Fehler: kann nicht finden Symbol" in "öffentlichen Void Cohesian (ArrayList Schildkröten) sagen, es kann nicht Symbol finden. Vielen Dank für Ihre Hilfe – jHornsby