不能使用另一个类的方法?
问题描述:
我知道有一些有类似标题的其他线程,但我已经做了在那些线程提出的一切。不能使用另一个类的方法?
我试图做一个恐龙的赛车游戏称为化石燃料,现在我创造了障碍从需要避免顶洒落在一般的游戏。
我知道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)符号无法找到。我不知道为什么我会无法访问的故障等级
答
obsList我的公开方法没有一个类型。 您正尝试在'Object'上调用moveObs(),而不是在'Obstacle'上。
要改变,你需要做obsList类型化的列表如下:
ArrayList<Obstacle> obsList = new ArrayList<>();
+0
谢谢,我的印象是,它会知道是什么类型的对象,因为我使用的是障碍物的方法,但我想我必须在创建数组列表时指定。 –
+0
是的,你给obsList添加了一个障碍,它的工作原因是障碍也是一个对象(就像Java中的所有东西一样)。虽然可以添加许多其他对象并将它们放在一起,但您只能调用它们都具有的方法,这些方法是Object类型的方法,如创建obsList('new ArrayList()'时定义的那样隐含地'new ArrayList
尝试做这样的事情'的ArrayList obsList'因此这个列表知道什么样的东西在里面,所以它知道什么方法存在为那些对象。 –
csmckelvey
只要改变你的ArrayList定义使用泛型像 ArrayList的 obsList =新的ArrayList (); –
我刚试过,它解决了这个问题,但它为什么起作用?难道不应该已经知道哪种类型的项在列表 –