Zh/Game initialization: Difference between revisions

From Valve Developer Community
< Zh
Jump to navigation Jump to search
mNo edit summary
m (Using L template for links)
 
(3 intermediate revisions by 2 users not shown)
Line 3: Line 3:
译者注:因个人翻译水平有限以及涉入SDK领域未深,大部分的翻译都尽量在通畅的前提下进行直译,部分内容保留不译是为了文章的连贯性,也希望能有人帮忙完善,我在此感谢你们!
译者注:因个人翻译水平有限以及涉入SDK领域未深,大部分的翻译都尽量在通畅的前提下进行直译,部分内容保留不译是为了文章的连贯性,也希望能有人帮忙完善,我在此感谢你们!


每个Source引擎游戏和模组的 'ignition circuit' 是一般命名为 '''<code><game>_client.cpp</code>'''的文件。 它包括一些当server.dll被加载,当世界生成或是一个玩家连接等情况调用的scopeless函数 (即不在一个 [[class]](【术语】类) 里面) 它的一个主要目的是为所有连接的客户端创建一个玩家实体。显然,一个项目里只能有一个 game_client.cpp 文件!
每个Source引擎游戏和模组的 'ignition circuit' 是一般命名为 '''<code><game>_client.cpp</code>'''的文件。 它包括一些当server.dll被加载,当世界生成或是一个玩家连接等情况调用的scopeless函数 (即不在一个 {{L|class}}(【术语】类) 里面) 它的一个主要目的是为所有连接的客户端创建一个玩家实体。显然,一个项目里只能有一个 game_client.cpp 文件!


== 自定义 <game>_client.cpp ==
== 自定义 <game>_client.cpp ==
Line 22: Line 22:
; <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>{{L|const}} {{L|char}}* GetGameDescription()</code>
: 返回 *.dll 文件的描述名 (比如说半条命或者军团要塞2)。
: 返回 *.dll 文件的描述名 (比如说半条命或者军团要塞2)。
; <code>[[CBaseEntity]]* FindEntity()</code>
; <code>{{L|CBaseEntity}}* FindEntity()</code>
: 当 [[!picker]] 的目标名被invoke。
: 当 {{L|!picker}} 的目标名被invoke。
; <code>void ClientGamePrecache()</code>
; <code>void ClientGamePrecache()</code>
: 预缓存玩家的函数 {{todo|为什么不使用 <code>CBasePlayer::Precache() 呢?</code>?}}
: 预缓存玩家的函数 {{todo|为什么不使用 <code>CBasePlayer::Precache() 呢?</code>?}}
Line 31: Line 31:
: 每帧需要运行一次的点实体 for game-specific。谨慎使用。
: 每帧需要运行一次的点实体 for game-specific。谨慎使用。
; <code>void InstallGameRules()</code>
; <code>void InstallGameRules()</code>
: 决定使用哪条游戏规则。使用<code>CreateGameRulesObject( [[string]] ClassName )</code>命令来决定。
: 决定使用哪条游戏规则。使用<code>CreateGameRulesObject( {{L|string}} ClassName )</code>命令来决定。


== Game loop ==
== Game loop ==
Line 53: Line 53:
****** <code>CBasePlayer::'''PostThink()'''</code>
****** <code>CBasePlayer::'''PostThink()'''</code>
****** <code>CPlayerMove::'''FinishCommand()'''</code>
****** <code>CPlayerMove::'''FinishCommand()'''</code>
** <code>IGameSystem::'''FrameUpdatePostEntityThinkAllSystems()'''</code> - {{todo|调用 [[Think()]] on所有非玩家实体?}}
** <code>IGameSystem::'''FrameUpdatePostEntityThinkAllSystems()'''</code> - {{todo|调用 {{L|Think()}} on所有非玩家实体?}}
** <code>g_pGameRules->'''EndGameFrame()'''</code>
** <code>g_pGameRules->'''EndGameFrame()'''</code>


[[Category:编程]]
[[Category:编程]]

Latest revision as of 07:57, 11 July 2024

English (en)Deutsch (de)中文 (zh)Translate (Translate)

小作品

This article or section is a stub. You can help by expanding it.

译者注:因个人翻译水平有限以及涉入SDK领域未深,大部分的翻译都尽量在通畅的前提下进行直译,部分内容保留不译是为了文章的连贯性,也希望能有人帮忙完善,我在此感谢你们!

每个Source引擎游戏和模组的 'ignition circuit' 是一般命名为 <game>_client.cpp的文件。 它包括一些当server.dll被加载,当世界生成或是一个玩家连接等情况调用的scopeless函数 (即不在一个 class(en)(【术语】类) 里面) 它的一个主要目的是为所有连接的客户端创建一个玩家实体。显然,一个项目里只能有一个 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(en) char(en)* GetGameDescription()
返回 *.dll 文件的描述名 (比如说半条命或者军团要塞2)。
CBaseEntity(en)* FindEntity()
!picker(en) 的目标名被invoke。
void ClientGamePrecache()
预缓存玩家的函数
待完善: 为什么不使用 CBasePlayer::Precache() 呢??
void GameStartFrame()
每帧需要运行一次的点实体 for game-specific。谨慎使用。
void InstallGameRules()
决定使用哪条游戏规则。使用CreateGameRulesObject( string(en) ClassName )命令来决定。

Game loop

(由 James Gadbury的报告 by James Gadbury) 改写

  • CServerGameDLL::GameFrame()
    • GameStartFrame()
    • Physics_RunThinkFunctions() - Runs主要的物理模拟循环against所有实体,除了玩家实体。
      • Physics_SimulateEntity(player)
        • CBasePlayer::PhysicsSimulate()
        • CBasePlayer::PlayerRunCommand() -
          待完善: 它实际上是在引擎内的某处被调用
          • CPlayerMove::RunCommand()
            • CPlayerMove::StartCommand()
            • CBasePlayer::PreThink()
            • CBasePlayer::Think()
            • CPlayerMove::SetupMove() - applies a usercmd
              • CGameMovement::PlayerMove()
              • CGameMovement::FullWalkMove()
            • CPlayerMove::FinishMove()
            • CBasePlayer::PostThink()
            • CPlayerMove::FinishCommand()
    • IGameSystem::FrameUpdatePostEntityThinkAllSystems() -
      待完善: 调用 Think()(en) on所有非玩家实体?
    • g_pGameRules->EndGameFrame()