Add camera modes

This commit is contained in:
Miloslav Ciz 2025-01-07 20:48:04 +01:00
parent a9f0a6885a
commit 7fb04804e7
3 changed files with 98 additions and 50 deletions

99
game.h
View file

@ -168,8 +168,10 @@ uint8_t LCR_gameGetNextAudioSample(void);
#endif
#endif
#define LCR_CONTROL_MODE_FREECAM 0x00
#define LCR_CONTROL_MODE_DRIVE 0x01
#define LCR_CAMERA_MODE_DRIVE 0x00
#define LCR_CAMERA_MODE_DRIVE2 0x01
#define LCR_CAMERA_MODE_INSIDE 0x02
#define LCR_CAMERA_MODE_FREE 0x03
#define LCR_GAME_STATE_MENU 0x00
#define LCR_GAME_STATE_RUN_STARTING 0x01
@ -194,7 +196,7 @@ struct
uint32_t frame;
uint32_t nextRenderFrameTime;
uint32_t nextRacingTickTime;
uint8_t controlMode;
uint8_t cameraMode;
uint8_t debugDraw;
uint8_t musicOn;
uint8_t keyStates[LCR_KEYS_TOTAL]; /**< Assures unchanging key states
@ -414,7 +416,7 @@ void LCR_gameLoadMainMenuItems(void)
{
for (int i = 0; i < 5; ++i)
{
char replaceChar = i == 0 ? 'X' :
char replaceChar = i == 0 ? '0' + LCR_game.cameraMode :
(i == 1 ? '0' + LCR_game.musicOn : ('0' + LCR_audio.on));
LCR_gameSetMenuItemStr(i,LCR_texts[4 + i],replaceChar);
@ -447,7 +449,7 @@ void LCR_gameInit(void)
LCR_game.musicOn = 1;
LCR_game.nextRenderFrameTime = 0;
LCR_game.nextRacingTickTime = 0;
LCR_game.controlMode = LCR_CONTROL_MODE_DRIVE;
LCR_game.cameraMode = LCR_CAMERA_MODE_DRIVE;
LCR_gameLoadMainMenuItems();
@ -545,8 +547,10 @@ void LCR_gameDraw3DView(void)
LCR_rendererSetCarTransform(carTransform,carTransform + 3);
if (LCR_game.controlMode != LCR_CONTROL_MODE_FREECAM)
LCR_rendererCameraFollow();
if (LCR_game.cameraMode != LCR_CAMERA_MODE_FREE)
LCR_rendererCameraFollow(
(LCR_game.cameraMode != LCR_CAMERA_MODE_INSIDE) +
(LCR_game.cameraMode == LCR_CAMERA_MODE_DRIVE2));
#if LCR_ANIMATE_CAR
LCR_rendererSetWheelState(LCR_racingGetWheelRotation(),
@ -699,6 +703,10 @@ void LCR_gameHandleInput(void)
switch (LCR_game.menuSelectedItem)
{
case 0:
LCR_game.cameraMode = (LCR_game.cameraMode + 1) % 4;
LCR_rendererSetCarVisibility(
LCR_game.cameraMode != LCR_CAMERA_MODE_INSIDE);
LCR_rendererCameraReset();
break;
case 1:
@ -743,6 +751,40 @@ void LCR_gameHandleInput(void)
LCR_gameSetState(LCR_GAME_STATE_MENU);
LCR_game.menuSelectedItem = 0;
}
else if (LCR_game.cameraMode == LCR_CAMERA_MODE_FREE)
{
LCR_GameUnit offsets[5];
for (int i = 0; i < 5; ++i)
offsets[i] = 0;
if (LCR_game.keyStates[LCR_KEY_A])
{
if (LCR_game.keyStates[LCR_KEY_UP])
offsets[4] = LCR_FREE_CAMERA_TURN_STEP;
else if (LCR_game.keyStates[LCR_KEY_DOWN])
offsets[4] -= LCR_FREE_CAMERA_TURN_STEP;
if (LCR_game.keyStates[LCR_KEY_RIGHT])
offsets[3] -= LCR_FREE_CAMERA_TURN_STEP;
else if (LCR_game.keyStates[LCR_KEY_LEFT])
offsets[3] = LCR_FREE_CAMERA_TURN_STEP;
}
else
{
if (LCR_game.keyStates[LCR_KEY_UP])
offsets[0] = LCR_FREE_CAMERA_STEP;
else if (LCR_game.keyStates[LCR_KEY_DOWN])
offsets[0] -= LCR_FREE_CAMERA_STEP;
if (LCR_game.keyStates[LCR_KEY_RIGHT])
offsets[1] = LCR_FREE_CAMERA_STEP;
else if (LCR_game.keyStates[LCR_KEY_LEFT])
offsets[1] -= LCR_FREE_CAMERA_STEP;
}
LCR_rendererMoveCamera(offsets,offsets + 3);
}
else if (LCR_game.keyStates[LCR_KEY_A] == 1)
LCR_gameResetRun();
@ -781,54 +823,23 @@ uint8_t LCR_gameStep(uint32_t time)
LCR_gameHandleInput();
/*
LCR_GameUnit offsets[5];
for (int i = 0; i < 5; ++i)
offsets[i] = 0;
/*
if (LCR_game.controlMode == LCR_CONTROL_MODE_FREECAM)
{
if (LCR_game.keyStates[LCR_KEY_A])
{
if (LCR_game.keyStates[LCR_KEY_UP])
offsets[4] = LCR_FREE_CAMERA_TURN_STEP;
else if (LCR_game.keyStates[LCR_KEY_DOWN])
offsets[4] -= LCR_FREE_CAMERA_TURN_STEP;
if (LCR_game.keyStates[LCR_KEY_RIGHT])
offsets[3] -= LCR_FREE_CAMERA_TURN_STEP;
else if (LCR_game.keyStates[LCR_KEY_LEFT])
offsets[3] = LCR_FREE_CAMERA_TURN_STEP;
}
else
{
if (LCR_game.keyStates[LCR_KEY_UP])
offsets[0] = LCR_FREE_CAMERA_STEP;
else if (LCR_game.keyStates[LCR_KEY_DOWN])
offsets[0] -= LCR_FREE_CAMERA_STEP;
if (LCR_game.keyStates[LCR_KEY_RIGHT])
offsets[1] = LCR_FREE_CAMERA_STEP;
else if (LCR_game.keyStates[LCR_KEY_LEFT])
offsets[1] -= LCR_FREE_CAMERA_STEP;
}
LCR_rendererMoveCamera(offsets,offsets + 3);
}
*/
// handle simulation:
while (time >= LCR_game.nextRacingTickTime)
{
LCR_LOG2("gonna step racing engine");
unsigned int input = 0;
if (LCR_game.controlMode != LCR_CONTROL_MODE_FREECAM)
input =
(LCR_game.keyStates[LCR_KEY_UP] ? LCR_RACING_INPUT_FORW : 0) |
(LCR_game.keyStates[LCR_KEY_RIGHT] ? LCR_RACING_INPUT_RIGHT : 0) |
(LCR_game.keyStates[LCR_KEY_DOWN] ? LCR_RACING_INPUT_BACK : 0) |
(LCR_game.keyStates[LCR_KEY_LEFT] ? LCR_RACING_INPUT_LEFT : 0);
unsigned int input = LCR_game.cameraMode == LCR_CAMERA_MODE_FREE ? 0 :
((LCR_game.keyStates[LCR_KEY_UP] ? LCR_RACING_INPUT_FORW : 0) |
(LCR_game.keyStates[LCR_KEY_RIGHT] ? LCR_RACING_INPUT_RIGHT : 0) |
(LCR_game.keyStates[LCR_KEY_DOWN] ? LCR_RACING_INPUT_BACK : 0) |
(LCR_game.keyStates[LCR_KEY_LEFT] ? LCR_RACING_INPUT_LEFT : 0));
uint32_t events = paused ? 0 : LCR_racingStep(input);