当前位置:首页 > 开发笔记 > 正文内容

【开发笔记】创胜系列增加游戏开局确认(自动准备和非自动准备)功能

jiaweisi1个月前 (12-05)开发笔记105

【开发笔记】

只记录逻辑分析和注意的地方,其他简单的不做记录。


逻辑分析:

1。俱乐部设置增加开局确认数据保存到数据库

2。创建房间后发送发送的房间数据带上开局联盟设置的参数

3。进入联盟时查询房间列表时要带上参数


1  2两个问题好解决,需要注意的是第三个问题。第三个问题有两个地方,是分别是联盟和俱乐部,似乎是两种不同的请求。因为定制的俱乐部,联盟没去仔细看。代码猜测是联盟反向注册到协调服务器的时候带上参数,这种方式会比较简单,修改量比较少。


俱乐部却不是这里,俱乐部是全局的:

CGlobalInfoManager::CreateRoom

这个函数,最好的就是对这个函数传入的时候多添加一个参数进去,然后存储数据的时候一起保存起来,然后再进入俱乐部查询房间的地方为每个房间添加这个参数,前端 UI根据这个参数是否显示开局确认提示标志。


联盟查询房间列表是:

CAttemperEngineSink::OnTCPNetworkMainClubService

这个函数中的:

//查询现有房间
		std::vector<tagRoomTableStatus*> vRoomTableStatus;
		m_GlobalInfoManager.EnumRoomTable(vRoomTableStatus, 0, pEnterClub->dwClubID, 0);
		for (WORD i = 0; i < vRoomTableStatus.size(); i++)
		{
			tagRoomTableStatus*pTableStatus = vRoomTableStatus[i];
			ServerRoomInfo * pTableInfo = (ServerRoomInfo *)(szBuff + wHeadSize + pRoomInfo->wRoomCnt*wTagSize);

			CopyServerRoomInfor(pTableInfo, pTableStatus);
			pTableInfo->dwkaijuqr = pTableStatus->dwkaijuqr;     //开局确认
			for (int j = 0; j < MAX_CHAIR; j++)
			{
				if (pTableStatus->dwUserID[j] != 0) pTableInfo->byPlayerCnt++;
			}
			pRoomInfo->wRoomCnt++;
			if ((pRoomInfo->wRoomCnt + 1) * wTagSize > 16000) break;
		}

这段代码可以看出是由:

m_GlobalInfoManager.EnumRoomTable

这个函数权举循环查询后将数据传入变量vRoomTableStatus这个的。而查看CopyServerRoomInfor函数可以看到代码中:

tagRoomTableStatus * CGlobalInfoManager::EnumRoomTable(std::vector<tagRoomTableStatus*> &vRoomTableStatus, DWORD dwUserID, DWORD dwClubID, DWORD dwLeagueID)
{
	vRoomTableStatus.clear();
	tagRoomTableStatus * pTableStatus = NULL;

	for (auto it : m_MapRoomNum)
	{
		pTableStatus = it.second;
		if (pTableStatus == NULL) break;
		if (pTableStatus->dwApplyTime != 0) continue;
		if (dwUserID != 0 && pTableStatus->dwPayUserID != dwUserID) continue;
		if (dwLeagueID != 0) { if (pTableStatus->dwLeagueID != dwLeagueID) continue; }
		else if (dwClubID != 0 && pTableStatus->dwClubID != dwClubID) continue;
		vRoomTableStatus.push_back(pTableStatus);
	}
	return NULL;
}

是循环的变量m_MapRoomNum。这里注意了,m_MapRoomNum这个变量全文件搜索有两个地方在存入数据,是不一样的。。。

由于是开发的俱乐部模式,所以用函数:

tagRoomTableStatus * CGlobalInfoManager::CreateRoom

这个函数传入变量新增个开局确认的变量就行,比如我的代码:

tagRoomTableStatus * CGlobalInfoManager::CreateRoom(DWORD dwUserID, DWORD dwPayUserID, WORD wKindID, DWORD dwClubID, DWORD dwLeagueID, DWORD dwServerRules, DWORD dwkaijuqr)
{	
	//新建房间号
	DWORD dwRoomID = PRIME_ROOM;
	if ( dwClubID != 0 ) dwRoomID = CLUB_ROOM;
	if ( dwLeagueID != 0 ) dwRoomID = LEAGUE_ROOM;
	dwRoomID = GetNewRoomNum( dwRoomID );
	if ( dwRoomID == 0 || wKindID == 0 ) return NULL;

	RoomTableStateArray * pArr = SearchRoomArr( wKindID );
	if ( pArr == NULL ) return NULL;
	BYTE byScoreRoom = 0;//房卡成绩
	if ( dwServerRules & SERVER_RULES_SCORE ) byScoreRoom = 1;//房卡积分
	if ( dwServerRules & SERVER_RULES_GOLD ) byScoreRoom = 2;//房卡金币
	if (dwServerRules & GAME_GENRE_ROOM_GOLD) byScoreRoom = 3;//房卡积分
	if (dwServerRules & SERVER_RULES_100SCORE) byScoreRoom = 4;//房卡积分
	if (dwServerRules & SERVER_RULES_100GOLD) byScoreRoom = 5;//房卡金币

	for ( int i = 0; i < pArr->GetCount(); i++ )
	{
		tagRoomTableStatus * pTableStatus = &pArr->GetAt( i );
		if ( pTableStatus->dwRoomID != 0 ) continue; //过滤已开房间
		if ( pTableStatus->byScoreServer != byScoreRoom ) continue;//过滤服务器类型

		//初始化数据
		pTableStatus->dwRoomID = dwRoomID;
		pTableStatus->dwCreaterID = dwUserID;
		pTableStatus->dwServerRules = dwServerRules;
		pTableStatus->dwClubID = dwClubID;
		pTableStatus->dwLeagueID = dwLeagueID;
		pTableStatus->wProgress = 0;
		pTableStatus->byPartID = 0;
		pTableStatus->dwCreatTime = 0;
		pTableStatus->dwApplyTime = ( DWORD ) time( NULL );
		pTableStatus->lRoomCard = 0;
		pTableStatus->wAndroidCnt = 0;
		pTableStatus->dwkaijuqr = dwkaijuqr;
		pTableStatus->byCardType = ( dwServerRules & SERVER_RULES_AA ) ? 1 : 0;
		pTableStatus->dwPayUserID = /*pTableStatus->byCardType ? 0 :*/ dwPayUserID;
		ZeroMemory( pTableStatus->dwRules, sizeof( pTableStatus->dwRules ) );
		ZeroMemory( pTableStatus->dwUserID, sizeof( pTableStatus->dwUserID ) );
		//房号索引
		m_MapRoomNum[dwRoomID] = pTableStatus;
		return pTableStatus;
	}

	return NULL;
}

最厚一个参数就是开掘确认参数。而且这个函数的调用是在:

 CAttemperEngineSink::OnDBPCCreatRoomRes

这个函数中。也就是在发送目标服务器的时候带上参数就行。


好了,其他就很简单了就不写了,只记录方便自己下次使用。确实你开发的时候遇到了,也没看懂那么可以留言,大家一起研究解决哈


如果是联盟的话可以关注这个函数:

tagRoomTableStatus * CGlobalInfoManager::UpdateRoom

这个函数是反向注册协调哪里传入应该。具体我没研究,因为用不到。反正我是最开始没注意,走了很多弯路哈哈

返回列表

上一篇:Telegram账号又被封了。。。

没有最新的文章了...

相关文章

uniapp开发抖音小程序监听键盘弹起keyboardheightchange,并获取键盘高度

uniapp开发抖音小程序监听键盘弹起keyboardheightchange,并获取键盘高度

今天用 Uniapp 开发抖音小程序,有个核心需求:点击输入框时,键盘弹起后能自动 “顶起” 输入框,避免输入框被键盘遮挡。这就需要实时监听到键盘高度,再把高度设给输入框的样式 —— 说起来简单,实操时却踩了不少坑。一开始想当然用了 Uniapp 的onKeyBoardHeightChange API,结果在抖音端根本没反应。查了下才知道,抖音小程序压根不支持这个接口,白忙活一场。接着问 AI,得到的答案翻来覆去还是叫我用onKeyBoardHeightChange,看来它也没吃透抖音的特性。没办法,只能自己啃抖音小程序文档,还真发现 input 组件有个bindkeyboardheightchange事件,专门用来监听键盘高度变化 —— 本以为找到救星,结果直接用上去,事件死活不触发,又卡壳了。那阵子真有点想放弃,去 GitHub 和 Uniapp 插件市场翻了个遍,也没找到能直接获取抖音键盘高度的第三方库。最后抱着死马当活马医的心态,试了试在绑定bindkeyboardheightchange时,配合this.$nextTick延迟初始化 —— 没想到,成了!关键代码(templa...

VS2022 编译的程序依赖的 VC 运行库 DLL 怎么手动提取随程序打包这样让没有安装的电脑也能运行?

VS2022 编译的程序依赖的 VC 运行库 DLL 怎么手动提取随程序打包这样让没有安装的电脑也能运行?

VS2022 编译的程序依赖的 VC 运行库 DLL 怎么手动提取随程序打包这样让没有安装的电脑也能运行?在 VS2022 中手动提取并打包程序依赖的 VC 运行库 DLL,让未安装 vc_redist.x64.exe 的电脑也能运行程序,可按以下 4 个步骤 操作,每一步都有明确的操作指引:步骤 1:确定程序依赖的 VC 运行库 DLL(关键!避免盲目复制)首先需要明确你的程序具体依赖哪些 VC 运行库 DLL(不同程序依赖可能不同,比如是否包含 VCRUNTIME140_1.dll 等)。推荐用 VS 自带的 dumpbin 工具 精准查询:操作步骤:1、打开 VS2022 开发人员命令提示符:按下 Win + S,搜索 “Developer Command Prompt for VS 2022”,右键 “以管理员身份运行”(确保权限足够)。2、定位到你的程序 .exe 所在目录:用 cd 命令切换路径,例如:cd C:\你的程序输出目录\Release  # 假设程序在 Release 文件夹下3、执行命令查看依赖的 D...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。