Zh/Game initialization: Difference between revisions
< Zh
Jump to navigation
Jump to search
Kalenclark (talk | contribs) m (→Client.cpp 函数) |
Kalenclark (talk | contribs) mNo edit summary |
||
Line 5: | Line 5: | ||
译者注:因个人翻译水平有限以及涉入SDK领域未深,大部分的翻译都尽量在通畅的前提下进行直译,部分内容保留不译是为了文章的连贯性,也希望能有人帮忙完善,我在此感谢你们! | 译者注:因个人翻译水平有限以及涉入SDK领域未深,大部分的翻译都尽量在通畅的前提下进行直译,部分内容保留不译是为了文章的连贯性,也希望能有人帮忙完善,我在此感谢你们! | ||
每个Source引擎游戏和模组的 'ignition circuit' 是一般命名为 '''<code><game>_client.cpp</code>'''的文件。 它包括一些当server.dll被加载,当世界生成或是一个玩家连接等情况调用的scopeless函数 (即不在一个 [[class]](【术语】类) 里面) 它的一个主要目的是为所有连接的客户端创建一个玩家实体。显然,一个项目里只能有一个 game_client.cpp 文件! | |||
== 自定义 <game>_client.cpp == | == 自定义 <game>_client.cpp == | ||
建议自己创建一个 <game>_client. | 建议自己创建一个 <game>_client.cpp文件而不是修改 hl2_client.cpp 或是 hl2mp_client.cpp。定义在该文件的函数是全局函数,所以为了创建你自己的 <game>_client.cpp 文件,你只需复制上述两个文件中的一个并重命名,然后把旧的那个文件exclude for the build. (右击->属性-> from build -- 确定), | ||
== Client.cpp 函数 == | == Client.cpp 函数 == | ||
许多在server中处理的控制台命令等只能作用于一个玩家,比如说改变玩家的模型,在游戏里发送信息或是开启无敌模式等等。 | |||
这些代码为所有游戏以及模组所共享,所以不要把任何game-specific放在这里! | |||
== Game_client.cpp 函数 == | == Game_client.cpp 函数 == | ||
_client. | _client.cpp里的函数实际上是在引擎内被调用,并且像这样的函数必须总是保持一致。 | ||
; <code>void ClientPutInServer()</code> | ; <code>void ClientPutInServer()</code> | ||
Line 23: | Line 23: | ||
: 当一个玩家连接并且分别激活的时候调用。''这些函数定义用于玩家的c++类'' | : 当一个玩家连接并且分别激活的时候调用。''这些函数定义用于玩家的c++类'' | ||
; <code>void respawn()</code> | ; <code>void respawn()</code> | ||
: 当一个玩家死亡的时候由<code>ClientKill()</code>和<code>DeadThink()</code> | : 当一个玩家死亡的时候由<code>ClientKill()</code>和<code>DeadThink()</code>调用。在联机游戏中产生布娃娃,在单人游戏中重新加载最后保存的存档。 | ||
; <code>[[const]] [[char]]* GetGameDescription()</code> | ; <code>[[const]] [[char]]* GetGameDescription()</code> | ||
: 返回. | : 返回 *.dll 文件的描述名 (比如说半条命或者军团要塞2)。 | ||
; <code>[[CBaseEntity]]* FindEntity()</code> | ; <code>[[CBaseEntity]]* FindEntity()</code> | ||
: | : 当 [[!picker]] targetname is invoked. | ||
; <code>void ClientGamePrecache()</code> | ; <code>void ClientGamePrecache()</code> | ||
: 预缓存玩家的函数 {{todo|为什么不使用 <code>CBasePlayer::Precache() 呢?</code>?}} | : 预缓存玩家的函数 {{todo|为什么不使用 <code>CBasePlayer::Precache() 呢?</code>?}} |
Revision as of 08:30, 18 August 2017
译者注:因个人翻译水平有限以及涉入SDK领域未深,大部分的翻译都尽量在通畅的前提下进行直译,部分内容保留不译是为了文章的连贯性,也希望能有人帮忙完善,我在此感谢你们!
每个Source引擎游戏和模组的 'ignition circuit' 是一般命名为 <game>_client.cpp
的文件。 它包括一些当server.dll被加载,当世界生成或是一个玩家连接等情况调用的scopeless函数 (即不在一个 class(【术语】类) 里面) 它的一个主要目的是为所有连接的客户端创建一个玩家实体。显然,一个项目里只能有一个 game_client.cpp 文件!
自定义 <game>_client.cpp
建议自己创建一个 <game>_client.cpp文件而不是修改 hl2_client.cpp 或是 hl2mp_client.cpp。定义在该文件的函数是全局函数,所以为了创建你自己的 <game>_client.cpp 文件,你只需复制上述两个文件中的一个并重命名,然后把旧的那个文件exclude for the build. (右击->属性-> from build -- 确定),
Client.cpp 函数
许多在server中处理的控制台命令等只能作用于一个玩家,比如说改变玩家的模型,在游戏里发送信息或是开启无敌模式等等。 这些代码为所有游戏以及模组所共享,所以不要把任何game-specific放在这里!
Game_client.cpp 函数
_client.cpp里的函数实际上是在引擎内被调用,并且像这样的函数必须总是保持一致。
void ClientPutInServer()
void ClientActive()
- 当一个玩家连接并且分别激活的时候调用。这些函数定义用于玩家的c++类
void respawn()
- 当一个玩家死亡的时候由
ClientKill()
和DeadThink()
调用。在联机游戏中产生布娃娃,在单人游戏中重新加载最后保存的存档。 const char* GetGameDescription()
- 返回 *.dll 文件的描述名 (比如说半条命或者军团要塞2)。
CBaseEntity* FindEntity()
- 当 !picker targetname is invoked.
void ClientGamePrecache()
- 预缓存玩家的函数 待完善: 为什么不使用
CBasePlayer::Precache() 呢?
? void GameStartFrame()
- Entry point for game-specific code that needs to run once per frame. Use with caution.
void InstallGameRules()
- 决定使用哪条游戏规则。使用
CreateGameRulesObject( string ClassName )
命令来达到这种目的。
Game loop
(Adapted from this report by James Gadbury)
CServerGameDLL::GameFrame()
GameStartFrame()
Physics_RunThinkFunctions()
- Runs the main physics simulation loop against所有实体,除了玩家实体。Physics_SimulateEntity(player)
CBasePlayer::PhysicsSimulate()
CBasePlayer::PlayerRunCommand()
-待完善: 它实际上是在引擎内的某处被调用CPlayerMove::RunCommand()
CPlayerMove::StartCommand()
CBasePlayer::PreThink()
CBasePlayer::Think()
CPlayerMove::SetupMove()
- applies a usercmdCGameMovement::PlayerMove()
CGameMovement::FullWalkMove()
CPlayerMove::FinishMove()
CBasePlayer::PostThink()
CPlayerMove::FinishCommand()
IGameSystem::FrameUpdatePostEntityThinkAllSystems()
-待完善: call Think() on all non-player entities?g_pGameRules->EndGameFrame()