mirror of
https://gitlab.com/drummyfish/anarch.git
synced 2025-01-02 17:28:08 -05:00
Player movement
This commit is contained in:
parent
17f4da5714
commit
be55322fe8
10
constants.h
10
constants.h
@ -4,12 +4,18 @@
|
|||||||
/**
|
/**
|
||||||
How quickly player turns left/right, in degrees per second.
|
How quickly player turns left/right, in degrees per second.
|
||||||
*/
|
*/
|
||||||
#define SFG_PLAYER_TURN_SPEED 180
|
#define SFG_PLAYER_TURN_SPEED 210
|
||||||
|
|
||||||
/**
|
/**
|
||||||
How quickly player moves, in squares per second.
|
How quickly player moves, in squares per second.
|
||||||
*/
|
*/
|
||||||
#define SFG_PLAYER_MOVE_SPEED 5
|
#define SFG_PLAYER_MOVE_SPEED 10
|
||||||
|
|
||||||
|
/**
|
||||||
|
Gravity acceleration in squares / (second^2).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SFG_GRAVITY_ACCELERATION 30
|
||||||
|
|
||||||
/**
|
/**
|
||||||
How quickly elevators and squeezers move, in RCL_Unit per second.
|
How quickly elevators and squeezers move, in RCL_Unit per second.
|
||||||
|
132
main.c
132
main.c
@ -62,13 +62,20 @@ void SFG_init();
|
|||||||
|
|
||||||
#define SFG_PLAYER_TURN_UNITS_PER_FRAME\
|
#define SFG_PLAYER_TURN_UNITS_PER_FRAME\
|
||||||
((SFG_PLAYER_TURN_SPEED * RCL_UNITS_PER_SQUARE) / (360 * SFG_FPS))
|
((SFG_PLAYER_TURN_SPEED * RCL_UNITS_PER_SQUARE) / (360 * SFG_FPS))
|
||||||
|
// TODO: ^ if zero, set to 1?
|
||||||
|
|
||||||
#define SFG_PLAYER_MOVE_UNITS_PER_FRAME\
|
#define SFG_PLAYER_MOVE_UNITS_PER_FRAME\
|
||||||
((SFG_PLAYER_MOVE_SPEED * RCL_UNITS_PER_SQUARE) / SFG_FPS)
|
((SFG_PLAYER_MOVE_SPEED * RCL_UNITS_PER_SQUARE) / SFG_FPS)
|
||||||
|
|
||||||
|
#define SFG_GRAVITY_SPEED_INCREASE_PER_FRAME\
|
||||||
|
((SFG_GRAVITY_ACCELERATION * RCL_UNITS_PER_SQUARE) / (SFG_FPS * SFG_FPS))
|
||||||
|
|
||||||
#define RCL_PIXEL_FUNCTION SFG_pixelFunc
|
#define RCL_PIXEL_FUNCTION SFG_pixelFunc
|
||||||
#define RCL_TEXTURE_VERTICAL_STRETCH 0
|
#define RCL_TEXTURE_VERTICAL_STRETCH 0
|
||||||
|
|
||||||
|
#define RCL_CAMERA_COLL_HEIGHT_BELOW 800
|
||||||
|
#define RCL_CAMERA_COLL_HEIGHT_ABOVE 100
|
||||||
|
|
||||||
#include "raycastlib.h"
|
#include "raycastlib.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -79,12 +86,45 @@ void SFG_init();
|
|||||||
#define SFG_CEILING_MAX_HEIGHT\
|
#define SFG_CEILING_MAX_HEIGHT\
|
||||||
(16 * RCL_UNITS_PER_SQUARE - RCL_UNITS_PER_SQUARE / 2 )
|
(16 * RCL_UNITS_PER_SQUARE - RCL_UNITS_PER_SQUARE / 2 )
|
||||||
|
|
||||||
RCL_Camera SFG_camera;
|
int8_t SFG_backgroundScaleMap[SFG_RESOLUTION_Y];
|
||||||
RCL_RayConstraints SFG_rayConstraints;
|
|
||||||
|
|
||||||
uint8_t SFG_backgroundScaleMap[SFG_RESOLUTION_Y];
|
|
||||||
uint16_t SFG_backgroundScroll;
|
uint16_t SFG_backgroundScroll;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
RCL_Camera camera;
|
||||||
|
RCL_Vector2D direction;
|
||||||
|
RCL_Unit verticalSpeed;
|
||||||
|
} SFG_player;
|
||||||
|
|
||||||
|
void SFG_recompurePLayerDirection()
|
||||||
|
{
|
||||||
|
SFG_player.camera.direction = RCL_wrap(SFG_player.camera.direction,RCL_UNITS_PER_SQUARE);
|
||||||
|
|
||||||
|
SFG_player.direction = RCL_angleToDirection(SFG_player.camera.direction);
|
||||||
|
|
||||||
|
SFG_player.direction.x = (SFG_player.direction.x * SFG_PLAYER_MOVE_UNITS_PER_FRAME) / RCL_UNITS_PER_SQUARE;
|
||||||
|
SFG_player.direction.y = (SFG_player.direction.y * SFG_PLAYER_MOVE_UNITS_PER_FRAME) / RCL_UNITS_PER_SQUARE;
|
||||||
|
|
||||||
|
SFG_backgroundScroll =
|
||||||
|
((SFG_player.camera.direction * 8) * SFG_RESOLUTION_Y) / RCL_UNITS_PER_SQUARE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SFG_initPlayer()
|
||||||
|
{
|
||||||
|
RCL_initCamera(&SFG_player.camera);
|
||||||
|
|
||||||
|
SFG_player.camera.resolution.x = SFG_RESOLUTION_X / SFG_RAYCASTING_SUBSAMPLE;
|
||||||
|
SFG_player.camera.resolution.y = SFG_RESOLUTION_Y;
|
||||||
|
SFG_player.camera.height = RCL_UNITS_PER_SQUARE * 12;
|
||||||
|
SFG_player.camera.position.x = RCL_UNITS_PER_SQUARE * 15;
|
||||||
|
SFG_player.camera.position.y = RCL_UNITS_PER_SQUARE * 8;
|
||||||
|
|
||||||
|
SFG_recompurePLayerDirection();
|
||||||
|
SFG_player.verticalSpeed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
RCL_RayConstraints SFG_rayConstraints;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stores the current level and helper precomputed vaues for better performance.
|
Stores the current level and helper precomputed vaues for better performance.
|
||||||
*/
|
*/
|
||||||
@ -256,21 +296,6 @@ RCL_Unit SFG_ceilingHeightAt(int16_t x, int16_t y)
|
|||||||
uint32_t SFG_frame;
|
uint32_t SFG_frame;
|
||||||
uint32_t SFG_lastFrameTimeMs;
|
uint32_t SFG_lastFrameTimeMs;
|
||||||
|
|
||||||
RCL_Vector2D SFG_playerDirection;
|
|
||||||
|
|
||||||
void SFG_recompurePLayerDirection()
|
|
||||||
{
|
|
||||||
SFG_camera.direction = RCL_wrap(SFG_camera.direction,RCL_UNITS_PER_SQUARE);
|
|
||||||
|
|
||||||
SFG_playerDirection = RCL_angleToDirection(SFG_camera.direction);
|
|
||||||
|
|
||||||
SFG_playerDirection.x = (SFG_playerDirection.x * SFG_PLAYER_MOVE_UNITS_PER_FRAME) / RCL_UNITS_PER_SQUARE;
|
|
||||||
SFG_playerDirection.y = (SFG_playerDirection.y * SFG_PLAYER_MOVE_UNITS_PER_FRAME) / RCL_UNITS_PER_SQUARE;
|
|
||||||
|
|
||||||
SFG_backgroundScroll =
|
|
||||||
((SFG_camera.direction * 8) * SFG_RESOLUTION_Y) / RCL_UNITS_PER_SQUARE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SFG_setLevel(const SFG_Level *level)
|
void SFG_setLevel(const SFG_Level *level)
|
||||||
{
|
{
|
||||||
SFG_LOG("setting and initializing level");
|
SFG_LOG("setting and initializing level");
|
||||||
@ -286,7 +311,7 @@ void SFG_setLevel(const SFG_Level *level)
|
|||||||
|
|
||||||
SFG_currentLevel.timeStart = SFG_getTimeMs();
|
SFG_currentLevel.timeStart = SFG_getTimeMs();
|
||||||
|
|
||||||
SFG_recompurePLayerDirection();
|
SFG_initPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SFG_init()
|
void SFG_init()
|
||||||
@ -296,15 +321,8 @@ void SFG_init()
|
|||||||
SFG_frame = 0;
|
SFG_frame = 0;
|
||||||
SFG_lastFrameTimeMs = 0;
|
SFG_lastFrameTimeMs = 0;
|
||||||
|
|
||||||
RCL_initCamera(&SFG_camera);
|
|
||||||
RCL_initRayConstraints(&SFG_rayConstraints);
|
RCL_initRayConstraints(&SFG_rayConstraints);
|
||||||
|
|
||||||
SFG_camera.resolution.x = SFG_RESOLUTION_X / SFG_RAYCASTING_SUBSAMPLE;
|
|
||||||
SFG_camera.resolution.y = SFG_RESOLUTION_Y;
|
|
||||||
SFG_camera.height = RCL_UNITS_PER_SQUARE;
|
|
||||||
SFG_camera.position.x = RCL_UNITS_PER_SQUARE * 5;
|
|
||||||
SFG_camera.position.y = RCL_UNITS_PER_SQUARE * 5;
|
|
||||||
|
|
||||||
SFG_rayConstraints.maxHits = SFG_RAYCASTING_MAX_HITS;
|
SFG_rayConstraints.maxHits = SFG_RAYCASTING_MAX_HITS;
|
||||||
SFG_rayConstraints.maxSteps = SFG_RAYCASTING_MAX_STEPS;
|
SFG_rayConstraints.maxSteps = SFG_RAYCASTING_MAX_STEPS;
|
||||||
|
|
||||||
@ -324,35 +342,61 @@ void SFG_gameStep()
|
|||||||
{
|
{
|
||||||
int8_t recomputeDirection = 0;
|
int8_t recomputeDirection = 0;
|
||||||
|
|
||||||
if (SFG_keyPressed(SFG_KEY_LEFT))
|
RCL_Vector2D moveOffset;
|
||||||
|
|
||||||
|
moveOffset.x = 0;
|
||||||
|
moveOffset.y = 0;
|
||||||
|
|
||||||
|
if (SFG_keyPressed(SFG_KEY_A))
|
||||||
{
|
{
|
||||||
SFG_camera.direction -= SFG_PLAYER_TURN_UNITS_PER_FRAME;
|
if (SFG_keyPressed(SFG_KEY_LEFT))
|
||||||
recomputeDirection = 1;
|
{
|
||||||
|
moveOffset.x = -1 * SFG_player.direction.y;
|
||||||
|
moveOffset.y = SFG_player.direction.x;
|
||||||
|
}
|
||||||
|
else if (SFG_keyPressed(SFG_KEY_RIGHT))
|
||||||
|
{
|
||||||
|
moveOffset.x = SFG_player.direction.y;
|
||||||
|
moveOffset.y = -1 * SFG_player.direction.x;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (SFG_keyPressed(SFG_KEY_RIGHT))
|
else
|
||||||
{
|
{
|
||||||
SFG_camera.direction += SFG_PLAYER_TURN_UNITS_PER_FRAME;
|
if (SFG_keyPressed(SFG_KEY_LEFT))
|
||||||
recomputeDirection = 1;
|
{
|
||||||
|
SFG_player.camera.direction -= SFG_PLAYER_TURN_UNITS_PER_FRAME;
|
||||||
|
recomputeDirection = 1;
|
||||||
|
}
|
||||||
|
else if (SFG_keyPressed(SFG_KEY_RIGHT))
|
||||||
|
{
|
||||||
|
SFG_player.camera.direction += SFG_PLAYER_TURN_UNITS_PER_FRAME;
|
||||||
|
recomputeDirection = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recomputeDirection)
|
||||||
|
SFG_recompurePLayerDirection();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recomputeDirection)
|
SFG_player.verticalSpeed -= SFG_GRAVITY_SPEED_INCREASE_PER_FRAME;
|
||||||
SFG_recompurePLayerDirection();
|
|
||||||
|
|
||||||
if (SFG_keyPressed(SFG_KEY_UP))
|
if (SFG_keyPressed(SFG_KEY_UP))
|
||||||
{
|
{
|
||||||
SFG_camera.position.x += SFG_playerDirection.x * 5;
|
moveOffset.x += SFG_player.direction.x;
|
||||||
SFG_camera.position.y += SFG_playerDirection.y * 5;
|
moveOffset.y += SFG_player.direction.y;
|
||||||
}
|
}
|
||||||
else if (SFG_keyPressed(SFG_KEY_DOWN))
|
else if (SFG_keyPressed(SFG_KEY_DOWN))
|
||||||
{
|
{
|
||||||
SFG_camera.position.x -= SFG_playerDirection.x;
|
moveOffset.x -= SFG_player.direction.x;
|
||||||
SFG_camera.position.y -= SFG_playerDirection.y;
|
moveOffset.y -= SFG_player.direction.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SFG_keyPressed(SFG_KEY_A))
|
RCL_Unit previousHeight = SFG_player.camera.height;
|
||||||
SFG_camera.height += SFG_PLAYER_MOVE_UNITS_PER_FRAME;
|
|
||||||
else if (SFG_keyPressed(SFG_KEY_B))
|
RCL_moveCameraWithCollision(&(SFG_player.camera),moveOffset,
|
||||||
SFG_camera.height -= SFG_PLAYER_MOVE_UNITS_PER_FRAME;
|
SFG_player.verticalSpeed,SFG_floorHeightAt,SFG_ceilingHeightAt,1,1);
|
||||||
|
|
||||||
|
SFG_player.verticalSpeed =
|
||||||
|
RCL_min(0,SFG_player.camera.height - previousHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SFG_mainLoopBody()
|
void SFG_mainLoopBody()
|
||||||
@ -377,7 +421,7 @@ void SFG_mainLoopBody()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// render noly once
|
// render noly once
|
||||||
RCL_renderComplex(SFG_camera,SFG_floorHeightAt,SFG_ceilingHeightAt,SFG_texturesAt,SFG_rayConstraints);
|
RCL_renderComplex(SFG_player.camera,SFG_floorHeightAt,SFG_ceilingHeightAt,SFG_texturesAt,SFG_rayConstraints);
|
||||||
|
|
||||||
SFG_lastFrameTimeMs = timeNow;
|
SFG_lastFrameTimeMs = timeNow;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user