// Copyright (c) 2008-2023 the Urho3D project // License: MIT #pragma once #include "Sample.h" namespace Urho3D { class Node; class Scene; } class Character; class Touch; /// Moving character example. /// This sample demonstrates: /// - Controlling a humanoid character through physics /// - Driving animations using the AnimationController component /// - Manual control of a bone scene node /// - Implementing 1st and 3rd person cameras, using raycasts to avoid the 3rd person camera clipping into scenery /// - Defining attributes of a custom component so that it can be saved and loaded /// - Using touch inputs/gyroscope for iOS/Android (implemented through an external file) class CharacterDemo : public Sample { URHO3D_OBJECT(CharacterDemo, Sample); public: /// Construct. explicit CharacterDemo(Context* context); /// Destruct. ~CharacterDemo() override; /// Setup after engine initialization and before running the main loop. void Start() override; protected: /// Return XML patch instructions for screen joystick layout for a specific sample app, if any. String GetScreenJoystickPatchString() const override { return "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 1st/3rd" " " " " " " " " " " " " " " " Jump" " " " " " " " " " " " " ""; } private: /// Create static scene content. void CreateScene(); /// Create controllable character. void CreateCharacter(); /// Construct an instruction text to the UI. void CreateInstructions(); /// Subscribe to necessary events. void SubscribeToEvents(); /// Handle application update. Set controls to character. void HandleUpdate(StringHash eventType, VariantMap& eventData); /// Handle application post-update. Update camera position after character has moved. void HandlePostUpdate(StringHash eventType, VariantMap& eventData); /// Touch utility object. SharedPtr touch_; /// The controllable character component. WeakPtr character_; /// First person camera flag. bool firstPerson_; };