我想知道是否有一些代码或者可以将类中的方法应用于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);
这使得它们独立移动并重叠,此时我只是使用我创建的窗口的边界左右移动它们。那么有什么办法可以同时将它们组合在一起吗?我已经搜索了一种方法,将类方法应用于所有列表项,但几个小时后我没有找到任何东西。
非常感谢与此相关的任何材料,来源或建议。
答案 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>();