我有一些代码可以创建称为权重的对象。现在这些权重的子类称为 - 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,如果是,则创建一个新的权重,如果它什么都不做的话。一旦权重出现在屏幕外,就减少这个变量,这样就可以创建该子类的新权重。
答案 0 :(得分:1)
怎么样?
class WeightSmall {
public WeightSmall(...) {
// increment static
}
}
在创建实例的情况下,让每个类负责增加它自己的数字。
从实例修改static
变量通常被认为是不好的做法。少数合法用例通常是某种实例计数。至少当你不倒计时时。
倒计时是故障开始的地方,因为对象确实有一个已定义的开始,但无法保证其结束。您可以在finalize
中倒计时 - 即垃圾收集器找到您的实例时 - 但不能保证很快或根本不会发生。使用它来查明屏幕上有多少实例与实际数字相关,但可能完全错误。
因此,如果您想知道屏幕上显示的对象数量,那么一旦负责显示对象的位置让一个对象出现,您就必须主动计算该数字。 因为那个想知道屏幕上有多少个对象的类已经是一个责任,所以它应该跟踪它自己的局部变量中的数字。
使用static
属性限制自己只有1个屏幕。如果你让其他地方计算这个数字你不会限制自己。
答案 1 :(得分:0)
静态变量初始化为0,然后在构造函数上将其设为+1