Implémentation d'un inventaire en grille dans GameMaker : Décomposition étape par étape
Le système d'inventaire basé sur une grille vous permet de placer des objets de tailles variées dans une ds_grid, similaire aux mécaniques de Deus Ex ou S.T.A.L.K.E.R. Pour commencer, créez un objet joueur oPlayer avec un sprite et un objet conteneur oContainer sans sprite par défaut. Préparez les sprites d'objets : spApple (32x32), spWaterBottle (32x64), spMysteriousPackage (64x64), spItemError (32x32). Dans la room rTest, configurez les couches Instances et UI, et ajoutez des instances de oPlayer et oContainer.
Créez un objet persistant oGameManager dans la room de démarrage rInit. Dans l'événement Create :
global.inventoryDebugMode = true;
#macro InteractionDistance 100
global.ItemDB = {};
loadItemDefinitions();
room_goto(rTest);
Cela initialise le mode debug, la constante de distance d'interaction et la base de données des objets.
Chargement de la base de données des objets depuis JSON
Placez le fichier items.json dans datafiles. La structure d'un objet inclut Name, Type, Width, Height, MaxStack, Sprite, Description. Le script scItemDatabase contient loadItemDefinitions() :
function loadItemDefinitions()
{
var _filename = "items.json";
if (!file_exists(_filename) && global.inventoryDebugMode)
{
show_debug_message("Fayl " + _filename + " not found!");
return;
}
var _buffer = buffer_load(_filename);
var _jsonString = buffer_read(_buffer, buffer_string);
buffer_delete(_buffer);
var _parsedData = json_parse(_jsonString);
var _itemIDs = struct_get_names(_parsedData);
for (var i = 0; i < array_length(_itemIDs); ++i)
{
var _id = _itemIDs[i];
var _item = _parsedData[$ _id];
if (variable_struct_exists(_item, "Sprite"))
{
_item.Sprite = asset_get_index(_item.Sprite);
if (_item.Sprite == -1)
{
_item.Sprite = spItemError;
if (global.inventoryDebugMode)
show_debug_message("Withprayt not found for predmeta " + _id);
}
}
global.ItemDB[$ _id] = _item;
}
if (global.inventoryDebugMode)
show_debug_message("Baza predmetov zagruzhena. Count: " + string(array_length(_itemIDs)));
}
La fonction getItemData(_itemID) renvoie la struct de l'objet ou undefined.
- Avantages de ds_struct : accès dynamique par clés de chaîne via [$ _id].
- Gestion d'erreurs : repli sur spItemError si le sprite manque.
- Accesseurs : pour ds_grid — [# i, j], pour struct — [$ key].
Bases du stockage des objets dans la grille
L'inventaire est une ds_grid où :
- La cellule principale d'un objet stocke une struct {itemID, quantity}.
- Les cellules auxiliaires stockent {refX, refY} avec les coordonnées de la cellule principale.
- Les cellules vides sont noone.
Les objets tiennent compte de Width/Height de la base de données et MaxStack pour l'empilement.
Le script scInventory commence par des fonctions de base :
Création et destruction de l'inventaire
function inventoryCreate(_width, _height)
{
var grid = ds_grid_create(_width, _height);
ds_grid_clear(grid, noone);
return grid;
}
function inventoryDestroy(_inventory)
{
if (ds_exists(_inventory, ds_type_grid))
{
ds_grid_destroy(_inventory);
return true;
}
else
{
return false;
}
}
Fonctions de vérification et manipulation de la grille
Ensuite, implémentez une vérification de vacuité :
- inventoryIsEmpty(_inventory) : parcourt la grille à la recherche de noone.
Opérations clés sur les objets :
- Ajout : trouver un espace libre basé sur Width/Height, placer la cellule principale et les refs dans les autres.
- Déplacement : vérifier les chevauchements, mettre à jour refX/refY.
- Suppression : vider les cellules principale et refs.
Pour l'interaction : vérifier distance < InteractionDistance de oPlayer à oContainer.
Affichage de l'UI d'inventaire
Sur la couche UI, dessinez la grille en utilisant draw_sprite_part pour les objets. Gérez le survol de la souris pour le surlignage, drag-and-drop via global.dragItem.
Dans oPlayer, ajoutez inventoryPlayer = inventoryCreate(10, 6) ; faites de même pour les conteneurs.
Points clés
- Utilisez ds_grid pour un stockage 2D efficace avec les accesseurs [#x,y].
- Stockez uniquement itemID/quantity dans la cellule principale ; récupérez le reste via getItemData.
- Assurez des opérations atomiques : vérifiez toutes les cellules avant de placer.
- DebugMode simplifie le débogage du chargement et des manipulations.
- L'oGameManager persistant assure l'état global de ItemDB.
— Editorial Team
Aucun commentaire pour le moment.