前面几篇文章用Akka写了HelloWorld和EchoServer,为了更进一步学习Akka,本文将会实现一个很小的RPG游戏服务器:MiniRPG。
游戏逻辑
因为是迷你RPG,所以逻辑很简单。服务器可以处理四种操作:创建玩家、给玩家加经验、升级、查询玩家信息。下面是Player类的代码(Getters和Setters省略):
public class Player {
private int id;
private String name;
private int exp;
private int level;
// Getters & Setters ...
public void addExp(int val) {
exp += val;
}
public void levelUp() {
if (exp > 100) {
exp -= 100;
level++;
}
}
}
消息协议
MiniRPG底层使用TCP协议,消息使用JSON格式。完整的消息格式如下图所示:
前八个字节可以认为是消息头,其中前四个字节是消息ID,后四个字节是JSON字符串长度。其余字节是消息体,也就是UTF8格式编码的JSON字符串。
消息接口
MiniRPG设计了三个接口来表示游戏消息,这三个接口都是Marker接口,里面没有定义任何方法,如下图所示:
MsgRegistry
MiniRPG使用GSON来编码和解码JSON字符串,为了把JSON解析为相应的消息对象,需要一个消息ID和class之间的映射关系。MsgRegistry类便是要建立起这样一个映射关系,下面是它的完整代码:
public class MsgRegistry {
private static final Map<Integer, Class<?>> msgById = new HashMap<>();
private static final Map<Class<?>, Integer> idByMsg = new HashMap<>();
static {
register(1, CreatePlayerReques