Added a room matrix that deals with movement and collisions.
This commit is contained in:
parent
2a88233e82
commit
bdc5b6d629
|
@ -26,6 +26,8 @@ add_executable(breakhack
|
||||||
src/map_lua
|
src/map_lua
|
||||||
src/camera
|
src/camera
|
||||||
src/timer
|
src/timer
|
||||||
|
src/roommatrix
|
||||||
|
src/position
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(breakhack
|
target_link_libraries(breakhack
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef DEFINES_H_
|
||||||
|
#define DEFINES_H_
|
||||||
|
|
||||||
|
/* Room/Map dimensions */
|
||||||
|
#define MAP_ROOM_HEIGHT 12
|
||||||
|
#define MAP_ROOM_WIDTH 16
|
||||||
|
|
||||||
|
#define MAP_V_ROOM_COUNT 10
|
||||||
|
#define MAP_H_ROOM_COUNT 10
|
||||||
|
|
||||||
|
#define TILE_DIMENSION 64
|
||||||
|
|
||||||
|
#endif // DEFINES_H_
|
|
@ -11,6 +11,7 @@
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include "map_lua.h"
|
#include "map_lua.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
#include "roommatrix.h"
|
||||||
|
|
||||||
#define SCREEN_WIDTH 1024
|
#define SCREEN_WIDTH 1024
|
||||||
#define SCREEN_HEIGHT 768
|
#define SCREEN_HEIGHT 768
|
||||||
|
@ -20,6 +21,7 @@ static SDL_Renderer *gRenderer = NULL;
|
||||||
static Sprite *gPlayer = NULL;
|
static Sprite *gPlayer = NULL;
|
||||||
static LinkedList *gSpriteList = NULL;
|
static LinkedList *gSpriteList = NULL;
|
||||||
static Map *gMap = NULL;
|
static Map *gMap = NULL;
|
||||||
|
static RoomMatrix *gRoomMatrix = NULL;
|
||||||
|
|
||||||
static Camera gCamera;
|
static Camera gCamera;
|
||||||
|
|
||||||
|
@ -92,6 +94,7 @@ bool init()
|
||||||
if (result) {
|
if (result) {
|
||||||
gCamera.pos = (Position) { 0, 0 };
|
gCamera.pos = (Position) { 0, 0 };
|
||||||
gCamera.renderer = gRenderer;
|
gCamera.renderer = gRenderer;
|
||||||
|
gRoomMatrix = roommatrix_create();
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -112,7 +115,7 @@ bool handle_events()
|
||||||
if (event.type == SDL_QUIT) {
|
if (event.type == SDL_QUIT) {
|
||||||
quit = true;
|
quit = true;
|
||||||
} else {
|
} else {
|
||||||
gPlayer->handle_event(gPlayer, &event);
|
gPlayer->handle_event(gPlayer, gRoomMatrix, &event);
|
||||||
camera_follow_position(&gCamera, &gPlayer->pos);
|
camera_follow_position(&gCamera, &gPlayer->pos);
|
||||||
map_set_current_room(gMap, &gPlayer->pos);
|
map_set_current_room(gMap, &gPlayer->pos);
|
||||||
}
|
}
|
||||||
|
@ -131,6 +134,7 @@ void run()
|
||||||
timer_start(fpsTimer);
|
timer_start(fpsTimer);
|
||||||
|
|
||||||
quit = handle_events();
|
quit = handle_events();
|
||||||
|
roommatrix_populate_from_map(gRoomMatrix, gMap);
|
||||||
|
|
||||||
SDL_RenderClear(gRenderer);
|
SDL_RenderClear(gRenderer);
|
||||||
|
|
||||||
|
|
13
src/map.h
13
src/map.h
|
@ -8,24 +8,19 @@
|
||||||
#include "sprite.h"
|
#include "sprite.h"
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
#include "position.h"
|
#include "position.h"
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
#define MAP_ROOM_HEIGHT 12
|
typedef struct MapTile_t {
|
||||||
#define MAP_ROOM_WIDTH 16
|
|
||||||
#define MAP_V_ROOM_COUNT 10
|
|
||||||
#define MAP_H_ROOM_COUNT 10
|
|
||||||
#define TILE_DIMENSION 64
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int textureIndex;
|
unsigned int textureIndex;
|
||||||
SDL_Rect clip;
|
SDL_Rect clip;
|
||||||
bool collider;
|
bool collider;
|
||||||
} MapTile;
|
} MapTile;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct Room_t {
|
||||||
MapTile* tiles[MAP_ROOM_WIDTH][MAP_ROOM_HEIGHT];
|
MapTile* tiles[MAP_ROOM_WIDTH][MAP_ROOM_HEIGHT];
|
||||||
} Room;
|
} Room;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct Map_t {
|
||||||
Room* rooms[MAP_H_ROOM_COUNT][MAP_V_ROOM_COUNT];
|
Room* rooms[MAP_H_ROOM_COUNT][MAP_V_ROOM_COUNT];
|
||||||
LinkedList *textures;
|
LinkedList *textures;
|
||||||
Position currentRoom;
|
Position currentRoom;
|
||||||
|
|
59
src/player.c
59
src/player.c
|
@ -2,29 +2,66 @@
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
|
|
||||||
static
|
static
|
||||||
void handle_player_input(Sprite *sprite, SDL_Event *event)
|
bool has_collided(Sprite *sprite, RoomMatrix *matrix)
|
||||||
|
{
|
||||||
|
Position pos = position_to_matrix_coords(&sprite->pos);
|
||||||
|
return matrix->spaces[pos.x][pos.y].occupied;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void move_left(Sprite *sprite, RoomMatrix *matrix)
|
||||||
|
{
|
||||||
|
sprite->texture->clip.y = 16;
|
||||||
|
sprite->pos.x -= TILE_DIMENSION;
|
||||||
|
if (has_collided(sprite, matrix))
|
||||||
|
sprite->pos.x += TILE_DIMENSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void move_right(Sprite *sprite, RoomMatrix *matrix)
|
||||||
|
{
|
||||||
|
sprite->texture->clip.y = 32;
|
||||||
|
sprite->pos.x += TILE_DIMENSION;
|
||||||
|
if (has_collided(sprite, matrix))
|
||||||
|
sprite->pos.x -= TILE_DIMENSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void move_up(Sprite *sprite, RoomMatrix *matrix)
|
||||||
|
{
|
||||||
|
sprite->texture->clip.y = 48;
|
||||||
|
sprite->pos.y -= TILE_DIMENSION;
|
||||||
|
if (has_collided(sprite, matrix))
|
||||||
|
sprite->pos.y += TILE_DIMENSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void move_down(Sprite *sprite, RoomMatrix *matrix)
|
||||||
|
{
|
||||||
|
sprite->texture->clip.y = 0;
|
||||||
|
sprite->pos.y += TILE_DIMENSION;
|
||||||
|
if (has_collided(sprite, matrix))
|
||||||
|
sprite->pos.y -= TILE_DIMENSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void handle_player_input(Sprite *sprite, RoomMatrix *matrix, SDL_Event *event)
|
||||||
{
|
{
|
||||||
unsigned int width = sprite->texture->dim.width;
|
|
||||||
unsigned int height = sprite->texture->dim.height;
|
|
||||||
static unsigned int step = 1;
|
static unsigned int step = 1;
|
||||||
|
|
||||||
if (event->type == SDL_KEYDOWN) {
|
if (event->type == SDL_KEYDOWN) {
|
||||||
switch (event->key.keysym.sym) {
|
switch (event->key.keysym.sym) {
|
||||||
case SDLK_LEFT:
|
case SDLK_LEFT:
|
||||||
sprite->texture->clip.y = 16;
|
move_left(sprite, matrix);
|
||||||
sprite->pos.x -= width;
|
|
||||||
break;
|
break;
|
||||||
case SDLK_RIGHT:
|
case SDLK_RIGHT:
|
||||||
sprite->texture->clip.y = 32;
|
move_right(sprite, matrix);
|
||||||
sprite->pos.x += width;
|
|
||||||
break;
|
break;
|
||||||
case SDLK_UP:
|
case SDLK_UP:
|
||||||
sprite->texture->clip.y = 48;
|
move_up(sprite, matrix);
|
||||||
sprite->pos.y -= height;
|
|
||||||
break;
|
break;
|
||||||
case SDLK_DOWN:
|
case SDLK_DOWN:
|
||||||
sprite->texture->clip.y = 0;
|
move_down(sprite, matrix);
|
||||||
sprite->pos.y += height;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sprite->texture->clip.x = 16*step;
|
sprite->texture->clip.x = 16*step;
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
#include "position.h"
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
Position position_to_matrix_coords(Position *src)
|
||||||
|
{
|
||||||
|
unsigned int room_px_width, room_px_height;
|
||||||
|
Position pos;
|
||||||
|
|
||||||
|
room_px_width = TILE_DIMENSION * MAP_ROOM_WIDTH;
|
||||||
|
room_px_height = TILE_DIMENSION * MAP_ROOM_HEIGHT;
|
||||||
|
|
||||||
|
pos.x = (src->x % room_px_width) / TILE_DIMENSION;
|
||||||
|
pos.y = (src->y % room_px_height) / TILE_DIMENSION;
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
|
@ -6,4 +6,6 @@ typedef struct {
|
||||||
int y;
|
int y;
|
||||||
} Position;
|
} Position;
|
||||||
|
|
||||||
|
Position position_to_matrix_coords(Position*);
|
||||||
|
|
||||||
#endif // POSITION_H_
|
#endif // POSITION_H_
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
#include "roommatrix.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "map.h"
|
||||||
|
|
||||||
|
RoomMatrix* roommatrix_create()
|
||||||
|
{
|
||||||
|
RoomMatrix *m = ec_malloc(sizeof(RoomMatrix));
|
||||||
|
roommatrix_reset(m);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void roommatrix_populate_from_map(RoomMatrix *rm, Map *m)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
Room *r;
|
||||||
|
|
||||||
|
r = m->rooms[m->currentRoom.x][m->currentRoom.y];
|
||||||
|
|
||||||
|
for (i = 0; i < MAP_ROOM_WIDTH; ++i) {
|
||||||
|
for (j = 0; j < MAP_ROOM_HEIGHT; ++j) {
|
||||||
|
rm->spaces[i][j].occupied = r->tiles[i][j]->collider;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void roommatrix_reset(RoomMatrix *m)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < MAP_ROOM_WIDTH; ++i) {
|
||||||
|
for (j = 0; j < MAP_ROOM_HEIGHT; ++j) {
|
||||||
|
m->spaces[i][j].occupied = false;
|
||||||
|
m->spaces[i][j].character = NULL;
|
||||||
|
m->spaces[i][j].player = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void roommatrix_destroy(RoomMatrix *m)
|
||||||
|
{
|
||||||
|
free(m);
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef ROOMMATRIX_H_
|
||||||
|
#define ROOMMATRIX_H_
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
typedef struct Sprite_t Sprite;
|
||||||
|
typedef struct Map_t Map;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool occupied;
|
||||||
|
Sprite* character;
|
||||||
|
Sprite* player;
|
||||||
|
} RoomSpace;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
RoomSpace spaces[MAP_ROOM_WIDTH][MAP_ROOM_HEIGHT];
|
||||||
|
} RoomMatrix;
|
||||||
|
|
||||||
|
RoomMatrix* roommatrix_create();
|
||||||
|
|
||||||
|
void roommatrix_populate_from_map(RoomMatrix*, Map*);
|
||||||
|
|
||||||
|
void roommatrix_reset(RoomMatrix*);
|
||||||
|
|
||||||
|
void roommatrix_destroy(RoomMatrix*);
|
||||||
|
|
||||||
|
#endif // ROOMMATRIX_H_
|
|
@ -6,11 +6,12 @@
|
||||||
#include "texture.h"
|
#include "texture.h"
|
||||||
#include "position.h"
|
#include "position.h"
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
|
#include "roommatrix.h"
|
||||||
|
|
||||||
typedef struct Sprite_t {
|
typedef struct Sprite_t {
|
||||||
Texture *texture;
|
Texture *texture;
|
||||||
Position pos;
|
Position pos;
|
||||||
void (*handle_event)(struct Sprite_t *sprite, SDL_Event*);
|
void (*handle_event)(struct Sprite_t*, RoomMatrix*, SDL_Event*);
|
||||||
} Sprite;
|
} Sprite;
|
||||||
|
|
||||||
Sprite* sprite_create();
|
Sprite* sprite_create();
|
||||||
|
|
Loading…
Reference in New Issue