2017-04-15 2 views
0

Je sais qu'il y a d'autres threads qui ont un titre similaire, mais j'ai fait tout ce qui était suggéré dans ces threads. J'essaie de faire un jeu de course de dinosaures appelé Combustibles Fossiles, pour l'instant je crée le jeu générique avec des obstacles qui flottent par le haut qui doivent être évités.Vous ne pouvez pas utiliser la méthode d'une autre classe?

Je connais Python, et j'ai récemment commencé à apprendre Java, donc cette question semble probablement stupide, mais ici va.

import javax.swing.JFrame; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 

import java.lang.System; 
import java.util.ArrayList; 
import java.lang.Math; 
public class MainLoop 
{ 
    public static void main(String [] args) 
    { 
     boolean mloop = true; 
     int obsMoveIncrease = 1; 
     ArrayList obsList = new ArrayList(); 
     final String[] validObsTypes = {"tree", "rock", "bush"}; 
     long moveFrequency = 750; 
     long beginningTime = System.currentTimeMillis(); 
     long obsInterval = 3000; //how often a new object is created in milliseconds 
     long timeOfLastMove = System.currentTimeMillis(); 
     JFrame frame = new JFrame(); 
     ImageIcon background = new ImageIcon("background.jpg"); //background is 700 by 1500 px 
     JLabel bgLabel = new JLabel(background); 
     frame.add(bgLabel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
     while (mloop) 
     { 
      int freshObsTypeNum = (int) Math.random() * 3; 
      String freshObsType = validObsTypes[freshObsTypeNum]; //chooses a pseudo-random valid obstacle type 
      if (System.currentTimeMillis() >= beginningTime + obsInterval) 
      { //checks if sufficient time has passed since last obstacle was created 
       Obstacle obs = new Obstacle(freshObsType, 0); 
       obsList.add(0, obs); 
       beginningTime = System.currentTimeMillis(); //resets "clock" 
      } 


      if (System.currentTimeMillis() >= timeOfLastMove + moveFrequency) //checks if it is time to move obstacles 
      { 
       timeOfLastMove = System.currentTimeMillis(); 
       for (int i = 0; i < obsList.size(); i++) 
       { 
        obsList.get(i).moveObs(obsMoveIncrease); //moves obstacles ERROR OCCURS ON moveObs 
        if (obsList.get(i).getObsY() > 1500) 
        { 
         obsList.remove(i); 
        } 

       } 
      } 
     } 
    } 
} 

Voici ma classe d'obstacles:

import java.util.Arrays; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
public class Obstacle 
{ 
    private String obstacleType; 
    private int obstacleXPos; 
    public final int[] obsXlist = {0, 175, 350, 525}; //list of starting positions (4 slots along the x axis) 
    int obstacleYPos = 0; 
    public Obstacle(String type, int startPos) 
    { 
     obstacleType = type; 
     obstacleXPos = obsXlist[startPos]; 
    } 

    public int getObsX() 
    {return obstacleXPos;} 

    public int getObsY() 
    {return obstacleYPos;} 

    public void moveObs(int increase) 
    {obstacleYPos += increase;} 

    ImageIcon obstacleImg; 
    public JLabel getObsImg() //gets image (on a label) for keyword given to constructor 
    { 
     if (obstacleType.equals("tree")) 
      obstacleImg = new ImageIcon("treeObs.jpg"); 
     else if (obstacleType.equals("rock")) 
      obstacleImg = new ImageIcon("rockObs.jpg"); 
     else if (obstacleType.equals("bush")) 
      obstacleImg = new ImageIcon("bushObs.jpg"); 
     else 
      System.out.println(obstacleType + " is not a valid obstacle type"); 

     JLabel obsLabel = new JLabel(obstacleImg); 
     return obsLabel; 
    } 
} 

Il me dit que le symbole ne se trouve pas quand je l'appelle moveObs (int) depuis la méthode principale. Je ne sais pas pourquoi je n'aurais pas accès à mes méthodes publiques dans la classe Obstacle

+0

Essayez de faire quelque chose comme 'ArrayList obsList' afin que la liste sait quel genre de choses sont à l'intérieur il sait quelles méthodes existent pour ces objets. – csmckelvey

+0

Modifiez simplement votre définition ArrayList pour utiliser des génériques tels que ArrayList obsList = new ArrayList (); –

+0

J'ai juste essayé ça, ça a résolu le problème, mais pourquoi ça a marché? Ne devrait-il pas déjà savoir quel type d'articles sont dans la liste –

Répondre

3

obsList n'a pas de type. Vous essayez d'appeler moveObs() sur 'Object', pas sur 'Obstacle'.

Pour changer ce que vous devez faire ListeObservée une liste dactylographiée comme ceci:

ArrayList<Obstacle> obsList = new ArrayList<>(); 
+0

Merci, j'étais sous l'impression qu'il savait quel type d'objet c'était parce que j'utilisais une méthode pour les obstacles, mais je suppose que je dois spécifier lors de la création de l'arraylist. –

+0

Oui, vous avez ajouté un Obstacle à obsList et cela a fonctionné car Obstacle est aussi un Object (comme tout ce qui est implicitement dans Java). Bien que vous puissiez ajouter beaucoup d'autres objets et les lancer ensemble, vous pouvez seulement appeler des méthodes que TOUS ont en commun, qui sont des méthodes du type Object, telles que définies lorsque vous avez créé obsList ('new ArrayList()' implicitement 'new ArrayList ()'). Donc, vous spécifiez toujours le type. – paxikek