如何在子类构造函数执行后修改变量以实现游戏难度系统?
解决敌人难度系数适配的几种合理方案
你现在的问题是想给不同敌人的属性乘难度系数,但不想用构造后方法(确实,这种方法很容易漏调用,还可能导致对象状态不一致),下面给你几个靠谱的实现思路:
方案1:父类统一处理难度逻辑,子类传递基础属性
把难度系数的计算逻辑放到父类Enemy的构造函数里,子类只需要传递各自的基础属性值,父类负责乘以难度系数后赋值给实例变量。这样既避免了子类重复写难度处理代码,也不用额外调用方法。
修改父类Enemy的构造:
public class Enemy { protected float health; protected float moveSpeed; protected float attackDamage; // 全局难度系数,可以从配置类读取,这里简化为静态变量 private static float difficulty = 1.0f; // 新增接收基础属性的构造方法 public Enemy(Vector pos, float baseHealth, float baseMoveSpeed, float baseAttackDamage) { this.pos = pos; // 父类统一应用难度系数 this.health = baseHealth * difficulty; this.moveSpeed = baseMoveSpeed * difficulty; this.attackDamage = baseAttackDamage * difficulty; } }
子类FastEnemy的构造就可以简化成:
public FastEnemy(Vector pos) { // 传递FastEnemy的基础生命值、移动速度、攻击力 super(pos, 50, 12f, 7f); }
这个方案的优势是逻辑集中,子类只需要关注自己的基础属性,难度变化时只需要修改父类的系数,所有敌人都会自动适配。
方案2:用工厂模式封装敌人创建逻辑
如果不想修改父类构造,可以专门写一个EnemyFactory类,负责创建敌人实例并应用难度系数。构造函数只负责初始化位置等核心状态,属性赋值和难度处理都交给工厂。
示例代码:
public class EnemyFactory { private static float difficulty = 1.0f; public static FastEnemy createFastEnemy(Vector pos) { FastEnemy enemy = new FastEnemy(pos); // 在这里应用难度系数 enemy.health = 50 * difficulty; enemy.moveSpeed = 12f * difficulty; enemy.attackDamage = 7f * difficulty; return enemy; } // 同理可以添加RangedEnemy的创建方法 public static RangedEnemy createRangedEnemy(Vector pos) { RangedEnemy enemy = new RangedEnemy(pos); enemy.health = 80 * difficulty; enemy.moveSpeed = 6f * difficulty; enemy.attackDamage = 10f * difficulty; return enemy; } }
之后创建敌人时,直接调用工厂方法:
FastEnemy fastEnemy = EnemyFactory.createFastEnemy(new Vector(100, 200));
这种方式的好处是把难度逻辑和敌人类解耦,后续如果需要针对不同难度做特殊调整(比如某类敌人在高难度下额外加护盾),直接在工厂里修改即可,不用动敌人的类代码。
方案3:将基础属性定义为子类常量,父类用初始化块处理(可选)
如果坚持要在子类里定义基础属性,可以把基础属性设为子类的静态常量,然后父类用实例初始化块来应用难度系数。不过要注意初始化顺序:父类构造先执行,所以需要确保子类的常量已经加载(静态常量在类加载时就初始化了,所以没问题)。
示例:
public class Enemy { protected float health; protected float moveSpeed; protected float attackDamage; private static float difficulty = 1.0f; public Enemy(Vector pos) { this.pos = pos; } // 实例初始化块,在构造函数执行后运行 { // 父类定义抽象方法,子类实现返回基础属性 this.health = getBaseHealth() * difficulty; this.moveSpeed = getBaseMoveSpeed() * difficulty; this.attackDamage = getBaseAttackDamage() * difficulty; } protected abstract float getBaseHealth(); protected abstract float getBaseMoveSpeed(); protected abstract float getBaseAttackDamage(); } public class FastEnemy extends Enemy { private static final float BASE_HEALTH = 50; private static final float BASE_MOVE_SPEED = 12f; private static final float BASE_ATTACK_DAMAGE = 7f; public FastEnemy(Vector pos) { super(pos); } @Override protected float getBaseHealth() { return BASE_HEALTH; } @Override protected float getBaseMoveSpeed() { return BASE_MOVE_SPEED; } @Override protected float getBaseAttackDamage() { return BASE_ATTACK_DAMAGE; } }
这个方案需要父类定义抽象方法,子类实现,代码量稍大,但好处是基础属性集中在子类,父类统一处理难度。
内容的提问来源于stack exchange,提问作者turke1034
相关产品推荐
相关产品推荐

