我正在尝试制作游戏,而对于枪类,我需要每个子弹都是构造函数对象,如何一次编辑每个构造函数?比如改变每个子弹的x值?
答案 0 :(得分:1)
让我猜一想。
class Gun{
Bullet bullet;
public Gun(){
bullet = new Bullet();
}
}
class Bullet{
public int x=0;
public Bullet(){
x=10;
}
}
你想一次改变所有子弹的x值(据我所知)。然后,您必须将所有Bullet实例保留在数据结构中。
static List<Bullet> bullets = new ArrayList<Bullet>();
然后更新Bullet的构造函数,如下所示。
class Bullet{
public int x=0;
public Bullet(){
x=10;
Gun.bullets.add(this);
}
}
然后遍历项目符号列表并进行您想要进行的更改。
for(Iterator i = bullets.iterator(); i.hasNext();){
i.next().x = 12;
}
希望这有帮助。
答案 1 :(得分:0)
我认为你误解了构造函数的用途。在创建类的实例时调用构造函数,并且通常初始化该单个实例的属性。如果要更改对象的所有实例的值,则必须将引用存储在数组(或其他类似的数据结构)中,然后迭代它们并单独更改每个值。
答案 2 :(得分:0)
没有子弹的迭代。不,不,一百万次,没有。 封装 x
的值,因此您只需进行一次更改。这是一个简单的代码示例,说明了您应该考虑的设计模式。谷歌“发布 - 订阅模式”或“观察者模式”的完整想法。
public class Bullet {
public static int globalEffect = 0;
private int myX;
public int x() {
return myX + globalEffect;
}
}
答案 3 :(得分:-1)
在创建项目符号时收集项目符号,然后迭代集合以更新它们。例如,像:
public abstract class Projectile {
private static final Collection<Projectile> activeProjectiles = new ArrayList<Projectile>();
static {
//update the position of any in-flight projectile approximately once per second
Runnable updater = new Runnable() {
public void run() {
while (true) {
synchronized(activeProjectiles) {
for (Projectile projectile : new ArrayList<Projectile>(activeProjectiles)) {
projectile.travel();
}
}
try {
Thread.sleep(1000);
}
catch (Throwable ignored) {}
}
}
};
new Thread(updater).start();
}
protected int x;
protected int transitTime;
public abstract int getMuzzleVelocity();
public Projectile() {
this.x = 0;
synchronized(activeProjectiles) {
activeProjectiles.add(this);
}
}
public int getFriction() {
return 0;
}
private void travel() {
this.x += this.getMuzzleVelocity() + (this.getFriction() * this.transitTime);
this.transitTime++;
if (this.transitTime * this.getFriction() >= this.getMuzzleVelocity()) {
//this projectile is done
synchronized(activeProjectiles) {
activeProjectiles.remove(this);
}
}
}
}
public class Bullet extends Projectile {
public Bullet() {
super();
}
@Override
public int getMuzzleVelocity() {
return 600;
}
@Override
public int getFriction() {
return 25;
}
}