2017-02-20 4 views
0

저는 Java를 사용하는 초급 프로그래머입니다. 나는 처음으로 간단한 게임을 만들고있다.java에서 항목 (동전)을 삭제 (및 다시 생성)하는 방법. (컨트롤러 클래스를 사용하여 스폰)

Random randomGenerator = new Random(); 
    for (int idx = 1; idx <= 1; ++idx){ 
      int r1 = randomGenerator.nextInt(590); 
      this.r1=r1; 
    } 
    for (int idx = 1; idx <= 1; ++idx){ 
      int r2 = randomGenerator.nextInt(380); 
      this.r2=r2; 

: 나는 다른 자리 (I이 사용하고 그들이 포착되었고, 그들이 다시 양산 할 수있을 때 더 나은이 될 것이라고 후에 제거 할 (내 컨트롤러 클래스의 LinkedList의 항목) 동전 필요 내 "동전"에 임의의 x 및 y 변수를 설정). 나는 무작위로 그들을 산란 할 때 이미 모든 것을 다 했었고, Player 클래스 내에서 Collision() 메소드를 만들었습니다. 그것은 그 다음과 같습니다

private void Collision(){ 

    for(int i = 0; i < c.size(); i++){ 
     if(getBounds().intersects(c.get(i).getBounds())){ 
      Game.points++; 
     } 
    } 

} 

포인트는 (가지) 잘 작동하지만 난 그냥 "포착"한 후 동전을 제거하기 위해 무엇을 알아낼 수 있습니다. addItem를 컨트롤러의 생성자에서 호출되어

public void removeItem(Coin coin){ 
    c.remove(coin); 
} 
    public void addItem(Coin coin){ 
    c.add(coin); 
} 

... 나는 그것이 조금 오래 알고하지만 난 모든 것을 명확하게하고 싶었 : 물론 내 컨트롤러 클래스의 내부 추가 및 removeItem 방법이있다. 그 도움 없이는 무의미한 사람이기 때문에 누군가가 나를 도와 주면 정말 행복 할 것입니다. 나를 도와주는 사람 모두에게 감사 드리며 추가 정보가 필요하면 알려주세요.

편집

:

private void Collision(){ 
    int newCount = 0; 
    while(iter.hasNext()){ 
    iter.next(); 
     for(int i=0; i<cb.size(); i++){ 
     if(getBounds().intersects(cb.get(i).getBounds())){ 
     Game.points++; 
     newCount++; 
     iter.remove(); 
     } 
    } 
    } 
    for(int i = 0; i < newCount; i++){ 
    controller.addItem(new Coin());  
    newCount--; 
    } 
} 

내가 반복자는 컨트롤러에서 선언 한 :

static Iterator<Coin> iter = c.iterator(); 

그래서 난 내 플레이어 클래스에서 사용할 수있는 getter 함수 : 이 내 코드입니다

public static Iterator<Coin> getCoinIterator(){ 
return iter; 
} 

여기에서 컨트롤러에서 플레이어 클래스 인 이터레이터를 가져옵니다

private Iterator<Coin> iter = Controller.getCoinIterator(); 

컨트롤러에서 has() 및 hasNext() 메서드를 만들었지 만 여전히 오류가 많습니다.

답변

0

우선, 같은 장소에 동전을 다시 넣지 말고, 동전을 제거한 다음 새 것을 추가하십시오. 코드가 완전히 여기에 없기 때문에 이미이 작업을 수행했는지 확신 할 수 없습니다.

편집 : Coins Constructor에서 임의로 위치를 설정해야합니다. Coin coin = new Coin은 이미 위치 설정이되어있는 동전을 만듭니다. 또는 각 코인에서 컨트롤러의 위치 무작위 화 방법을 호출 할 수 있습니다. 작업이를 얻으려면, 당신은 당신의 동전 클래스에

private int x, y; 

을 추가하고 생성자에서 임의의 값들을 설정해야합니다. 그렇게하면 다른 곳에서는 무작위로 추출 할 필요가 없습니다. 새로운 코인으로 코인 오브젝트를 생성하면 코인 오브젝트의 위치가 정해집니다. 편집 끝

이 동전을 제거에 관해서, 나는 그런 반복자 루프를 사용하는 것이 루프 이런 종류의 당신이를 제거 할 수 있다는 장점이있다

int newCount = 0; 
while(iter.hasNext()){ 
    Coin coin = iter.next(); 
    if(getBounds().intersects(coin.getBounds())){ 
     Game.Points++; 
     newCount++ 
     iter.remove(); 
    } 
} 
for(int i = 0; i < newCount; i++){ 
    c.add(new Coin()); 
} 

(가정 C 당신의 목록입니다) 어떤 위험도없이 목록에있는 객체를 쉽게 이해할 수 있습니다. 나는 얼마나 많은 동전이 제거되었는지 다시 계산해야하는지 계산하기 위해 여기에 newCount를 사용하고 있습니다. 이것이 작동하려면 코인 생성자가 임의로 위치를 설정해야합니다.

편집 : Iterator는 컬렉션 또는 목록의 모든 요소를 ​​순서대로 가져 오는 데 사용됩니다. next()를 호출하면 List의 다음 Object로 이동하여이를 반환합니다. hasNext()는 Iterator에 요소가 있거나 요소가 끝에 도달했는지 여부를 반환합니다. 그리고 remove()는 next()에 의해 반환 된 마지막 요소 인 현재 요소를 삭제합니다.

반복자 루프에서 요소가 남아 있는지 확인하고 그 요소가 참이면 다음 요소를 얻습니다. 플레이어가 충돌하는지 확인하고 어떤 작업을 수행하는지 확인하십시오. 이 경우 우리는 동전 인스턴스를 삭제하고 새 인스턴스를 만드는 중입니다. 편집 끝

내가 지적하고 싶은 또 다른 점은 LinkedLists가 그다지 좋지 않다는 것입니다. ArrayLists를 사용하는 것이 더 빠릅니다. 더 빠르며 임의의 Acces가 무엇인지 의미합니다. get 또는 add 호출은 인덱스에 의존하지 않습니다. 하지만 당신의 작은 경기에서 그렇게 큰 거래는 아닙니다.

이 정보가 도움이되기를 바랍니다.
코드를 해석하는 데 실수를 범하면 저를 시정하십시오.

오타를 용서하십시오, 내 전화

+0

에 편집을 입력 당신은 작성해야하는 루프, 충돌을 검사 플레이어에서 귀하의 경우 너무 –

+0

확인하는 방법이다. 답장을 보내 주셔서 감사합니다. c는 플레이어 클래스의 연결된 목록 에 대한 변수로 동전 경계를 얻습니다. 나는 아직 반복기 루프를 알지 못한다. 그러나 그것이 효과가 있다고 생각한다. 내 질문은 : if 문에 for 루프가 작동하도록 newCount에 1을 더하면 안 되는가? 3. 코인은 임의의 위치에 있지만 코인 생성자가 아닌 컨트롤러 생성자에서 가져옵니다. 나는 그것을 바꿔야 할까? 알려줘. 나는 아직도 많은 것을 이해하지 못한다 : D – Ragnar

+0

좋아, 나는 내 대답에서 몇 가지를 명확히하려고 노력할 것이다 –