Netty入门之游戏开发 Protobuf消息应用

本文介绍了使用Netty和Protobuf在游戏开发中的应用,通过实例展示了如何实现客户端英雄移动的实时同步。内容包括:1. Protobuf消息协议的定义;2. 编写解码器(decoder)、游戏消息处理器(GameMsgHandler)和编码器(encoder);3. 注意事项,强调在编写handler时区分消息类型,避免状态错误。文章最后提到,随着业务增长,需要优化架构以减少大量else if的情况。
摘要由CSDN通过智能技术生成

首先来看看需要完成的游戏效果,两个客户端都可以移动,其他客户端也实时可见,刷新那一方刷新两个英雄都回归原点(bug),另一方还在连接的那一方正常。
在这里插入图片描述
网页浏览地址

http://cdn0001.afrxvk.cn/hero_story/demo/step010/index.html?serverAddr=127.0.0.1:11234&userId=2

GameMsgProtocol.proto

syntax = "proto3";

package msg;
option java_package = "org.tinygame.herostory.msg";

// 消息代号
enum MsgCode {
   
    USER_ENTRY_CMD = 0;
    USER_ENTRY_RESULT = 1;
    WHO_ELSE_IS_HERE_CMD = 2;
    WHO_ELSE_IS_HERE_RESULT = 3;
    USER_MOVE_TO_CMD = 4;
    USER_MOVE_TO_RESULT = 5;
    USER_QUIT_RESULT = 6;
    USER_STOP_CMD = 7;
    USER_STOP_RESULT = 8;
    USER_ATTK_CMD = 9;
    USER_ATTK_RESULT = 10;
    USER_SUBTRACT_HP_RESULT = 11;
    USER_DIE_RESULT = 12;
};

// 
// 用户入场
///
// 指令
message UserEntryCmd {
   
    // 用户 Id
    uint32 userId = 1;
    // 英雄形象
    string heroAvatar = 2;
}

// 结果
message UserEntryResult {
   
    // 用户 Id
    uint32 userId = 1;
    // 英雄形象
    string heroAvatar = 2;
}

//
// 还有谁在场
///
// 指令
message WhoElseIsHereCmd {
   
}

// 结果
message WhoElseIsHereResult {
   
    // 用户信息数组
    repeated UserInfo userInfo = 1;

    // 用户信息
    message UserInfo {
   
        // 用户 Id
        uint32 userId = 1;
        // 英雄形象
        string heroAvatar = 2;
    }
}

// 
// 用户移动
///
// 指令
message UserMoveToCmd {
   
    // 
    // XXX 注意: 用户移动指令中没有用户 Id,
    // 这是为什么?
    // 
    // 移动到位置 X
    float moveToPosX = 1;
    // 移动到位置 Y
    float moveToPosY = 2;
}

// 结果
message UserMoveToResult {
   
    // 移动用户 Id
    uint32 moveUserId = 1;
    // 移动到位置 X
    float moveToPosX = 2;
    // 移动到位置 Y
    float moveToPosY = 3;
}

// 
// 用户退场
///
// 
// XXX 注意: 用户退场不需要指令, 因为是在断开服务器的时候执行
// 
// 结果
message UserQuitResult {
   
    // 退出用户 Id
    uint32 quitUserId = 1;
}

//
// 用户停驻
///
// 指令
message UserStopCmd {
   
}

// 结果
message UserStopResult {
   
    // 停驻用户 Id
    uint32 stopUserId = 1;
    // 停驻在位置 X
    float stopAtPosX = 2;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值