2014-11-30 4 views
2

Мне интересно, есть ли код или применить метод от класса ко всем объектам в ArrayList? Я делаю программу базовых космических захватчиков, и я пытаюсь применить метод перемещения, который будет применяться ко всем врагам, чтобы они перемещались в группе, а не по отдельности.Применение методов класса ко всему массиву ArrayList

Я создал элементы в списке массива здесь:

for (int i = 0; i < 6; i++) { 
    venWidth = venWidth - 139; 
    enemyList.add(new Venusian("/venusian.jpg", venWidth, height)); 
     } 

for (int i = 6; i < 12; i++) { 
    merWidth = merWidth - 145; 
    enemyList.add(new Mercurian("/mercurian.jpg", merWidth, merHeight)); 
     } 


for (int i = 12; i < 18; i++) { 
    marWidth = marWidth - 125; 
    enemyList.add(new Martian("/martian.jpg", marWidth, marHeight)); 
    } 

Вот где я называю метод ход:

for (int i = 0; i < enemyList.size(); i++) { 
     Invader Invaders = (Invader) enemyList.get(i); 
     Invaders.draw(g); 
     Invaders.Move(1024); 

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

Любой материал, источники или рекомендации, касающиеся этого, были бы весьма признательны.

+3

Просто выполните два прохода: один для чертежа , а другой для перемещения.Затем дисплей должен находиться в согласованном состоянии. – kiheru

+0

И дополнительно: оператор списка, который вы ищете, имеет имя foreach. Вы можете позвонить ему через list.foreach. Есть другие интересные операторы списка, которые могут вас заинтересовать. Например, карта, фолд, фильтр. Но имена для них разные в java. –

+0

И вы делаете странные вещи с шириной. Может быть, именование варов здесь не так? –

ответ

-1

создать такой интерфейс, как Moveable. и поставьте на него метод Move. затем реализуйте его на венерианском, марсианском и меркурианском языках. и использовать этот интерфейс на Список_массивов

interface Moveable { 
public void Move(int dist); 
} 

class Mercurian implements Moveable { 
public void Move(int dist) 
{ 
    //do something 
} 
} 
class Venusian implements Moveable { 
public void Move(int dist) 
{ 
    //do something 
} 
} 

class Martian implements Moveable { 
public void Move(int dist) 
{ 
    //do something 
} 
} 

ArrayList<Moveable> enemyList = new ArrayList<Moveable>(); 
+0

Это уже allready –

+0

Это не имеет ничего общего с тем, что спрашивает Иэн. – markus

+0

У меня есть класс EnemyBase, у которого есть Move(); метод, если я реализую интерфейс и оставьте его пустым, будет вызван метод из родительского класса в каждый из классов врага, или мне придется реализовать повторяющиеся методы перемещения в каждом классе для работы интерфейса? – Iain

1

Вам придется придумать решение, которое может разъединить Invaders вы передвигаетесь из тех, кого вы показываете. Это связано с тем, что ваши отдельные Invaders всегда будут более или менее последовательно перемещаться - даже если вы работаете с несколькими потоками и т. Д. Даже если вы начнете использовать Java8 Lambdas, чтобы написать свой код следующим образом:

ArrayList<Invader> badGuys; 
//fill your List here 
badGuys.forEach(badGuy -> badGuy.move()); 

Это также создало бы промежуточные состояния, в которых некоторые захватчики были перемещены, а некоторые - нет.

Таким образом, вы должны убедиться, что вы нарисовали на экране только последовательный набор захватчиков. Вы можете сделать это несколькими способами:

  • только рисовать на экран после того, как все захватчики были перемещены
  • Сделайте копию ваших захватчиков для рисования, в то время как захватчики перемещаются. После того, как все захватчики были перемещены, начать показ захватчиков из перемещенного Списка ...

1st Edit: Как вы рисуете Захватчик на экран? Это происходит в отдельных потоках?

3rd EDIT: Хорошо, возможно, вы можете остановить свой таймер, прежде чем начать перемещать захватчиков. И когда вы закончите с их перемещением, вы можете снова запустить таймер. Проверьте, какие методы предлагает ваш таймер. У него должны быть методы start() и stop() или, может быть, suspend().

ли что-то вроде этого:

timer.stop(); 
badGuys.moveAll(); 
timer.start(); 

2nd EDIT: Просто посмотрел ваш код еще раз. Вам не нужно начинать цикл for 2 и 3 с индексов, отличных от 0. Ваш код будет легче читать, если, например, вы просто скажете:

for (int i = 0; i < 6; i++) { // start from 0 (to 6) instead of 6 to 12 
    merWidth = merWidth - 145; 
    enemyList.add(new Mercurian("/mercurian.jpg", merWidth, merHeight)); 
} 
+0

Я использую таймер для перерисовки экрана redrawTimer = новый таймер (10, это); и перерисовать экранное публичное действие voidPerformed (ActionEvent e) {\t \t \t this.repaint(); \t} Я не совсем уверен, что вы подразумеваете под нитью – Iain

+0

Ну, это означает, что ваша перерисовка происходит в отдельном потоке вашего кода, перемещая ваших захватчиков. Эти две части вашей программы выполняются параллельно. Вы должны позаботиться о синхронизации, иначе вы закончите рисовать половину перемещенных и перекрывая иконки Invader на экране. – markus

+0

Ах спасибо, подумал я должен был указать точный индекс. – Iain

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