2017-04-15 5 views
0

비슷한 제목을 가진 다른 스레드가 있다는 것을 알고 있지만 해당 스레드에서 제안 된 모든 작업을 수행했습니다.다른 클래스의 메서드를 사용할 수 없습니까?

나는 화석 연료라고 불리는 공룡 경주 게임을 만들려고하고 있습니다. 지금은 피할 필요가있는 장애물이있는 일반적인 게임을 만들고 있습니다.

저는 파이썬을 알고 있으며, 최근에 자바를 배우기 시작했습니다. 그래서이 질문은 아마도 어리석은 것처럼 들릴지 모르지만, 여기에 있습니다.

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

내가 main 메소드 내에서 moveObs (int)를 호출 할 때 기호를 찾을 수 없음을 나에게 말하고있다. 왜 장애 클래스에서 내 공개 메소드에 액세스 할 수 없는지 모르겠다.

+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 유형의 메소드 인 모든 객체가 공통으로 가지는 메소드 만 호출 할 수 있습니다. 암시 적으로 'new ArrayList ()'). 그래서 당신은 항상 타입을 지정합니다. – paxikek