2017-02-20 15 views
0

Я начинающий программист, использующий Java. Я делаю свою первую простую игру. Мне нужна монета (пункты LinkedList в моем классе контроллера) должны быть удален после того, как они были собраны, и еще лучше было бы, когда они могут быть порождали снова в другом место (я использую это:Как удалить (и респаун) элемент (монета) в 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; 

установить мою «монету» случайную переменную x и y). Я уже сделал все правильно, когда дело дошло до их появления в этом случайном месте, и я также сделал метод Collision() внутри моего класса Player. Похоже, что:

private void Collision(){ 

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

} 

Точки работают нормально (вроде), но я просто не могу понять, что нужно сделать, чтобы удалить монету после того, как он был «взял». Я, конечно, иметь надстройку и метод RemoveItem внутри моего класса контроллера:

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

AddItem вызывается в конструкторе контроллера ... я знаю, что это немного долго, но я хотел сделать все ясно. Я был бы очень рад, если бы кто-то помог мне, потому что без этой помощи игра бессмысленна. Спасибо всем, кто мне помогает, и если вам нужна дополнительная информация, просто скажите.

EDIT: Это мой код:

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

и функция чтения, так что я могу использовать его в своем классе игроков:

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

И здесь он получает итератор от контроллера до класса игрока

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

Я даже создал методы next() и 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()); 
} 

Этого вид цикла имеет преимущество, что вы можете удалить объектов в списке без риска и довольно легко понять. Я использую newCount здесь, чтобы подсчитать, сколько монет было удалено, и их нужно добавить снова. Для этого конструктор Монеты должен установить свое положение случайным образом.

Редактировать: Итератор используется для получения всех элементов любой коллекции или списка по порядку. При вызове next() на нем он переходит к следующему объекту в списке и возвращает его. hasNext() возвращает, если у Iterator остались элементы, или если он достиг своего конца. И remove() удаляет текущий элемент, который является последним, возвращаемым next().

В Iterator Loop вы проверяете, остались ли элементы, и пока это правда, вы получите следующий элемент, проверьте, не сталкивается ли он с игроком, и если он что-то делает. Это что-то в нашем случае удаляет этот экземпляр монеты и создает новый. Редактировать конец

Еще одна вещь, которую я хочу отметить, заключается в том, что LinkedLists не очень хороши для этой цели, я бы предпочел использовать ArrayLists, поскольку они быстрее и имеют случайные Acces, что означает, что время любого получить или добавить вызов не зависит от индекса. Но в вашей маленькой игре это не так уж и важно.

Надеюсь, это вам поможет.
Если я допустил некоторые ошибки при интерпретации кода, пожалуйста, поправьте меня.

Пожалуйста, простите за опечатки, я напечатал редактировать на моем телефоне

+0

Вы должны написать, что цикл в методе, который проверяет наличие столкновений, так что в вашем случае в плеере –

+0

Ok. Спасибо за ваш ответ. c - переменная для связанного списка в классе игроков, чтобы получить оценки монеты. Я еще не знаю, как петли итератора еще ... но я думаю, что это должно сработать. Мой вопрос: в инструкции if не следует добавлять 1 к newCount для того, чтобы цикл for работал? 3. Монета получает случайную позицию, но в конструкторе контроллера не в конструкторе монет. Должен ли я изменить его? Дай мне знать. Я до сих пор не понимаю многих вещей: D – Ragnar

+0

Хорошо, я попытаюсь прояснить некоторые вещи в своем ответе –

Смежные вопросы