2017-04-15 2 views
0

似たようなタイトルを持つ他のスレッドがあることは知っていますが、それらのスレッドで提案されたすべてのことを行っています。別のクラスのメソッドを使用できませんか?

私は、化石燃料と呼ばれる恐竜競争ゲームを作ろうとしています。今は、回避する必要のある障害物が浮かんでいる一般的なゲームを作成しています。

私は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)を呼び出したときにシンボルが見つからないことを私に言っています。なぜ私はObstacleクラスのパブリックメソッドにアクセスできないのか分かりません。

+0

リストが、それは方法が存在することを知っているので、どのような種類のものが内部にあるかを知っているように 'ArrayListの obsList'のようなものをやってみてください。あなたは、このような型指定されたリストをobsList作成する必要があることを変更するには

それらのオブジェクトのために。 – csmckelvey

+0

ArrayListの定義を変更して、 のようなジェネリックを使用します。ArrayList obsList = new ArrayList (); –

+0

私はちょうどそれを試みた、それは問題を解決した、しかしそれはなぜ働いたのですか?どのタイプの項目がリスト内にあるのかはすでに分かっていないはずです。 –

答えて

3

obsListには型がありません。 'Obstacle'ではなく、 'Object'でmoveObs()を呼び出そうとしています。

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

ありがとう、私は障害のための方法を使用していたので、それがどのような種類のオブジェクトであるかを知ることができたという印象を受けましたが、arraylistを作成するときに指定する必要があります。 –

+0

はい、obstListにObstacleを追加しました。これはObstacleもObjectであるため(Javaではすべて暗黙的に)、機能しました。多くの他のオブジェクトを追加して一緒に投げることができますが、obsList( 'new ArrayList()'を作成したときに定義されているように、Object型のメソッドであるメソッドのすべてを共通に呼び出すことができます暗黙のうちに「新しいArrayList ()」)。だからあなたは常にタイプを指定します。 – paxikek

関連する問題