不能使用另一个类的方法?

问题描述:

我知道有一些有类似标题的其他线程,但我已经做了在那些线程提出的一切。不能使用另一个类的方法?

我试图做一个恐龙的赛车游戏称为化石燃料,现在我创造了障碍从需要避免顶洒落在一般的游戏。

我知道Python和最近才开始学习Java,所以这个问题可能听起来很愚蠢,但在这里不用。

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); 
        } 

       } 
      } 
     } 
    } 
} 

这里是我的障碍类:

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; 
    } 
} 

它告诉我,当我打电话从主方法中moveObs(INT)符号无法找到。我不知道为什么我会无法访问的故障等级

+0

尝试做这样的事情'的ArrayList obsList'因此这个列表知道什么样的东西在里面,所以它知道什么方法存在为那些对象。 – csmckelvey

+0

只要改变你的ArrayList定义使用泛型像 ArrayList的 obsList =新的ArrayList (); –

+0

我刚试过,它解决了这个问题,但它为什么起作用?难道不应该已经知道哪种类型的项在列表 –

obsList我的公开方法没有一个类型。 您正尝试在'Object'上调用moveObs(),而不是在'Obstacle'上。

要改变,你需要做obsList类型化的列表如下:

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

谢谢,我的印象是,它会知道是什么类型的对象,因为我使用的是障碍物的方法,但我想我必须在创建数组列表时指定。 –

+0

是的,你给obsList添加了一个障碍,它的工作原因是障碍也是一个对象(就像Java中的所有东西一样)。虽然可以添加许多其他对象并将它们放在一起,但您只能调用它们都具有的方法,这些方法是Object类型的方法,如创建obsList('new ArrayList()'时定义的那样隐含地'new ArrayList ()')。所以你总是指定类型。 – paxikek