gameplay理解

Camera视角:确定显示的视场及视角。

Game:显示的基类。静态单例模式。但是获取方式很奇怪。

Game::getInstance得到的是__gameInstance,但是__gameInstance是在Game()构造函数里=this。因此如果没有Game的实例,this就是NULL。

然而使用时,编写继承自Game的子类,如HomuraGame,并且声明HomuraGame的全局变量,这样在加载该so时子类的实例就会创建,同时Game也就会创建。而后调用时Game::getInstance就能得到Game的指针。

这也意味着同一时间只能存在一个Game的实例进行操作。

 1 Game::Game()
 2     : _initialized(false), _state(UNINITIALIZED), _pausedCount(0),
 3       _frameLastFPS(0), _frameCount(0), _frameRate(0), _width(0), _height(0),
 4       _clearDepth(1.0f), _clearStencil(0), _properties(NULL),
 5       _animationController(NULL), _audioController(NULL),
 6       _physicsController(NULL), _aiController(NULL), _audioListener(NULL),
 7       _timeEvents(NULL), _scriptController(NULL), _scriptTarget(NULL)
 8 {
 9     GP_ASSERT(__gameInstance == NULL);
10 
11     __gameInstance = this;
12     _timeEvents = new std::priority_queue<TimeEvent, std::vector<TimeEvent>, std::less<TimeEvent> >();
13 }
14 
15 Game::~Game()
16 {
17     SAFE_DELETE(_scriptTarget);
18     SAFE_DELETE(_scriptController);
19 
20     // Do not call any virtual functions from the destructor.
21     // Finalization is done from outside this class.
22     SAFE_DELETE(_timeEvents);
23 #ifdef GP_USE_MEM_LEAK_DETECTION
24     Ref::printLeaks();
25     printMemoryLeaks();
26 #endif
27 
28     __gameInstance = NULL;
29 }
30 
31 Game* Game::getInstance()
32 {
33     GP_ASSERT(__gameInstance);
34     return __gameInstance;
35 }
 1     /**
 2      * Constructor.
 3      */
 4     Game();
 5 
 6     /**
 7      * Destructor.
 8      */
 9     virtual ~Game();
10 
11     /**
12      * Gets the single instance of the game.
13      * 
14      * @return The single instance of the game.
15      */
16     static Game* getInstance();
 1 #define DISPATCH_EVENT(dispatch, count, eventName, ...) { \
 2     for (int i = 0; i < count; i++) { \
 3         EXECUTE_FUNCTION(dispatch[i], eventName, __VA_ARGS__); \
 4     } \
 5 }
 6 
 7 HomuraGame game;
 8 
 9 HomuraGame::HomuraGame() : mParticleIndex(3), mGraphicsIndex(1), pFont(NULL) {
10     memset(pParticle, 0, MAX_HOMURA_SIZE * sizeof(Homura*));
11     memset(pGraphics, 0, MAX_HOMURA_SIZE * sizeof(Homura*));
12     memset(pPhysical, 0, MAX_HOMURA_SIZE * sizeof(Homura*));
13 }

而后Game的子类中实现了update和render方法,openGL中每次更新都会调用Game的frame方法,而frame方法会调用update及render方法,从而对动画进行更新。

 1 class HomuraGame : public Game {
 2 public:
 3     HomuraGame();
 4 
 5     /**
 6      * @see Game::initialize
 7      */
 8     void initialize();
 9 
10     /**
11      * @see Game::finalize
12      */
13     void finalize();
14 
15     /**
16      * @see Game::update
17      */
18     void update(float elapsedTime);
19 
20     /**
21      * @see Game::render
22      */
23     void render(float elapsedTime);
24 
25     void resizeEvent(unsigned int width, unsigned int height);
26 
27     void keyEvent(Keyboard::KeyEvent evt, int key);
28 
29     void touchEvent(Touch::TouchEvent evt, int x, int y, unsigned int contactIndex);
30 
31     bool mouseEvent(Mouse::MouseEvent evt, int x, int y, int wheelDelta);
32 
33     static HomuraGame* getInstance();

 

转载于:https://www.cnblogs.com/zl1991/p/6907953.html

### UE5 Gameplay 开发教程与资料 #### 多样化的学习资源 对于希望深入理解UE5 Gameplay系统的开发者而言,存在多种优质的学习途径。例如,《玩转UE4/UE5动画系统》这一专栏提供了图文并茂以及视频相结合的教学模式[^1]。该专栏由一位经验丰富的游戏程序员维护,在知乎和优快云平台上均能获取相关内容。 #### 特定功能详解 针对Gameplay Ability System (GAS),有专门的文章进行了阐述,指出`GameplayTags`作为一种分层标签机制被集成到了Unreal Engine内部而非仅仅属于GAS的一部分。这种特性允许设计师更加灵活高效地标记物体的状态或行为,从而超越传统布尔值或枚举类型的局限性[^3]。 #### 实践案例分享 另外还有专注于实际应用的经验交流文章,如一篇有关攀爬系统的系列教程不仅概述了整个项目的实现过程还包含了作者个人的心得体会。这为那些想要了解具体技术细节的人士提供了一个很好的起点[^2]。 #### 命名约定指导 为了帮助团队更好地协作开发大规模项目,官方文档也给出了详细的资产命名指南。遵循这些最佳实践可以帮助减少错误发生率,并提高工作效率。特别是当涉及到多人合作时,统一而清晰的命名规则显得尤为重要[^4]。 #### 关键概念解析 最后值得一提的是关于Level的概念解释,它作为场景内所有Actor实例化后的载体起到了至关重要的作用。尽管LevelScriptActor可用于执行某些特定于当前地图的任务,但从长远来看保持业务逻辑独立于任何单一level之外通常是更好的做法[^5]。 ```cpp // 示例:创建一个新的GameMode类来管理全局游戏设置而不是依赖LevelScriptActor class AMyCustomGameMode : public AGameModeBase { public: void BeginPlay() override; }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值