Zpět na domů

Mřížkový inventář GameMaker: kód a JSON

Průvodce vytvořením mřížkového inventáře v GameMaker s použitím ds_grid a JSON databáze předmětů. Popsány inicializace, načítání dat, ukládání s ref-souřadnicemi a základní operace. Vhodné pro středně pokročilé/senior vývojáře.

GameMaker: mřížka inventáře jako v S.T.A.L.K.E.R.
Advertisement 728x90

# 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ů.

Google AdInline article slot

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:

Google AdInline article slot
  • 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:

Google AdInline article slot
  • 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

Advertisement 728x90

Číst dál