【发布时间】:2020-12-05 21:04:53
【问题描述】:
我正在开发一款包含不同游戏实体的游戏。它运行良好,但我想在我的代码中去掉一些强制转换操作。例如,当我检查子弹是否击中敌人时,我需要将两个对象都投射到能够根据 damage(子弹的属性)减少 health(敌人的属性)。
我将实体及其对应的类一起存储在地图中。它看起来像这样:
Map<Class<? extends Entity>, List<Entity>> entities;
以下是我在地图中放置、接收和移除实体的方法:
void add(Entity entity) {
Class<? extends Entity> type = entity.getClass();
if (!entities.containsKey(type)) {
entities.put(type, new CopyOnWriteArrayList<>());
}
entities.get(type).add(entity);
}
List<Entity> getAll(Class<? extends Entity> type) {
return entities.getOrDefault(type, Collections.emptyList());
}
void remove(Entity entity) {
getAll(entity.getClass()).remove(entity);
}
最后是我的代码(在游戏循环中运行)来检查子弹是否击中敌人:
for (Entity bullet : data.getAll(Bullet.class)) {
for (Entity enemy : data.getAll(Enemy.class)) {
if (bullet.box.overlaps(enemy.box)) {
// Bullet hits Enemy
Bullet bulletHit = (Bullet) bullet;
Enemy enemyHit = (Enemy) enemy;
enemyHit.health -= bulletHit.damage;
if (enemyHit.health <= 0) {
data.remove(enemyHit);
}
data.remove(bulletHit);
break;
}
}
}
有没有办法避免子弹和敌人的这些施法操作?我正在考虑的一种解决方案是摆脱地图并仅使用这些特定实体类型的许多列表,但这会破坏我的代码。
【问题讨论】:
-
您打算只存储非泛型
Objects 的Lists 吗? -
任何适合我的问题。如果泛型是答案,我会使用它。在您输入后,我正在浏览 Stack Overflow 并找到了这个 (stackoverflow.com/questions/7354740/…)。你怎么看?
-
如果您想give the lastest experiment a run,我已经编辑了您在我的回答的 cmets 中提到的第 45 和 46 行。那么这是否解决了您打算解决的原始问题:“有什么方法可以避免子弹和敌人的这些施法操作?”或者你是死心塌地必须用泛型完成的实现? 99% 的情况下,最简单的设计通常是最“正确”的。
标签: java generics inheritance design-patterns casting