将类方法应用于整个ArrayList

时间:2014-11-30 21:22:47

标签: java 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));
    }

这是我调用move方法的地方:

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

这使得它们独立移动并重叠,此时我只是使用我创建的窗口的边界左右移动它们。那么有什么办法可以同时将它们组合在一起吗?我已经搜索了一种方法,将类方法应用于所有列表项,但几个小时后我没有找到任何东西。

非常感谢与此相关的任何材料,来源或建议。

2 个答案:

答案 0 :(得分:1)

您必须提出一个解决方案,可以将您正在移动的入侵者与正在显示的入侵者分开。 这是因为您的个人入侵者总是会或多或少地顺序移动 - 即使您正在使用多个线程等等。即使您开始使用Java8 Lambdas来编写这样的代码:

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

这也会创建一些中间状态,其中一些入侵者被移动,有些则没有。

因此,您必须确保只在屏幕上绘制一组一致的入侵者。你可以通过以下几种方式做到这一点:

  • 仅在移动所有入侵者后绘制到屏幕
  • 在移动入侵者的同时制作入侵者的副本以进行绘制。移动所有入侵者后,开始从移动的列表中显示入侵者 ...

第一编辑:如何将入侵者绘制到屏幕?这是在单独的线程中发生的吗?

第三次编辑:好的,也许你可以在开始移动入侵者之前停止你的timerThread。当你完成移动它们后,你可以再次重启计时器。检查你的计时器提供的方法它应该有start()和stop()或者suspend()方法。

做这样的事情:

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

第二次编辑:再次查看您的代码。您不需要从0以外的索引启动for循环编号2和3.如果您只是说:

,您的代码将更容易阅读
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));
}

答案 1 :(得分:-1)

创建一个像Moveable这样的界面。并将Move方法放在上面。然后在Venusian,Martian和Mercurian上实现它。并在arraylist上使用此界面

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