Wir benötigen eine neue Translation Unit game.cpp. Legen Sie die entsprechende Datei an. Fügen Sie einen weiteren Eintrag in in Makefile ein. Sie kennen die einzelnen Schritte bereits aus dem letzten Kapitel, zur Erinnerung hier nochmal der Link.

Die Spieleinheit oder Game Unit dient dazu alles zu kapseln was mit den logischen Inhalt unseres Spiels zu tun hat. Das Game steuert dann die Grafikeinheit um etwas anzuzeigen. Hier werden wir also beispielsweise die Position des Spielers speichern und verändern wenn der Benutzer Tasten drückt oder die Maus bewegt.

Hier ist die neue Einheit im Detail:

#include "settings.h"
#include "cgmath.h"
#include <iostream>
void graphicsSetViewMatrix(Matrix);
static bool gameKeyState[256] = {};
static Vector3 cameraPosition = {0.0, 0.0, 2.0};
static double cameraYaw = 0;
static double cameraPitch = 0;
double walkSpeed = 1.0;
double mouseSpeed = 1.0;
void gameSetKey(int key, bool state)
{
    gameKeyState[key] = state;
}

void gameSetMouse(double dx, double dy)
{
    double yaw = cameraYaw + dx * 0.001 * mouseSpeed;
    double pitch = cameraPitch + dy * 0.001 * mouseSpeed;
    
    if (pitch < -M_PI_2) pitch = -M_PI_2;
    if (pitch > M_PI_2) pitch = M_PI_2;

    cameraYaw = yaw;
    cameraPitch = pitch;
}
void gameLoad(Settings settings)
{
    mouseSpeed = settings.mouseSpeed;
    walkSpeed = settings.walkSpeed;
}
void gameLoop(double time)
{
    //A=65; S=83; D=68; W=87
    Vector3 movement = {};
    if (gameKeyState[87]) movement.z -= walkSpeed * time;
    if (gameKeyState[83]) movement.z += walkSpeed * time;
    if (gameKeyState[65]) movement.x -= walkSpeed * time;
    if (gameKeyState[68]) movement.x += walkSpeed * time;

    Matrix tMatrix = matrixTranslate(-cameraPosition.x, -cameraPosition.y, -cameraPosition.z);
    Matrix yMatrix = matrixRotateY(cameraYaw);
    Matrix xMatrix = matrixRotateX(cameraPitch);

    movement = matrixVector3Multiply(matrixRotateY(-cameraYaw), movement);
    cameraPosition = vector3Sum(cameraPosition, movement);

    graphicsSetViewMatrix(matrixMultiply(xMatrix, matrixMultiply(yMatrix, tMatrix)));
}
void gameUnload() {}