游戏上下文的一种实现方式

发布时间:2023年12月24日

背景:

上下文设计模式用的非常之多。

比如:属性系统,每个人都有自己的属性培养。

战斗系统:需要达到一定的条件触发某个东西。

AI系统:达到某个条件触发某个行为。

技能系统:比如:LOL中派克的R,达到血量后,直接斩杀。

这里主要是战斗系统为例子。

--------------------------

还有一点感受就是:看别人的代码写的再清晰简单,如果自己不亲自写一遍,那么依然是麻瓜,所以,一定要仿写demo,然后到实际项目中,再逐步优化。

1)上下文

IContext.java?

笔记: 这里以:Player为例子,实际可能还有怪物,Boss等,他们的属性不一样,我们可以把接口都写到里面,然后在枚举里面再进行分类也行。

package org.example.context.context;

/**
 * 上下文对象的封装
 */
public interface IContext {
    default int getAge() {
        return 0;
    }

    default int getScore() {
        return 0;
    }

    default String getName() {
        return "";
    }
}

Player.java

package org.example.context.context;

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class Player implements IContext {
    private int age;
    private int score;
    private String name;

    @Override
    public int getAge() {
        return age;
    }

    @Override
    public int getScore() {
        return score;
    }

    @Override
    public String getName() {
        return name;
    }
}

2)条件

ICondition.java

package org.example.context.conditions;

import org.example.context.context.IContext;

public interface ICondition {
    boolean check(IContext context);
}

ECondition.java

package org.example.context.conditions;

import lombok.Getter;

@Getter
public enum ECondition {
    CHENG_REN(1, new AgeCondition(), ">18岁"),
    NAME_CONTAION_ZHAO(2, new NameCondition(), "名字含有赵"),
    SCORE_JIGE(3, new ScoreCondition(), "成绩大于60分"),
    ;

    private int type;
    private ICondition condition;
    private String desc;

    ECondition(int type, ICondition condition, String desc) {
        this.type = type;
        this.condition = condition;
        this.desc = desc;
    }
}

AgeConditon.java

package org.example.context.conditions;

import org.example.context.context.IContext;

public class AgeCondition implements ICondition{
    @Override
    public boolean check(IContext context) {
        return context.getAge() >= 18;
    }
}

NameConditon.java

package org.example.context.conditions;

import org.example.context.context.IContext;

public class NameCondition implements ICondition {
    @Override
    public boolean check(IContext context) {
        return context.getName().contains("赵");
    }
}

ScoreCondition.java

package org.example.context.conditions;

import org.example.context.context.IContext;

public class ScoreCondition implements ICondition {

    @Override
    public boolean check(IContext context) {
        return context.getScore() > 60;
    }
}

测试:

package org.example.context;

import com.google.common.collect.Lists;
import org.example.context.conditions.ECondition;
import org.example.context.context.IContext;
import org.example.context.context.Player;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        IContext context1 = new Player(30, 80, "张三");
        IContext context2 = new Player(18, 10, "赵紫龙");
        IContext context3 = new Player(5, 70, "李冰冰");

        List<IContext> list = Lists.newArrayList(context1, context2, context3);


        for (IContext context : list) {
            for (ECondition eCondition : ECondition.values()) {
                boolean check = eCondition.getCondition().check(context);
                System.out.println(eCondition.getDesc() + ":" + check);
            }

            System.out.println("----------------");
        }
    }
}

/*
>18岁:true
名字含有赵:false
成绩大于60分:true
----------------
>18岁:true
名字含有赵:true
成绩大于60分:false
----------------
>18岁:false
名字含有赵:false
成绩大于60分:true
----------------
 */

文章来源:https://blog.csdn.net/themagickeyjianan/article/details/135180712
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。