我正在尝试制作游戏,对于枪支类,我需要每个子弹都是构造函数对象,如何一次编辑每个构造函数?比如改变每个子弹的 x 值?
问问题
4330 次
4 回答
1
让我做出一个艰难的猜测。
class Gun{
Bullet bullet;
public Gun(){
bullet = new Bullet();
}
}
class Bullet{
public int x=0;
public Bullet(){
x=10;
}
}
您想一次更改所有 Bullet 的 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;
}
希望这可以帮助。
于 2012-06-23T02:14:12.437 回答
0
我认为您误解了构造函数的目的。当创建一个类的实例时调用构造函数,并且通常初始化该单个实例的属性。如果要更改对象的所有实例的值,则必须将引用存储在数组(或其他类似的数据结构)中,然后遍历它们并单独更改每个值。
于 2012-06-23T01:05:44.900 回答
0
没有对项目符号的迭代。不,不,一百万次,不。 封装的值,x
因此您只需进行一次更改。这是一个简单的代码示例,说明了您应该考虑的设计模式。谷歌“发布-订阅模式”或“观察者模式”以获得完整的想法。
public class Bullet {
public static int globalEffect = 0;
private int myX;
public int x() {
return myX + globalEffect;
}
}
于 2012-06-23T02:19:36.170 回答
-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;
}
}
于 2012-06-23T02:23:02.817 回答