在返回该对象之前增加对象中的静态变量

时间:2013-12-16 19:45:15

标签: java android arrays

我有一些代码可以创建称为权重的对象。现在这些权重的子类称为 - WeightSmall,WeightMedium和WeightLarge - 每个都有自己的静态变量onScreen。当添加WeightSmall,WeightMedium或WeightLarge之一时,此变量应该递增,但是这些变量在调用create方法时返回,而不是添加到数组中。我有一个Weight对象数组 - 有没有办法在父类的数组中访问元素的子类类型?

以下是创建权重的代码:

public Weight createWeight() {
    decider = Math.random() * 1;
    // creates rocks randomly with the lowest chance for l, and the highest chance for m
    if (decider <= 0.33) {
        // small weight
        return new WeightSmall(BitmapFactory.decodeResource(getResources(), R.drawable.weight_s), new Random().nextInt(screenWidth), -10);
    } else if (decider <= 0.5 && decider > 0.33) {
        // large weight
        return new WeightLarge(BitmapFactory.decodeResource(getResources(), R.drawable.weight_l), new Random().nextInt(screenWidth), -10);
    } else {
        // medium weight
        return new WeightMedium(BitmapFactory.decodeResource(getResources(), R.drawable.weight_m), new Random().nextInt(screenWidth), -10);
    }
} 

需要发生的事情是WeightSmall让我们说,它需要检查WeightSmalls onScreen变量以查看它是否小于,如果它返回了重量,那么就说3.但是我想不出一种方法来访问WeightSmall的onScreen变量,因为它需要多次创建,我尝试将它们实现到ArrayList中,但它会导致更新方法的复杂化。以下是该类的其余代码(重要):

public void render(Canvas canvas) {
    if (canvas != null) {
        canvas.drawColor(Color.WHITE);
        player.draw(canvas);
        Weight[] weightArray = weights.toArray(new Weight[0]);
        for (Weight weight : weightArray) {
            weight.draw(canvas);
        }
    }
}

// updates the weight's position on the screen and checks collision with the player
public void update() {
    Weight[] weightArray = weights.toArray(new Weight[0]);
    for (Weight weight : weightArray) {
        weight.update();
        if (weight.getBounds().intersect(player.getBounds())) {
            player.setTouched(false);
            Intent gameOverIntent = new Intent(this.getContext(), GameOverActivity.class);
            this.getContext().startActivity(gameOverIntent);
            ((Activity) getContext()).finish();
        }
    }
}

// count down timer spawning weights in every tick
public void timer() {
    if (start == true) {
        if (weightSpawnTimer != null) {
            weightSpawnTimer.cancel();
            weightSpawnTimer = null;
        }
        weightSpawnTimer = new CountDownTimer(30000, 800) {

            public void onTick(long millisUntilFinished) {
                weights.add(createWeight());
            }

            public void onFinish() {
                weightSpawnTimer.start();
            }
        }.start();
    }
}

为了清晰起见编辑:我需要发生的是,在onTick方法中,检查权重的onScreen变量的子类是否为&lt; = 3,如果是,则创建一个新的权重,如果它什么都不做的话。一旦权重出现在屏幕外,就减少这个变量,这样就可以创建该子类的新权重。

2 个答案:

答案 0 :(得分:1)

怎么样?
class WeightSmall {
    public WeightSmall(...) {
        // increment static
    }
}

在创建实例的情况下,让每个类负责增加它自己的数字。

从实例修改static变量通常被认为是不好的做法。少数合法用例通常是某种实例计数。至少当你不倒计时时。

倒计时是故障开始的地方,因为对象确实有一个已定义的开始,但无法保证其结束。您可以在finalize中倒计时 - 即垃圾收集器找到您的实例时 - 但不能保证很快或根本不会发生。使用它来查明屏幕上有多少实例与实际数字相关,但可能完全错误。

因此,如果您想知道屏幕上显示的对象数量,那么一旦负责显示对象的位置让一个对象出现,您就必须主动计算该数字。 因为那个想知道屏幕上有多少个对象的类已经是一个责任,所以它应该跟踪它自己的局部变量中的数字。

使用static属性限制自己只有1个屏幕。如果你让其他地方计算这个数字你不会限制自己。

答案 1 :(得分:0)

静态变量初始化为0,然后在构造函数上将其设为+1