LevelManager - Utilisation de base - Partie 02

< < LevelManager - Utilisation de base - Partie 01

Tutoriels

LevelManager - Utilisation de base - Partie 03 > >


Dans ce tutoriel, nous allons voir comment manipuler les données des calques.

 

Tout d'abord, il faut savoir que notre carte contient 3 calques (layers dans Tiled) :

 

Nous allons modifier l'image d'une tuile puis remettre sa valeur originale.

On va faire simple : on va seulement changer la tuile présente dans la ligne 3 et la colonne 3 (au milieu de l'île en haut et à gauche).

 

Pour changer une tuile, nous devons d'abord récupérer le calque (layer) qui la contient.

Il nous faut donc une variable pour le contenir :

local grassLayer = {}

 

Ensuite, dans love.load, après avoir chargé la carte, on va récupérer le contenu du calque :

grassLayer = LevelManager:getLayerByName("Grass")

 

Maintenant que nous avons notre calque, on va pouvoir changer une tuile.

J'ai choisi de changer une tuile avec une image d'herbe par une image de terre (les 2 sont présents dans le jeu de tuiles).

 

Le numéro de la tuile de terre dans la jeu de tuiles est le numéro 94.

⚠️ ATTENTION ⚠️

Sous Tiled, les numéros du jeu de tuiles commencent à 0 alors que les numéros des tuiles dans le fichier Lua commencent à 1.

La raison est simple : Tiled a été développé en C/C++. Les tuiles sont stockées dans un tableau et en C/C++, les tableaux commencent à 0 contrairement à Lua où les tableaux commencent à 1.

C'est pour cela qu'il faut toujours penser à rajouter 1 aux numéros des tuiles quand vous les lisez dans Tiled.

On va se créer une variable newTileId en dessous de grassLayer qui contiendra le numéro de la tuile :

local newTileId = 94

 

On va faire un peu différemment de d'habitude : on va faire le changement uniquement lorsqu'on appuye sur la barre d'espace.

Donc, dans la fonction love.keypressed, on va rajouter ces quelques lignes :

if key == "space" then
    LevelManager:setTileIdAtPos(grassLayer, 3, 3, newTileId)
end

 

La fonction setTileIdAtPos prend 5 paramètres (le dernier étant optionnel) :

  1. le calque (que l'on récupère à l'aide de la fonction getLayerByName)
  2. le numéro de ligne
  3. le numéro de colonne
  4. l'identifiant de la nouvelle image (doit être existant dans un de jeux de tuiles de la carte)
  5. un booléen si on veut forcer le changement d'identifiant (nécessaire uniquement si on veut enlever l'image)

 

Maintenant, quand vous lancer le jeu, en appuyant sur la barre d'espace, la tuile se change et vous devez obtenir ceci :

 

Il y a un petit problème que vous n'avez peut-être pas remarqué : actuellement, il n'est pas possible de remettre l'ancienne image de la tuile.

Ne vous en faites pas, vous allez voir, c'est super facile à faire.

 

Il y a plusieurs moyens pour y arriver.

 

1 - En utilisant les fonctions getTileIdAtPos et setTileIdAtPos

Tout d'abord, vous allez stocker dans une variable, avant la modification, l'identifiant de l'image de la tuile à l'aide de la fonction getTileIdAtPos.

Cette fonction permet de récupérer l'identifiant de l'image d'une tuile donnée d'un calque donné.
Ses paramètres sont : le calque concerné, le numéro de ligne et le numéro de colonne.
Elle vous retourne alors l'identifiant de l'image de la tuile.

Ensuite, comme nous l'avons fait plus haut, nous mettons à jour l'identifiant de la tuile avec celui que nous avons stocké.

 

2 - En utilisant la fonction reload

La fonction reload permet de remettre la carte comme elle était lors de son chargement.

Toutes les modifications que vous avez faites sont alors toutes annulées. Faites donc preuve de prudence lorsque vous l'utilisez.

 

3 - En utilisant la fonction restoreTileIdAtPos

Cette fonction est celle que l'on doit utiliser de préférence.

Ses paramètres sont : le calque concerné, le numéro de ligne et le numéro de colonne.

Seule la tuile concernée est remise à ses valeurs d'origine. Toutes les autres modifications ne sont pas impactées.

 

 

Pour notre exemple, si la tuile a déjà été modifiée et que l'on appuye à nouveau sur la barre d'espace, la tuile revient comme avant.

if key == "space" then
  if LevelManager:getTileIdAtPos(grassLayer, 3, 3) == newTileId then
    LevelManager:restoreTileIdAtPos(grassLayer, 3, 3)
  else
    LevelManager:setTileIdAtPos(grassLayer, 3, 3, newTileId)
  end
end

 

Maintenant, si vous appuyez une première fois sur la barre d'espace, l'herbe se change en terre.
Et si vous appuyez à nouveau sur la barre d'espace, la terre se transforme en herbe.

 

Fonction getLayersByGroup

Il nous reste une dernière fonction à voir : getLayersByGroup

Cette fonction permet de récupérer une liste de calques à partir du nom du groupe.
Cela peut être pratique pour, par exemple, faire des tests de collisions sur des calques d'un groupe particulier (je l'utilise principalement dans ce cas).

On pourrait aussi l'utiliser si on souhaite changer toutes les tuiles du sol pour faire une sorte d'effet jour/nuit.
Ou bien, si vous décidez que votre environnement change subitement après un bombardement, combat ou bien que vous avez voyagé dans le futur et que les plantes ont tout recouvert.

Un petit inconvénient à cela (comme on me l'a fait remarqué à juste titre), c'est qu'on doit doubler les jeux de tuiles, ce qui prend plus de mémoire et de temps pour charger.

Vous trouverez le code de l'effet jour/nuit avec les autres exemples.



< < LevelManager - Utilisation de base - Partie 01

Tutoriels

LevelManager - Utilisation de base - Partie 03 > >