add collision using Tiled value on tileset + timer

This commit is contained in:
bgiraudr 2021-07-31 03:40:14 +02:00
parent ef4e9e58b0
commit 2b7281a40d
9 changed files with 502 additions and 35 deletions

1
.gitignore vendored
View File

@ -3,6 +3,7 @@
/build-cg
/*.g1a
/*.g3a
*.json
# Python bytecode
__pycache__/

View File

@ -14,9 +14,10 @@ fxconv_declare_converters(assets-cg/converters.py)
add_custom_command(
OUTPUT "${CMAKE_CURRENT_LIST_DIR}/assets-cg/maps/testCarte.json"
COMMENT "Convert tmx map to json"
COMMAND tiled --export-tileset json tileset.tsx tileset.json
COMMAND tiled --export-map json testCarte.tmx testCarte.json
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/assets-cg/maps/
DEPENDS assets-cg/maps/testCarte.tmx assets-cg/tileset.png assets-cg/converters.py)
DEPENDS assets-cg/maps/testCarte.tmx assets-cg/tileset.png assets-cg/maps/tileset.tsx assets-cg/converters.py)
set(SOURCES
src/main.c

View File

@ -9,36 +9,60 @@ def convert(input, output, params, target):
return 1
def convert_map(input, output, params, target):
"""with open(input, "r") as csvData:
tiles = []
csvReader = csv.reader(csvData)
for row in csvReader:
tiles.append(row)
w = max(len(i) for i in tiles)
h = len(tiles)
encoded_tiles = bytearray()
for(y, i) in enumerate(tiles):
for(x, j) in enumerate(i):
encoded_tiles += bytearray(fxconv.u16((int)(j)+1))"""
TILE_AIR = 0
TILE_SOLID = 1
TILE_DOOR = 2
with open(input, "r") as jsonData:
data = json.load(jsonData)
w = data["layers"][0]["width"]
h = data["layers"][0]["height"]
tileset = open(input.replace(input.split("/")[-1], "tileset.json"), "r")
data_tileset = json.load(tileset)
tileset.close()
o = fxconv.ObjectData()
o += fxconv.u32(w) + fxconv.u32(h)
o += fxconv.ref("img_tileset")
tile_value = {}
info_map = bytearray()
for i in range(len(data["layers"])):
for i in data_tileset["tiles"]:
try:
id = i["id"]+1
type = i["type"]
if type == "air":
value = TILE_AIR
elif type == "solid":
value = TILE_SOLID
elif type == "door":
value = TILE_DOOR
else:
value = TILE_AIR
tile_value[id] = value
except KeyError:
pass
w = data["layers"][0]["width"]
h = data["layers"][0]["height"]
nblayer = len(data["layers"])
o = fxconv.ObjectData()
o += fxconv.u32(w) + fxconv.u32(h) + fxconv.u32(nblayer)
o += fxconv.ref("img_tileset")
if(nblayer <= 2):
for i in range(nblayer):
tiles = data["layers"][i]["data"]
byte_tiles = bytearray()
for j in tiles:
if i == nblayer-1:
value = tile_value.get(j)
if value == None: value = TILE_AIR
info_map += bytearray(fxconv.u16(value))
byte_tiles += bytearray(fxconv.u16(j))
o += fxconv.ref(byte_tiles)
o += fxconv.ref(info_map)
else:
raise fxconv.FxconvError(f"There is too much layer ! {nblayer} found for a max of 2")
fxconv.elf(o, output, "_" + params["name"], **target)

View File

@ -1,5 +1,410 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.5" tiledversion="1.7.1" name="tileset" tilewidth="16" tileheight="16" tilecount="754" columns="29">
<editorsettings>
<export target="tileset.json" format="json"/>
</editorsettings>
<image source="../tileset.png" width="464" height="416"/>
<tile id="18" probability="5"/>
<tile id="145" type="solid"/>
<tile id="146" type="solid"/>
<tile id="147" type="solid"/>
<tile id="148" type="solid"/>
<tile id="149" type="solid"/>
<tile id="150" type="solid"/>
<tile id="160" type="solid"/>
<tile id="161" type="solid"/>
<tile id="162" type="solid"/>
<tile id="163" type="solid"/>
<tile id="174" type="solid"/>
<tile id="175" type="solid"/>
<tile id="176" type="solid"/>
<tile id="177" type="solid"/>
<tile id="178" type="solid"/>
<tile id="179" type="solid"/>
<tile id="189" type="solid"/>
<tile id="190" type="solid"/>
<tile id="191" type="solid"/>
<tile id="192" type="solid"/>
<tile id="203" type="solid"/>
<tile id="204" type="solid"/>
<tile id="205" type="solid"/>
<tile id="206" type="solid"/>
<tile id="207" type="solid"/>
<tile id="208" type="solid"/>
<tile id="210" type="solid"/>
<tile id="211" type="solid"/>
<tile id="214" type="solid"/>
<tile id="215" type="solid"/>
<tile id="216" type="solid"/>
<tile id="217" type="solid"/>
<tile id="218" type="solid"/>
<tile id="219" type="solid"/>
<tile id="220" type="solid"/>
<tile id="221" type="solid"/>
<tile id="232" type="solid"/>
<tile id="233" type="solid"/>
<tile id="234" type="solid"/>
<tile id="235" type="solid"/>
<tile id="236" type="solid"/>
<tile id="237" type="solid"/>
<tile id="239" type="solid"/>
<tile id="240" type="solid"/>
<tile id="241" type="solid"/>
<tile id="242" type="solid"/>
<tile id="243" type="solid"/>
<tile id="244" type="solid"/>
<tile id="245" type="solid"/>
<tile id="246" type="solid"/>
<tile id="261" type="solid"/>
<tile id="262" type="solid"/>
<tile id="263" type="solid"/>
<tile id="264" type="solid"/>
<tile id="265" type="solid"/>
<tile id="266" type="solid"/>
<tile id="267" type="solid"/>
<tile id="268" type="solid"/>
<tile id="269" type="solid"/>
<tile id="270" type="solid"/>
<tile id="271" type="solid"/>
<tile id="272" type="solid"/>
<tile id="273" type="solid"/>
<tile id="274" type="solid"/>
<tile id="275" type="solid"/>
<tile id="276" type="solid"/>
<tile id="277" type="solid"/>
<tile id="278" type="solid"/>
<tile id="290" type="solid"/>
<tile id="291" type="solid"/>
<tile id="292" type="solid"/>
<tile id="293" type="solid"/>
<tile id="294" type="solid"/>
<tile id="295" type="solid"/>
<tile id="296" type="solid"/>
<tile id="297" type="solid"/>
<tile id="298" type="solid"/>
<tile id="299" type="solid"/>
<tile id="300" type="solid"/>
<tile id="301" type="solid"/>
<tile id="302" type="solid"/>
<tile id="303" type="solid"/>
<tile id="304" type="solid"/>
<tile id="305" type="solid"/>
<tile id="306" type="solid"/>
<tile id="307" type="solid"/>
<tile id="319" type="solid"/>
<tile id="320" type="solid"/>
<tile id="321" type="solid"/>
<tile id="322" type="solid"/>
<tile id="323" type="solid"/>
<tile id="324" type="solid"/>
<tile id="325" type="solid"/>
<tile id="326" type="solid"/>
<tile id="327" type="solid"/>
<tile id="328" type="solid"/>
<tile id="329" type="solid"/>
<tile id="330" type="solid"/>
<tile id="331" type="solid"/>
<tile id="332" type="solid"/>
<tile id="333" type="solid"/>
<tile id="334" type="solid"/>
<tile id="335" type="solid"/>
<tile id="336" type="solid"/>
<tile id="345" type="solid"/>
<tile id="348" type="solid"/>
<tile id="349" type="solid"/>
<tile id="350" type="solid"/>
<tile id="351" type="solid"/>
<tile id="352" type="solid"/>
<tile id="353" type="solid"/>
<tile id="354" type="solid"/>
<tile id="355" type="solid"/>
<tile id="356" type="solid"/>
<tile id="357" type="solid"/>
<tile id="358" type="solid"/>
<tile id="359" type="solid"/>
<tile id="360" type="solid"/>
<tile id="361" type="solid"/>
<tile id="362" type="solid"/>
<tile id="363" type="solid"/>
<tile id="364" type="solid"/>
<tile id="365" type="solid"/>
<tile id="373" type="solid"/>
<tile id="374" type="solid"/>
<tile id="375" type="solid"/>
<tile id="377" type="solid"/>
<tile id="378" type="solid"/>
<tile id="379" type="solid"/>
<tile id="380" type="solid"/>
<tile id="381" type="solid"/>
<tile id="382" type="solid"/>
<tile id="383" type="solid"/>
<tile id="384" type="solid"/>
<tile id="385" type="solid"/>
<tile id="386" type="solid"/>
<tile id="387" type="solid"/>
<tile id="388" type="solid"/>
<tile id="389" type="solid"/>
<tile id="390" type="solid"/>
<tile id="391" type="solid"/>
<tile id="392" type="solid"/>
<tile id="393" type="solid"/>
<tile id="394" type="solid"/>
<tile id="401" type="solid"/>
<tile id="402" type="solid"/>
<tile id="403" type="solid"/>
<tile id="404" type="solid"/>
<tile id="405" type="solid"/>
<tile id="406" type="solid"/>
<tile id="407" type="solid"/>
<tile id="408" type="solid"/>
<tile id="409" type="solid"/>
<tile id="410" type="solid"/>
<tile id="411" type="solid"/>
<tile id="412" type="solid"/>
<tile id="413" type="solid"/>
<tile id="414" type="solid"/>
<tile id="415" type="solid"/>
<tile id="416" type="solid"/>
<tile id="417" type="solid"/>
<tile id="418" type="solid"/>
<tile id="419" type="solid"/>
<tile id="420" type="solid"/>
<tile id="421" type="solid"/>
<tile id="422" type="solid"/>
<tile id="423" type="solid"/>
<tile id="426" type="solid"/>
<tile id="427" type="solid"/>
<tile id="428" type="solid"/>
<tile id="430" type="solid"/>
<tile id="431" type="solid"/>
<tile id="432" type="solid"/>
<tile id="433" type="solid"/>
<tile id="434" type="solid"/>
<tile id="435" type="solid"/>
<tile id="436" type="solid"/>
<tile id="437" type="solid"/>
<tile id="438" type="solid"/>
<tile id="439" type="solid"/>
<tile id="440" type="solid"/>
<tile id="441" type="solid"/>
<tile id="442" type="solid"/>
<tile id="443" type="solid"/>
<tile id="444" type="solid"/>
<tile id="445" type="solid"/>
<tile id="446" type="solid"/>
<tile id="447" type="solid"/>
<tile id="448" type="solid"/>
<tile id="449" type="solid"/>
<tile id="450" type="solid"/>
<tile id="451" type="solid"/>
<tile id="452" type="solid"/>
<tile id="455" type="solid"/>
<tile id="456" type="solid"/>
<tile id="457" type="solid"/>
<tile id="459" type="solid"/>
<tile id="460" type="solid"/>
<tile id="461" type="solid"/>
<tile id="462" type="solid"/>
<tile id="463" type="solid"/>
<tile id="464" type="solid"/>
<tile id="465" type="solid"/>
<tile id="466" type="solid"/>
<tile id="467" type="solid"/>
<tile id="468" type="solid"/>
<tile id="469" type="solid"/>
<tile id="470" type="solid"/>
<tile id="471" type="solid"/>
<tile id="472" type="solid"/>
<tile id="473" type="solid"/>
<tile id="474" type="solid"/>
<tile id="475" type="solid"/>
<tile id="476" type="solid"/>
<tile id="477" type="solid"/>
<tile id="478" type="solid"/>
<tile id="479" type="solid"/>
<tile id="480" type="solid"/>
<tile id="481" type="solid"/>
<tile id="484" type="solid"/>
<tile id="485" type="solid"/>
<tile id="486" type="solid"/>
<tile id="488" type="solid"/>
<tile id="489" type="solid"/>
<tile id="490" type="solid"/>
<tile id="491" type="solid"/>
<tile id="492" type="solid"/>
<tile id="493" type="solid"/>
<tile id="494" type="solid"/>
<tile id="495" type="solid"/>
<tile id="496" type="solid"/>
<tile id="497" type="solid"/>
<tile id="498" type="solid"/>
<tile id="499" type="solid"/>
<tile id="500" type="solid"/>
<tile id="501" type="solid"/>
<tile id="502" type="solid"/>
<tile id="503" type="solid"/>
<tile id="504" type="solid"/>
<tile id="517" type="solid"/>
<tile id="518" type="door"/>
<tile id="519" type="solid"/>
<tile id="520" type="solid"/>
<tile id="521" type="solid"/>
<tile id="522" type="solid"/>
<tile id="523" type="solid"/>
<tile id="524" type="solid"/>
<tile id="525" type="solid"/>
<tile id="526" type="solid"/>
<tile id="527" type="solid"/>
<tile id="528" type="solid"/>
<tile id="529" type="solid"/>
<tile id="530" type="solid"/>
<tile id="531" type="solid"/>
<tile id="532" type="solid"/>
<tile id="533" type="solid"/>
<tile id="542" type="solid"/>
<tile id="543" type="solid"/>
<tile id="544" type="solid"/>
<tile id="551" type="solid"/>
<tile id="552" type="solid"/>
<tile id="553" type="solid"/>
<tile id="554" type="solid"/>
<tile id="555" type="solid"/>
<tile id="556" type="solid"/>
<tile id="557" type="solid"/>
<tile id="558" type="solid"/>
<tile id="559" type="solid"/>
<tile id="560" type="solid"/>
<tile id="561" type="solid"/>
<tile id="562" type="solid"/>
<tile id="571" type="solid"/>
<tile id="572" type="solid"/>
<tile id="573" type="solid"/>
<tile id="575" type="solid"/>
<tile id="576" type="solid"/>
<tile id="577" type="solid"/>
<tile id="578" type="solid"/>
<tile id="579" type="solid"/>
<tile id="580" type="solid"/>
<tile id="581" type="solid"/>
<tile id="582" type="solid"/>
<tile id="583" type="solid"/>
<tile id="584" type="solid"/>
<tile id="585" type="solid"/>
<tile id="586" type="solid"/>
<tile id="587" type="solid"/>
<tile id="588" type="solid"/>
<tile id="589" type="solid"/>
<tile id="590" type="solid"/>
<tile id="591" type="solid"/>
<tile id="600" type="solid"/>
<tile id="601" type="solid"/>
<tile id="602" type="solid"/>
<tile id="604" type="solid"/>
<tile id="605" type="solid"/>
<tile id="606" type="solid"/>
<tile id="607" type="solid"/>
<tile id="608" type="solid"/>
<tile id="609" type="solid"/>
<tile id="610" type="solid"/>
<tile id="611" type="solid"/>
<tile id="612" type="solid"/>
<tile id="613" type="solid"/>
<tile id="614" type="solid"/>
<tile id="619" type="solid"/>
<tile id="620" type="solid"/>
<tile id="621" type="solid"/>
<tile id="622" type="solid"/>
<tile id="623" type="solid"/>
<tile id="624" type="solid"/>
<tile id="625" type="solid"/>
<tile id="626" type="solid"/>
<tile id="627" type="solid"/>
<tile id="629" type="solid"/>
<tile id="630" type="solid"/>
<tile id="631" type="solid"/>
<tile id="633" type="solid"/>
<tile id="634" type="solid"/>
<tile id="635" type="solid"/>
<tile id="636" type="solid"/>
<tile id="637" type="solid"/>
<tile id="638" type="solid"/>
<tile id="639" type="solid"/>
<tile id="640" type="solid"/>
<tile id="641" type="solid"/>
<tile id="642" type="solid"/>
<tile id="643" type="solid"/>
<tile id="648" type="solid"/>
<tile id="649" type="solid"/>
<tile id="650" type="solid"/>
<tile id="651" type="solid"/>
<tile id="652" type="solid"/>
<tile id="653" type="solid"/>
<tile id="654" type="solid"/>
<tile id="655" type="solid"/>
<tile id="656" type="solid"/>
<tile id="662" type="solid"/>
<tile id="663" type="solid"/>
<tile id="664" type="solid"/>
<tile id="665" type="solid"/>
<tile id="666" type="solid"/>
<tile id="667" type="solid"/>
<tile id="668" type="solid"/>
<tile id="669" type="solid"/>
<tile id="670" type="solid"/>
<tile id="671" type="solid"/>
<tile id="672" type="solid"/>
<tile id="676" type="solid"/>
<tile id="677" type="solid"/>
<tile id="678" type="solid"/>
<tile id="679" type="solid"/>
<tile id="680" type="solid"/>
<tile id="681" type="solid"/>
<tile id="682" type="solid"/>
<tile id="683" type="solid"/>
<tile id="684" type="solid"/>
<tile id="685" type="solid"/>
<tile id="687" type="solid"/>
<tile id="688" type="solid"/>
<tile id="689" type="solid"/>
<tile id="691" type="solid"/>
<tile id="692" type="solid"/>
<tile id="693" type="solid"/>
<tile id="694" type="solid"/>
<tile id="695" type="solid"/>
<tile id="696" type="solid"/>
<tile id="697" type="solid"/>
<tile id="698" type="solid"/>
<tile id="699" type="solid"/>
<tile id="700" type="solid"/>
<tile id="701" type="solid"/>
<tile id="705" type="solid"/>
<tile id="706" type="solid"/>
<tile id="707" type="solid"/>
<tile id="708" type="solid"/>
<tile id="709" type="solid"/>
<tile id="710" type="solid"/>
<tile id="711" type="solid"/>
<tile id="712" type="solid"/>
<tile id="713" type="solid"/>
<tile id="714" type="solid"/>
<tile id="716" type="solid"/>
<tile id="717" type="solid"/>
<tile id="718" type="solid"/>
<tile id="720" type="solid"/>
<tile id="721" type="solid"/>
<tile id="722" type="door"/>
<tile id="723" type="solid"/>
<tile id="724" type="solid"/>
<tile id="735" type="solid"/>
<tile id="736" type="solid"/>
<tile id="737" type="solid"/>
<tile id="738" type="solid"/>
<tile id="739" type="solid"/>
<tile id="740" type="solid"/>
<tile id="741" type="solid"/>
<tile id="742" type="solid"/>
<tile id="743" type="solid"/>
<tile id="745" type="solid"/>
<tile id="746" type="solid"/>
<tile id="747" type="solid"/>
</tileset>

View File

@ -1,5 +1,7 @@
#pragma once
#define ENGINE_TICK 25
struct game {
struct map *map;
struct player *player;
@ -7,4 +9,5 @@ struct game {
void engine_draw(struct game const *game);
void engine_draw_player(struct player const *player);
void engine_move(struct player *player, int direction);
void engine_move(struct game *game, int direction);
int map_walkable(struct map const *map, int x, int y);

View File

@ -1,14 +1,15 @@
#pragma once
struct map {
int w, h;
int w, h, nb_layer;
bopti_image_t *tileset;
short *tiles_layer1;
short *tiles_layer2;
short *info_map;
};
enum map_state {
TILE_AIR = 0,
TILE_SOLID = 1,
TILE_WALKABLE = 2
TILE_DOOR = 2
};

View File

@ -86,7 +86,7 @@ void engine_draw(struct game const *game) {
for(int i = beginmap; i <= endmap; i++) {
int y = j + (7-ycentre);
for(int layer = 0; layer < 2; layer++) {
for(int layer = 0; layer < game->map->nb_layer; layer++) {
int tile;
tile = layer == 0 ? game->map->tiles_layer1[i] - 1 : game->map->tiles_layer2[i] - 1;
if(tile != -1) {
@ -114,14 +114,22 @@ void engine_draw_player(struct player const *player) {
dprint(1,1,C_BLACK,"%d:%d",player->x, player->y);
}
void engine_move(struct player *player, int direction) {
void engine_move(struct game *game, int direction) {
int dx = (direction == DIR_RIGHT) - (direction == DIR_LEFT);
int dy = (direction == DIR_DOWN) - (direction == DIR_UP);
if(player->direction == direction) {
player->x += dx;
player->y += dy;
if(game->player->direction == direction) {
if(map_walkable(game->map, game->player->x + dx, game->player->y + dy)) {
game->player->x += dx;
game->player->y += dy;
}
} else {
player->direction = direction;
game->player->direction = direction;
}
}
int map_walkable(struct map const *map, int x, int y)
{
int tile = map->info_map[y * map->w + x];
return (tile != TILE_SOLID);
}

View File

@ -5,12 +5,21 @@
#include "engine.h"
#include "player.h"
#include <gint/timer.h>
#include <gint/clock.h>
extern struct map map_1;
struct map *maps[] = {
&map_1,
};
static int callback_tick(volatile int *tick)
{
*tick = 1;
return TIMER_CONTINUE;
}
void play() {
struct player player = {
.x = 16,
@ -23,20 +32,35 @@ void play() {
.player = &player
};
static volatile int tick = 1;
int t = timer_configure(TIMER_ANY, ENGINE_TICK*1000,
GINT_CALL(callback_tick, &tick));
if(t >= 0) timer_start(t);
while(!keydown(KEY_7)) {
while(!tick) sleep();
tick = 0;
engine_draw(&game);
//engine_draw_player(game->player);
dupdate();
int dir = get_inputs();
engine_move(&player, dir);
if(dir >= 0)
engine_move(&game, dir);
}
if(t >= 0) timer_stop(t);
}
int get_inputs(void)
{
while(1)
{
int key = getkey().key;
int get_inputs(void) {
int opt = GETKEY_DEFAULT & ~GETKEY_REP_ARROWS;
int timeout = 1;
while(1) {
key_event_t ev = getkey_opt(opt, &timeout);
if(ev.type == KEYEV_NONE) return -1;
int key = ev.key;
if(key == KEY_DOWN) return DIR_DOWN;
if(key == KEY_RIGHT) return DIR_RIGHT;