Niveau
Un niveau est stocké en JSON, décrivant l'ensemble des calques, collisions, points de localisation, lumières, état de l'éditeur et chemin vers le LevelGraph.
// Extrait d'un fichier level.json
{
"layers": [
{
"opacity": 1.0,
"tiles": [
{
"TileMap": "dungeon",
"x": 18, "y": 19,
"Originalx": 1, "Originaly": 1,
"rotation": 0,
"flipHorizontal": false,
"flipVertical": false
},
/* … autres tuiles … */
]
},
/* layers 1 à 8 vides ou partiellement remplies */
],
"currentLayer": 0,
"currentTool": "LocationPoint",
"viewport": {
"panningOffset": [-456.0, -508.5],
"zoom": 2.5
},
/* … autres sections … */
}
📐 Coordonnées & dimensions
x, y
: position de la tuile dans le monde (grille)Originalx, Originaly
: indices de la tuile dans la source TileMaprotation
: angle en degrés (0, 90, 180, 270)flipHorizontal
/flipVertical
: retournement
TileMaps
La section tilePalette
décrit les tilesets chargés :
"tilePalette": {
"currentTileMapIndex": 0,
"tileMaps": [
{
"name": "dungeon",
"filepath": "C:\\…\\Dungeon Tile Set.png",
"tileSize": 16,
"colorKey": null,
"zoom": 1.0,
"panningOffset": [0, 0]
}
]
}
Animations
La section animations
liste chaque animation avec son nom, durée, vitesse, boucle, état de lecture et ses keyframes :
"animations": [
{
"name": "animation_1",
"end": 2.0,
"speed": 1.0,
"loop": false,
"play": false,
"keyframes": []
},
{
"name": "test",
"end": 1.5,
"speed": 2.0,
"loop": true,
"play": true,
"keyframes": [
{
"tile_map": "dungeon",
"x": 24, "y": 20,
"layer": 0,
"time": 0.402,
"Originalx": 3, "Originaly": 5,
"rotation": 0, "flipH": false, "flipV": false
},
/* … autres keyframes … */
]
}
]
🔑 Keyframes de suppression
Quand vous supprimez une tuile animée, un keyframe de suppression est généré :
{
"tile_map": "",
"x": 24,
"y": 20,
"layer": 0,
"time": 1.17,
"Originalx": 0,
"Originaly": 0,
"rotation": 0,
"flipH": false,
"flipV": false
}
tile_map
est vide indique une suppression de tuile à cet instant.
💡 Lumières
Les sources lumineuses sont enregistrées dans la section lights
du JSON :
"lights": [
{
"x": 376.4,
"y": 367.4,
"radius": 59.79,
"color": [255,180,80],
"blink": false
}
/* … autres lights … */
]
x, y
: position dans le monde (coordonnées du centre)radius
: rayon d'éclairagecolor
: couleur RGBblink
: clignotement activé ou non
globalIllumination
est à 1.0, les lights ne sont pas actives – baissez la valeur dans settings.globalIllumination
.
LevelGraph (Nodes)
Le chemin vers le fichier .lvg
du graphe nodal est indiqué en fin de JSON :
"levelGraph": "C:\\…\\test_graph.lvg"
🗃️ Format des fichiers LevelGraph (.lvg)
Le fichier .lvg
stocke l'ensemble des graphes nodaux d'un niveau. Chaque graphe correspond à un rectangle de collision dans l'éditeur et contient des nœuds connectés entre eux pour définir des logiques de gameplay.
.lvg
est automatiquement généré dans le même dossier que le niveau .json
. Le chemin absolu de ce fichier est référencé dans le champ levelGraph
du fichier JSON principal.
🔌 Structure des données
{
"graphs": [
{
"rect_id": "UUID_du_Rectangle",
"nodes": [...],
"connections": [...]
}
]
}
rect_id
— Identifiant unique du rectangle de collision associé.nodes
— Liste des nœuds placés dans ce graphe, avec leur position et paramètres.connections
— Connexions entre les nœuds via leurs pins (exec ou data).
📄 Exemple complet
Voici un exemple de graphe associé à un rectangle de collision :
{
"rect_id": "2bfc28a5-7d5a-4fa4-8d41-81fc045b16f2",
"nodes": [
{
"node_id": "on_enter_197_226",
"label": "On Enter",
"pos": [197, 226],
"properties": {}
},
{
"node_id": "Set SpawnPoint_670_244",
"label": "Set SpawnPoint",
"pos": [670, 244],
"properties": {
"choice": "point_0"
}
},
{
"node_id": "Sequence_437_261",
"label": "Sequence",
"pos": [437, 261],
"properties": {}
},
{
"node_id": "Teleport_923_339",
"label": "Teleport",
"pos": [923, 339],
"properties": {
"choice": "point_0"
}
},
{
"node_id": "Print Console_675_408",
"label": "Print Console",
"pos": [675, 408],
"properties": {
"value": "Hello World"
}
},
{
"node_id": "Get Player Health_543_498",
"label": "Get Player Health",
"pos": [543, 498],
"properties": {
"health": 200
}
}
],
"connections": [
{
"out_node": "on_enter_197_226",
"out_pin": "out",
"in_node": "Sequence_437_261",
"in_pin": "in"
},
{
"out_node": "Sequence_437_261",
"out_pin": "out0",
"in_node": "Set SpawnPoint_670_244",
"in_pin": "in"
},
{
"out_node": "Sequence_437_261",
"out_pin": "out1",
"in_node": "Teleport_923_339",
"in_pin": "in"
},
{
"out_node": "Sequence_437_261",
"out_pin": "out2",
"in_node": "Print Console_675_408",
"in_pin": "in"
},
{
"out_node": "Get Player Health_543_498",
"out_pin": "health",
"in_node": "Print Console_675_408",
"in_pin": "value"
}
]
}
🧠 Analyse du graphe
On Enter
— Événement déclenché quand le joueur entre dans la collision.Sequence
— Exécute plusieurs branches dans l'ordre : spawnpoint → téléportation → console.Set SpawnPoint
— Définit le point d'apparition.Teleport
— Téléporte le joueur à un point nommépoint_0
.Print Console
— Affiche dans la console le texte "Hello World" et y ajoute aussi la vie du joueur via le nœudGet Player Health
.
🧩 Autre exemple de graphe (collision secondaire)
{
"rect_id": "f4685698-3196-480a-b141-cdff2d4d86c7",
"nodes": [
{
"node_id": "on_start_320_284",
"label": "On Start",
"pos": [320, 284],
"properties": {}
},
{
"node_id": "Set MaxHealth_550_354",
"label": "Set MaxHealth",
"pos": [550, 354],
"properties": {
"health": "20"
}
}
],
"connections": [
{
"out_node": "on_start_320_284",
"out_pin": "out",
"in_node": "Set MaxHealth_550_354",
"in_pin": "in"
}
]
}
Ce graphe initialise la santé du joueur à 20 au début du mode Play.
On Start
) ne peut apparaître qu'une seule fois dans un même graphe.
Paramètres
La section settings
stocke les préférences de l'éditeur pour ce niveau :
"settings": {
"backgroundIndex": 21,
"globalIllumination": 0.0,
"start_mode": 0,
"showLights": true,
"showCollisions": true,
"showLocationPoints": true,
"playerSpawnPoint": null,
"keyframeOverlay": true
}
playerSpawnPoint
) peuvent être null
si non définies ; vérifiez leur existence avant utilisation.
Envie d'en savoir plus ?
Consultez les pages suivantes pour explorer les fonctionnalités clés de l'éditeur :
- 🔧 Interface — Comprendre les outils de dessin, la gestion des layers et le fonctionnement du viewport.
- 🎞️ Animations — Créez, éditez et déclenchez des animations dans vos niveaux à l'aide de la timeline visuelle.
