How to enable a game controller

Aside from using the keyboard and mouse, you can also use a game controller. Currently, the game controller supported by the Untold Engine is the Steelseries Nimbus controller.

For your convienience, the Untold Engine provides several files that you can use as a reference. Two of these files that you should refer to while enabling the game controller are:

  • GameViewController.mm

  • GamePadController.mm

To enable the controller, set the following method to true in the viewDidLoad method in the GameViewController file:

//If using the keyboard, then set it to false. If using a controller then set it to true
director->setGamePadControllerPresent(true);

The GamePadController class will be enabled once the engine detects the controller. This class will notify the engine whenever you press a button or move the joystick.

The snippet below shows how you can rotate a character by moving the joystick.

//...other actions here

// Action detected on mouse

case U4DEngine::padRightThumbstick:

        if(controllerInputMessage.inputElementAction==U4DEngine::padThumbstickMoved){

           //Get the joystick position/directions

           U4DEngine::U4DVector3n joystickDirection(controllerInputMessage.joystickDirection.x,controllerInputMessage.joystickDirection.y,0.0);

            //The following snippet will determine which way to rotate the model depending on the motion of the thumbstick
            float joystickMovMagnitude=joystickDirection.magnitude();

            joystickDirection.normalize();

            U4DEngine::U4DVector3n axis;

            U4DEngine::U4DVector3n upVector(0.0,1.0,0.0);
            U4DEngine::U4DVector3n xVector(1.0,0.0,0.0);

            //get the dot product
            float upDot, xDot;

            upDot=joystickDirection.dot(upVector);
            xDot=joystickDirection.dot(xVector);

            U4DEngine::U4DVector3n v=pPlayer->getViewInDirection();
            v.normalize();


                //if direction is closest to upvector
                if(std::abs(upDot)>=std::abs(xDot)){
                    //rotate about x axis

//                            if(upDot>0.0){
//
//                                axis=v.cross(upVector);
//
//                            }else{
//                                axis=v.cross(upVector)*-1.0;
//
//                            }
                }else{

                    //rotate about y axis
                    if(xDot>0.0){

                        axis=upVector;

                    }else{

                        axis=upVector*-1.0;
                    }

                }


                //Once we know the angle and axis of rotation, we can rotate the model using interpolation as shown below
                float angle=1.0*joystickMovMagnitude;

                float biasAngleAccumulator=0.90;

                angleAccumulator=angleAccumulator*biasAngleAccumulator+angle*(1.0-biasAngleAccumulator);

                U4DEngine::U4DQuaternion newOrientation(angleAccumulator,axis);

                U4DEngine::U4DQuaternion modelOrientation=pPlayer->getAbsoluteSpaceOrientation();

                U4DEngine::U4DQuaternion p=modelOrientation.slerp(newOrientation,1.0);

                pPlayer->rotateBy(p);

       }else if (controllerInputMessage.inputElementAction==U4DEngine::padThumbstickReleased){




       }

    break;

Last updated