# Implementace mřížkového inventáře v GameMaker: podrobný postup
Systém mřížkového inventáře umožňuje umisťovat předměty různých velikostí do ds_grid, podobně jako mechaniky v Deus Ex nebo S.T.A.L.K.E.R. Pro start vytvořte objekt hráče oPlayer se spritem a objekt kontejneru oContainer bez výchozího spritu. Připravte sprity předmětů: spApple (32x32), spWaterBottle (32x64), spMysteriousPackage (64x64), spItemError (32x32). Umístěte do místnosti rTest vrstvy Instances a UI, přidejte instance oPlayer a oContainer.
Vytvořte persistent objekt oGameManager v startovní místnosti rInit. V události Create:
global.inventoryDebugMode = true;
#macro InteractionDistance 100
global.ItemDB = {};
loadItemDefinitions();
room_goto(rTest);
To inicializuje debug režim, konstantu vzdálenosti interakce a databázi předmětů.
Načítání databáze předmětů z JSON
Umístěte soubor items.json do datafiles. Struktura předmětu zahrnuje Name, Type, Width, Height, MaxStack, Sprite, Description. Skript scItemDatabase obsahuje 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)));
}
Funkce getItemData(_itemID) vrací strukturu předmětu nebo undefined.
- Výhody ds_struct: dynamický přístup podle řetězcových klíčů prostřednictvím [$ _id].
- Zpracování chyb: fallback na spItemError při chybějícím spritu.
- Akcesory: pro ds_grid — [# i, j], pro struct — [$ key].
Základy ukládání předmětů do mřížky
Inventář je ds_grid, kde:
- Hlavní buňka předmětu obsahuje struct {itemID, quantity}.
- Pomocné buňky — {refX, refY} s koordináty hlavní.
- Prázdné buňky — noone.
Předměty berou v úvahu Width/Height z databáze a MaxStack pro stohování.
Skript scInventory začíná základními funkcemi:
Vytvoření a zničení inventáře
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;
}
}
Funkce pro kontrolu a manipulaci s mřížkou
Dále implementujte kontrolu prázdnoty:
- inventoryIsEmpty(_inventory): prohledává grid na noone.
Klíčové operace s předměty:
- Přidání: hledání volného místa podle Width/Height, umístění hlavní buňky a ref do zbytkových.
- Přesun: kontrola překrytí, aktualizace refX/refY.
- Odstranění: vyčištění hlavní a ref-buněk.
Pro interakci: kontrola vzdálenosti < InteractionDistance od oPlayer do oContainer.
Zobrazení UI inventáře
Na vrstvě UI kreslete mřížku prostřednictvím draw_sprite_part pro předměty. Zpracovávejte mouse-over pro zvýraznění, drag-and-drop prostřednictvím global.dragItem.
Do oPlayer přidejte inventoryPlayer = inventoryCreate(10, 6); podobně pro kontejnery.
Co je důležité
- Používejte ds_grid pro efektivní 2D úložiště s akcesory [#x,y].
- Ukládejte pouze itemID/quantity do hlavní buňky, zbytek přes getItemData.
- Zajistěte atomaritu operací: kontrolujte všechny buňky před umístěním.
- DebugMode usnadňuje ladění načítání a manipulací.
- Persistent oGameManager zaručuje globální stav ItemDB.
— Editorial Team
Zatím žádné komentáře.