Multiple tiles
This commit is contained in:
parent
b69249d230
commit
e19444181a
|
@ -1 +1,2 @@
|
||||||
platformer
|
platformer
|
||||||
|
*.inc
|
||||||
|
|
11
Makefile
11
Makefile
|
@ -1,15 +1,22 @@
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .inc .txt
|
||||||
|
|
||||||
NAME = platformer
|
NAME = platformer
|
||||||
|
TILES = grass_tile.inc dirt_tile.inc flag_tile.inc
|
||||||
|
|
||||||
all: $(NAME)
|
all: $(NAME)
|
||||||
|
|
||||||
$(NAME): $(NAME).c
|
$(NAME): $(NAME).c $(TILES)
|
||||||
$(CC) -O3 -Wall -Wextra -Werror -pedantic -o $@ $< -ldisplay
|
$(CC) -O3 -Wall -Wextra -Werror -pedantic -o $@ $< -ldisplay
|
||||||
|
|
||||||
|
.txt.inc:
|
||||||
|
./tile_compiler.py $< > $@
|
||||||
|
|
||||||
run: $(NAME)
|
run: $(NAME)
|
||||||
./$(NAME)
|
./$(NAME)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(NAME)
|
rm -f $(NAME) $(TILES)
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
GRASS_BROWN
|
||||||
|
.GRASS_DARK
|
||||||
|
----------
|
||||||
|
|
||||||
|
.
|
||||||
|
. .
|
||||||
|
|
||||||
|
. .
|
||||||
|
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
|FLAG_STEM
|
||||||
|
xFLAG_FLAG
|
||||||
|
.BG
|
||||||
|
----------
|
||||||
|
.|xx......
|
||||||
|
.|xxxx....
|
||||||
|
.|xxxxxx..
|
||||||
|
.|xxxxxxx.
|
||||||
|
.|xxxxxx..
|
||||||
|
.|xxxx....
|
||||||
|
.|xx......
|
||||||
|
.|........
|
||||||
|
.|........
|
||||||
|
.|........
|
|
@ -0,0 +1,14 @@
|
||||||
|
xGRASS_TOP
|
||||||
|
GRASS_BROWN
|
||||||
|
.GRASS_DARK
|
||||||
|
----------
|
||||||
|
xxxxxxxxxx
|
||||||
|
xx xx x x
|
||||||
|
x x x
|
||||||
|
|
||||||
|
. .
|
||||||
|
|
||||||
|
. .
|
||||||
|
.
|
||||||
|
.
|
||||||
|
|
50
platformer.c
50
platformer.c
|
@ -21,20 +21,28 @@ enum palette {
|
||||||
TEXT,
|
TEXT,
|
||||||
GRASS_TOP,
|
GRASS_TOP,
|
||||||
GRASS_BROWN,
|
GRASS_BROWN,
|
||||||
|
GRASS_DARK,
|
||||||
|
FLAG_STEM,
|
||||||
|
FLAG_FLAG,
|
||||||
ERROR,
|
ERROR,
|
||||||
};
|
};
|
||||||
static enum palette playfield[PLAYFIELD_SIDE * PLAYFIELD_SIDE];
|
static enum palette playfield[PLAYFIELD_SIDE * PLAYFIELD_SIDE];
|
||||||
|
|
||||||
|
|
||||||
|
#include "grass_tile.inc"
|
||||||
|
#include "dirt_tile.inc"
|
||||||
|
#include "flag_tile.inc"
|
||||||
|
|
||||||
static char tilemap[] = " "
|
static char tilemap[] = " "
|
||||||
" "
|
" "
|
||||||
" "
|
" "
|
||||||
" g "
|
"! g "
|
||||||
"gg g "
|
"gg g "
|
||||||
" g"
|
" g"
|
||||||
" g "
|
" g "
|
||||||
" g "
|
" g "
|
||||||
" g g "
|
" gdg "
|
||||||
"gggggggggg";
|
"ggggdddggg";
|
||||||
|
|
||||||
static uint32_t main_window = 0;
|
static uint32_t main_window = 0;
|
||||||
static uint32_t window_width = 600;
|
static uint32_t window_width = 600;
|
||||||
|
@ -228,28 +236,12 @@ static void update(struct timespec now, struct timespec dt_timespec) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_grass_tile(size_t x, size_t y) {
|
static void draw_tile(enum palette tile[], size_t x, size_t y) {
|
||||||
assert(x + TILE_SIDE <= PLAYFIELD_SIDE);
|
assert(x + TILE_SIDE <= PLAYFIELD_SIDE);
|
||||||
assert(y + TILE_SIDE <= PLAYFIELD_SIDE);
|
assert(y + TILE_SIDE <= PLAYFIELD_SIDE);
|
||||||
char grass_tile[] = "xxxxxxxxxx"
|
|
||||||
"xx xx x x "
|
|
||||||
" x x x "
|
|
||||||
" "
|
|
||||||
" "
|
|
||||||
" "
|
|
||||||
" "
|
|
||||||
" "
|
|
||||||
" "
|
|
||||||
" ";
|
|
||||||
assert(strlen(grass_tile) == TILE_SIDE * TILE_SIDE);
|
|
||||||
for (size_t ty = 0; ty < TILE_SIDE; ty++) {
|
for (size_t ty = 0; ty < TILE_SIDE; ty++) {
|
||||||
for (size_t tx = 0; tx < TILE_SIDE; tx++) {
|
for (size_t tx = 0; tx < TILE_SIDE; tx++) {
|
||||||
enum palette pixel;
|
enum palette pixel = tile[ty * TILE_SIDE + tx];
|
||||||
switch (grass_tile[ty * TILE_SIDE + tx]) {
|
|
||||||
case 'x': pixel = GRASS_TOP; break;
|
|
||||||
case ' ': pixel = GRASS_BROWN; break;
|
|
||||||
default: pixel = ERROR; break;
|
|
||||||
}
|
|
||||||
playfield[(y + ty) * PLAYFIELD_SIDE + x + tx] = pixel;
|
playfield[(y + ty) * PLAYFIELD_SIDE + x + tx] = pixel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -259,9 +251,14 @@ static void draw_tiles(void) {
|
||||||
assert(strlen(tilemap) == TILES * TILES);
|
assert(strlen(tilemap) == TILES * TILES);
|
||||||
for (size_t ty = 0; ty < TILES; ty++) {
|
for (size_t ty = 0; ty < TILES; ty++) {
|
||||||
for (size_t tx = 0; tx < TILES; tx++) {
|
for (size_t tx = 0; tx < TILES; tx++) {
|
||||||
|
enum palette *tile = NULL;
|
||||||
switch(tilemap[ty * TILES + tx]) {
|
switch(tilemap[ty * TILES + tx]) {
|
||||||
case 'g': draw_grass_tile(tx * TILE_SIDE, ty * TILE_SIDE); break;
|
case 'g': tile = grass_tile; break;
|
||||||
|
case 'd': tile = dirt_tile; break;
|
||||||
|
case '!': tile = flag_tile; break;
|
||||||
}
|
}
|
||||||
|
if (tile)
|
||||||
|
draw_tile(tile, tx * TILE_SIDE, ty * TILE_SIDE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -269,7 +266,7 @@ static void draw_tiles(void) {
|
||||||
static void draw(void) {
|
static void draw(void) {
|
||||||
memset(playfield, 0, sizeof(playfield));
|
memset(playfield, 0, sizeof(playfield));
|
||||||
draw_tiles();
|
draw_tiles();
|
||||||
draw_grass_tile(player_x, player_y);
|
draw_tile(grass_tile, player_x, player_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
@ -292,12 +289,15 @@ int main(int argc, char *argv[]) {
|
||||||
uint32_t palette_colours[] = {
|
uint32_t palette_colours[] = {
|
||||||
[BG] = make_color(128, 128, 255),
|
[BG] = make_color(128, 128, 255),
|
||||||
[TEXT] = make_color(255, 255, 255),
|
[TEXT] = make_color(255, 255, 255),
|
||||||
[GRASS_TOP] = make_color(0, 255, 0),
|
[GRASS_TOP] = make_color(0, 220, 0),
|
||||||
[GRASS_BROWN] = make_color(200, 128, 0),
|
[GRASS_BROWN] = make_color(200, 128, 0),
|
||||||
|
[GRASS_DARK] = make_color(100, 64, 0),
|
||||||
|
[FLAG_STEM] = make_color(0, 0, 0),
|
||||||
|
[FLAG_FLAG] = make_color(255, 0, 0),
|
||||||
[ERROR] = make_color(255, 0, 255),
|
[ERROR] = make_color(255, 0, 255),
|
||||||
};
|
};
|
||||||
|
|
||||||
long fps_cap = 60;
|
long fps_cap = 100;
|
||||||
struct timespec min_dt = timespec_make(0, 1000L * 1000L * 1000L / fps_cap);
|
struct timespec min_dt = timespec_make(0, 1000L * 1000L * 1000L / fps_cap);
|
||||||
struct timespec last_frame;
|
struct timespec last_frame;
|
||||||
clock_gettime(CLOCK_MONOTONIC, &last_frame);
|
clock_gettime(CLOCK_MONOTONIC, &last_frame);
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!python
|
||||||
|
import sys
|
||||||
|
|
||||||
|
with open(sys.argv[1], 'r') as f:
|
||||||
|
lines = [line.rstrip('\n') for line in f]
|
||||||
|
|
||||||
|
colours = {}
|
||||||
|
colour_lines = True
|
||||||
|
data = []
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
linenum = i + 1
|
||||||
|
if colour_lines and line == '----------':
|
||||||
|
colour_lines = False
|
||||||
|
continue
|
||||||
|
|
||||||
|
if colour_lines:
|
||||||
|
char = line[0]
|
||||||
|
colour = line[1:]
|
||||||
|
colours[char] = colour
|
||||||
|
elif len(line) != 10:
|
||||||
|
print(f'{sys.argv[0]}: {sys.argv[1]}: line {linenum} is {len(line)} wide, expected 10', file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
data.append(line)
|
||||||
|
|
||||||
|
if len(data) != 10:
|
||||||
|
print(f'{sys.argv[0]}: {sys.argv[1]}: {len(data)} lines of data, expected 10', file=sys.stderr)
|
||||||
|
|
||||||
|
print(f'enum palette {sys.argv[1].rsplit(".", 1)[0]}[] = {{')
|
||||||
|
for line in data:
|
||||||
|
print('\t' + ', '.join(colours[char] for char in line) + ',')
|
||||||
|
print('};')
|
Loading…
Reference in New Issue