字符串很糟糕。举个例子:空字符串("")也是合法的字符串!这很有问题。
你的系统可能不小心删除字符串,但它不会被视为 null。相反,如果实体在运行时获得它没有业务的名称,游戏应该崩溃。
我使用枚举作为实体标识符。要么它有预定义的名称,要么它是 null 并且游戏崩溃。
public enum entityType { PLAYER, OBSTACLE_BOULDER OBSTACLE_LOG, SNIPER_BLUE, BOSS ect..... }
public Entity entityFactory( Main.entityType type, float x, float y )
这使得你的游戏系统在运行时能够正确检查 null 值,例如使用 Objects.requireNonNull,而无需处理错误的负值。
private void systemPlayerBulletMovement(List
Objects.requireNonNull(bulletList, "systemPlayerBulletMovement 需要非空的 bullet 列表");
Objects.requireNonNull(batch, "systemPlayerBulletMovement 需要非空的精灵批处理");
for (int i = 0; i < bulletList.size(); i++) {
Bullet e = bulletList.get(i);
if (isQueuedForRemoval(e)) {
continue;
}
if (!isPlayerBulletType(e)) {
continue;
}
batch.draw(e.animationCells.get(e.animationFrame), e.x, e.y);
if (e.type == entityType.CHARGE_SHOT) {
destroyEnemyBulletOnChargeHit(e, game.enemyBulletList);
}
e.animationDelta();
switch (e.type) {
case entityType.POWERUP_1_SHOT -> utilFunc.bulletMovementPowerUp1(e);
case entityType.POWERUP_2_SHOT -> utilFunc.bulletMovementPowerUp2(e, game.enemyList);
case entityType.POWERUP_3_SHOT -> utilFunc.bulletMovementPowerUp3(e);
case entityType.OPTION_0_SHOT -> utilFunc.bulletMovementPowerUp1(e);
case entityType.CHARGE_SHOT -> utilFunc.bulletMovementPowerUp1(e);
}
if (e.x < -e.animationCells.getFirst().getRegionWidth() ||
e.x > game.gameplayWorldWidth + e.animationCells.getFirst().getRegionWidth() ||
e.y < -e.animationCells.getFirst().getRegionHeight() ||
e.y > game.gameplayWorldHeight + e.animationCells.getFirst().getRegionHeight()) {
releaseFromList(bulletList, i);
}
}
}
游戏开发者应该认真考虑防御性编程。它真的能帮助强制数据的处理方式,防止游戏以非预期的方式运行。
Check out the playtest on [ITCH.IO]
https://moselysoftware.itch.io/rebel-sector
评论 (0)