玩家游戏状态

玩家游戏状态变化
enum GameState//玩家游戏状态
{
    eGameState_OnlyConnect    = 0,    ///< 仅连接
    eGameState_Login        = 1,    ///< 登录
    eGameState_EnterMap        = 2,    ///< 进入地图
    eGameState_Disconnect    = 3,    ///< 下线
};
1.当libevent收到连接事件的时候
GameChannel::GameChannel()
{
    //...
    m_eGameState = eGameState_OnlyConnect;//客户端仅仅连接
    //...
}
2.客户端点击登录,然后数据库根据名字去查询userinfo,返回密码跟用户匹配,如果相同
void GameChannel::ProcessGetUserInfo(const ShuiHu::UserInfo& User)
{
    if(0 == strncmp(User.m_szUserPwd, m_pUserInfo->m_szUserPwd, MAX_NAME_LEN))
    {
        m_eGameState = eGameState_Login;//玩家状态为登录状态
    }
}
3.等用户登录成功之后服务器会想客户端发送角色表
用户选择角色点击开始,GS收到消息之后根据id从数据库查询角色的详细信息
void GameChannel::ProcessGetActorInfoEx(bool bRet, const ShuiHu::ActorInfoEx& crActorEx)
{
    //...
    //给客户端发送本地玩家信息
    LocPlayerInfo info;
    InitLocalPlayer(rActorEx, info);
    SendCmd(s2c_local_player_info, &info, sizeof(info));
    m_pShare->m_spLog->Logs(eLogLevel_Info, "s2c_local_player_info");

    //放入ShareCenter中
    m_strActorName = rActorEx.GetName();
    m_pShare->AddOnLinePlayer(m_ActorId, m_strActorName, m_nChannelId);

    // 标记已进入地图
    //看来这个是在向客户端发送本地玩家信息,就直接标记成进入地图状态,个人觉得不对
    //因为此时还没有进入地图,进入地图是在客户端发送激活包之后才算真正进入地图
    m_eGameState = eGameState_EnterMap; 

    //序列化ActorInfoEx准备传入MS
    rActorEx.m_nChannelId = m_nChannelId;
    //...
}
4.libevent收到客户端连接断开事件
//...
void GameChannel::OnOffLine()
{
    //未登录或者已离线
    if(m_eGameState == eGameState_OnlyConnect || m_eGameState == eGameState_Disconnect)//此处为什么没有登录状态的判断
        return;

    //玩家断开时才真正删除角色
    for(std::map<int, ShuiHu::ActorInfo>::iterator it = m_mapDelActors.begin(); it != m_mapDelActors.end(); ++it)
    {
        int actID = it->first;
        m_pAsynDBC->DelActor(actID, m_UserId);
        //帮会操作通知删除角色
        m_pShare->m_spGuildOpt->OnActorDelete(actID, safe::mbstowcs(it->second.m_szGuildName));
    }

    //删除在线用户
    m_pShare->DelOnLineUser(m_UserId);

    if(m_eGameState != eGameState_EnterMap) //未登录游戏
        return;

    //通知Map玩家下线
    m_pMap->Gs2MsData(gs2ms_del_player, m_nChannelId, NULL, 0);

    m_eGameState = eGameState_Disconnect;//此时标记玩家下线状态,此时map玩家下线消息已经发送,GS这边还有很多需要处理
}
时间: 2024-10-11 22:15:46

玩家游戏状态的相关文章

UC游戏状态切换

UC游戏共有6种状态,UCGameInstance就是控制游戏在这6种状态之间转换及HUD显示,单机游戏中能引起游戏状态改变的其实不多,用户主动的比如按下ESC键,用户被动的比如被怪杀死进入死亡菜单,或者剧情强制切换 比如,响应玩家 的ESC按键, 比如玩家死亡,显示死亡菜单 都是些极简单的代码,OpenLevel,设置ScreenState状态,以从主菜单进入新游戏为例 这里的OnClicked事件就是按钮新游戏事件的响应,0.1秒后,把主菜单擦掉,然后OpenLevel XiAn,最后,设置

Unity网络多玩家游戏开发教程第1章Unity自带网络功能

Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件,专门提供了对网络功能的支持.但是,大部分开发者第一次接触到的还是Unity自带的网络功能,也就是大家经常说到的Unity Networking API.这些API是借助于组件NetworkView发挥作用的,而它可以简化开发者大量的网络功能编码任务.本文选自<Unity网络多玩家游戏开发教程(大学霸内部资料)> NetworkView组件 在Unity中,NetworkView组件用于处理游戏在网络上

Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局

Android实训案例(八)--单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局 阿法狗让围棋突然就被热议了,鸿洋大神也顺势出了篇五子棋单机游戏的视频,我看到了就像膜拜膜拜,就学习了一下,写篇博客梳理一下自己的思路,加深一下印象 视频链接:http://www.imooc.com/learn/641 一.棋盘 我们一看就知道,我们必须自定义View,这里我们定义一个GameView来做游戏主类,第一步,先测量,我们这里不难知道,五子棋他的棋盘是一个正方形,所以我们需要去测

幸运玩家游戏系统开发软件

类似幸运的玩家游戏APP系统开发找,定制开发Lucky Player幸运玩家平台模式,Lucky Player幸运玩家是什么Lucky Player幸运玩家源码开发公司,Lucky Player幸运玩家app模式定制开发等 DAPP区块链游戏对传统游戏的颠覆,它拥有全新的游戏生态系统,基于区块链上的分布式数据存储,点对点传输共识机制.加密算法等计算机技术的新型应用模式,完全杜绝了传统游戏中存在的币值发行黑箱操作,用户之间不平等以及游戏产业链数据不透明等问题,为不同角色的用户,游戏开发商以及游戏产

球球大作战四亿人都在玩?玩家回归没有优越感,新玩家游戏被虐,游戏体验感极差!

球球大作战,这是一款很火的手游,自己曾经玩了3年的游戏,如今已经厌倦了,所以退游了. 当时任然记得猎魔模式,感觉身边都是人,这游戏身边都有人在玩.后面嘛,由于游戏氛围不太好,合作的人太多,一个人单排这种简直没法玩了,自然卸了. 当初为了棒棒糖,可以没日没夜的玩,可以说是'不择手段',好不容易攒够了棒棒糖,买了一个光环,虽然是比较廉价的,当时自己还是很激动,很开心的,也很心满意足的.当时球球大作战这一款游戏还是很良心的,没有像今天这么多的充值活动,现在的球球大作战怎么感觉越来越向腾讯游戏靠拢了?

如何在游戏客户端和服务器之间精确同步玩家的状态?

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多Unity3D资源.Unity3D培训视频.Unity3D教程.Unity3D常见问题.Unity3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 假定技能有前摇,攻击,后摇3个阶段. 前摇阶段可以理解为发招前的酝酿或者念几句咒语,攻击阶段可以理解为开始挥刀砍直至砍中目标身上这个时间段,后摇阶段可以理解为收刀恢复攻击姿势的阶段. 我们的技能的连招系统允许在某些技能(称为技

JZYZOJ 1385 拉灯游戏 状态压缩 搜索

http://172.20.6.3/Problem_Show.asp?id=1385 刚开始想的时候一直以为同一排不同的拉灯顺序对结果是有影响的,手推了好多遍才发现拉灯结果只和拉的灯有关,这也要打表,可以说非常智障了. 如果从上向下寻找拉的灯,那么每一排全暗主要相关的是下一排(通过下一排补齐)和初始状态,而每一排的初始状态是和其本身和上一排有关的,那么只要找出第一排所有的拉灯方案(2^5种)然后对这几种方案模拟一遍找能全亮且步数最小的方案. 锻炼搜索能力的好题 注意小于6步-交的时候没看见,日常

存档&amp;&amp;解档游戏状态

解档 //AppDelegate.m @synthesize window=_window; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSString* gameArchivePath = [self gameArchivePath]; OneGame* existingGame; @try { existingGa

【Salvation】——人物角色动画实现

写在前面:这个角色动画主要使用JavaScript编写脚本,在Unity3D游戏引擎的环境中实现. 一.显示角色并实现镜像效果 1.显示贴图: create→cube→修改名称为player,位置归0,将sprite换掉cube 把Idle静止贴图,拖放到player的属性编辑器中,把背景去掉,要透明的:shader - unlit/Transparent 把Run动画序列,拖放到player的属性编辑器中,把背景去掉,要透明的:shader-Unlit/Transparent 说明: 通过控制