ゲームの簡単なスキルシステムを書いているときに、小さな問題に遭遇しました。私のシステムの基本的な規則では、注釈を使用して、スキルまたは能力が事前定義されたすべての要件を満たしているかどうかを定義していますが、拡張可能である必要があります。
これを行うために、インターフェイスを使用してEnumクラスを実装し、その中のEnumに注釈を付けて基本情報を収集しました。これにより、他のクラスに配置してそのスキルを「トレーニング」する必要があるかどうかを確認できる別の注釈を作成する能力が制限されることがわかりました。
何かのようなもの:
public enum AthleticSkills implements AnnotatedSkill {
@Skill(name = "Jump", base = Agility.class, trained = true)
JUMP(public void use(){})
}
この列挙型は、StrengthSkillsなどの任意の数のスキルタイプにすることができ、すべてAnnotatedSkillとインターフェイスします。これにより、メソッドとパラメーター内でAnnoatedSkillのタイプを定義できますが、次のようなことをしたいと思いました。
public @interface TrainedSkill {
AnnotatedSkill[] value();
}
訓練されたスキルはに保持されますSet<AnnotatedSkill>
。
私はこれが不可能であることを知っていますが、私は自分が設定した慣習を守りたかったのです。必要に応じてスキルの設定方法を再定義したいと思いますが、これと同じように機能させる方法があれば、私は最も素晴らしいと思います。
これがどのように使用されるかについてのもう少しの説明:
スキルはシンプルで、誰もが持っていて(古いDNDスキルを考えてください)、誰もがそれらを使用できます。彼らは、効果を調整するための統計クラスであるクラス(Agility.class、Strength.classなど)を使用します。これに加えて、スキルを1ショットでトレーニングする機能があります。これはSet<AnnotatedSkill>
、プレーヤーオブジェクト内に追加されます。これは、スキルを使用するときに追加の修飾子を取得することを意味します。
ENUM内のuse()メソッドは、アノテーションのトレーニング済み修飾子が設定されているかどうかに基づいて使用できます。trueの場合は、スキルがトレーニングされている場合にのみ使用でき、falseの場合は、誰でも使用できます。
スキルをトレーニングできる人を制限したい場合に追加できる別のアノテーション(@Requirements)もあります。これにより、トレーニング/使用をクラス/レースなどに制限できます。
これは、スキル/クラス/レースなどのフレームワークに分類されると思います。
次のように想定します。
@Types(types = {EffectTypes.BUFF, EffectTypes.HEALTH, EffectTypes.HEAL})
@Requirements(
abilities = {
@RequireAbility(required = TimedHealAbility.class)})
@TrainedSkill(AthleticSkills.JUMP)
public class TimedHealEffect extends EffectComponent {}
この効果は、@requirementsの要件を満たしている場合に、AthleticSkills.JUMPをトレーニングした場合にのみ発生します。
訓練されたスキルの追跡:
public class SkillTracking {
private Set<AnnotatedSkill> trainedSkills = Collections.newSetFromMap(new ConcurrentHashMap<AnnotatedSkill, Boolean>());
public void addSkill(AnnotatedSkill skill) {
trainedSkills.add(skill);
}
public boolean removeSkill(AnnotatedSkill skill) {
return trainedSkills.remove(skill);
}
public boolean hasSkill(AnnotatedSkill skill) {
return trainedSkills.contains(skill);
}
}