replaced tilemap with world
parent
851714810c
commit
465551e981
|
@ -1,82 +0,0 @@
|
||||||
#include "tilemap.h"
|
|
||||||
#include "corelib/layers.h"
|
|
||||||
#include "stdio.h"
|
|
||||||
#include "string.h"
|
|
||||||
#include "signal.h"
|
|
||||||
#include "stdio.h"
|
|
||||||
|
|
||||||
void draw_tilemap(const tilemap_t* tilemap, const tileset_t* tileset) {
|
|
||||||
sprite_t sprite;
|
|
||||||
for(int y=0;y<tilemap->height;++y) {
|
|
||||||
for(int x=0;x<tilemap->width;++x) {
|
|
||||||
size_t index = get_tile(tilemap, x, y);
|
|
||||||
if(index == 0) continue;
|
|
||||||
const tile_t tile = tileset->set[index-1];
|
|
||||||
sprite = tile.sprite;
|
|
||||||
sprite.depth = RLAYER_TILEMAP;
|
|
||||||
sprite.x = x; sprite.y = y;
|
|
||||||
draw_sprite(&sprite);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int save_tilemap(const tilemap_t* map, const char* file) {
|
|
||||||
FILE* fs = fopen(file, "w");
|
|
||||||
if(fs == NULL) {
|
|
||||||
fprintf(stderr, "ERROR: Failed to open file %s\n", file);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
fprintf(fs, "%d,%d,", map->width, map->height);
|
|
||||||
for(int i = 0; i < map->width * map->height; ++i)
|
|
||||||
fprintf(fs,"%zu,", map->tiles[i]);
|
|
||||||
fclose(fs);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int load_tilemap(tilemap_t* map, const char* file) {
|
|
||||||
FILE* fs = fopen(file, "r");
|
|
||||||
if(fs == NULL) {
|
|
||||||
fprintf(stderr, "ERROR: Failed to open file %s\n", file);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
char buf[99];
|
|
||||||
char* writer = buf;
|
|
||||||
int n = 0;
|
|
||||||
size_t* tile = map->tiles;
|
|
||||||
int entries=0;
|
|
||||||
while(1) {
|
|
||||||
n = fgetc(fs);
|
|
||||||
const char c = (char)n;
|
|
||||||
switch(n) {
|
|
||||||
case ' ':
|
|
||||||
case '\n':
|
|
||||||
case '\t':
|
|
||||||
break; // ignore
|
|
||||||
case EOF:
|
|
||||||
case ',':
|
|
||||||
*writer = '\0';
|
|
||||||
if(entries == 0) {
|
|
||||||
map->width = atoi(buf);
|
|
||||||
} else if(entries == 1) {
|
|
||||||
map->height = atoi(buf);
|
|
||||||
} else {
|
|
||||||
if(entries-2 >= TILEMAP_MAX_SIZE) goto end_while;
|
|
||||||
*tile = (size_t)atoi(buf);
|
|
||||||
++tile;
|
|
||||||
}
|
|
||||||
writer = buf;
|
|
||||||
++entries;
|
|
||||||
if(n == EOF)
|
|
||||||
goto end_while;
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
*writer = c;
|
|
||||||
++writer;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end_while:
|
|
||||||
fclose(fs);
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
#ifndef _tilemap_h
|
|
||||||
#define _tilemap_h
|
|
||||||
|
|
||||||
#include "corelib/render.h"
|
|
||||||
|
|
||||||
#define TILEMAP_MAX_SIZE 16384
|
|
||||||
#define TILESET_MAX_SIZE 255
|
|
||||||
|
|
||||||
typedef struct tile_t {
|
|
||||||
sprite_t sprite;
|
|
||||||
short walkable;
|
|
||||||
} tile_t;
|
|
||||||
|
|
||||||
typedef struct tileset_t {
|
|
||||||
tile_t* set;
|
|
||||||
size_t size;
|
|
||||||
} tileset_t;
|
|
||||||
|
|
||||||
typedef struct tilemap_t {
|
|
||||||
size_t tiles[TILEMAP_MAX_SIZE];
|
|
||||||
int width, height;
|
|
||||||
float x, y;
|
|
||||||
} tilemap_t;
|
|
||||||
|
|
||||||
static inline int get_tilemap_index(const tilemap_t* tilemap, int x, int y) {
|
|
||||||
return x + y * tilemap->width;
|
|
||||||
}
|
|
||||||
static inline size_t get_tile(const tilemap_t* tilemap, int x, int y) {
|
|
||||||
return *(tilemap->tiles + get_tilemap_index(tilemap, x, y));
|
|
||||||
}
|
|
||||||
static inline void set_tile(tilemap_t* tilemap, int x, int y, size_t value) {
|
|
||||||
*(tilemap->tiles + get_tilemap_index(tilemap, x, y)) = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void draw_tilemap(const tilemap_t* tilemap, const tileset_t* tileset);
|
|
||||||
/*load csv tilemap from file*/
|
|
||||||
extern int load_tilemap(tilemap_t* tilemap, const char* file);
|
|
||||||
/*write csv tilemap to file*/
|
|
||||||
extern int save_tilemap(const tilemap_t* tilemap, const char* file);
|
|
||||||
|
|
||||||
#endif /* _tilemap_h */
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
#include "world.h"
|
||||||
|
|
||||||
|
object_t g_objects[WORLD_NUM_OBJECTS];
|
||||||
|
|
||||||
|
void world_clear() {
|
||||||
|
for(int i = 0; i < WORLD_NUM_OBJECTS; ++i) {
|
||||||
|
g_objects[i].active = 0;
|
||||||
|
g_objects[i].enabled = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void object_draw_sprite(object_t* object) {
|
||||||
|
draw_sprite(&object->sprite);
|
||||||
|
}
|
||||||
|
|
||||||
|
object_t* _find_free_object() {
|
||||||
|
for(int i = 0; i < WORLD_NUM_OBJECTS; ++i) {
|
||||||
|
if(g_objects[i].active == 0) {
|
||||||
|
return g_objects + i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_t* make_object() {
|
||||||
|
object_t* o = _find_free_object();
|
||||||
|
o->active = 1;
|
||||||
|
o->enabled = 1;
|
||||||
|
o->evt_draw = &object_draw_sprite;
|
||||||
|
o->evt_update = NULL;
|
||||||
|
memset(&o->sprite, 0, sizeof(sprite_t));
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_t* instantiate_object(const object_t *original) {
|
||||||
|
object_t* obj = make_object();
|
||||||
|
*obj = *original;
|
||||||
|
obj->active = 1;
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_objects() {
|
||||||
|
for(int i = 0; i < WORLD_NUM_OBJECTS; ++i) {
|
||||||
|
if(g_objects[i].active == 1
|
||||||
|
&& g_objects[i].enabled == 1
|
||||||
|
&& g_objects[i].evt_update != NULL) {
|
||||||
|
g_objects[i].evt_update(g_objects + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_objects() {
|
||||||
|
for(int i = 0; i < WORLD_NUM_OBJECTS; ++i) {
|
||||||
|
if(g_objects[i].active == 1
|
||||||
|
&& g_objects[i].enabled == 1
|
||||||
|
&& g_objects[i].evt_draw != NULL) {
|
||||||
|
g_objects[i].evt_draw(g_objects + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
#ifndef _world_h
|
||||||
|
#define _world_h
|
||||||
|
|
||||||
|
#include "render.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define WORLD_NUM_OBJECTS 255
|
||||||
|
|
||||||
|
typedef struct object_t object_t;
|
||||||
|
|
||||||
|
typedef void(*tick_fn)(struct object_t*);
|
||||||
|
typedef void(*draw_fn)(struct object_t*);
|
||||||
|
|
||||||
|
struct object_t {
|
||||||
|
sprite_t sprite;
|
||||||
|
int active; // 1 if this object is in use and should not be overriden
|
||||||
|
int enabled; // 1 if this object's events should be triggered
|
||||||
|
|
||||||
|
uintptr_t timer; // free to use for whatever
|
||||||
|
|
||||||
|
tick_fn evt_update;
|
||||||
|
draw_fn evt_draw;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern object_t g_objects[WORLD_NUM_OBJECTS];
|
||||||
|
|
||||||
|
void world_clear();
|
||||||
|
|
||||||
|
object_t* make_object();
|
||||||
|
object_t* instantiate_object(const object_t* original);
|
||||||
|
|
||||||
|
void object_draw_sprite(object_t* object);
|
||||||
|
|
||||||
|
void update_objects();
|
||||||
|
void draw_objects();
|
||||||
|
|
||||||
|
#endif /* _world_h */
|
Loading…
Reference in New Issue