Zurück zur Startseite

Raster-Inventar GameMaker: Code und JSON

Leitfaden zur Erstellung eines Raster-Inventars in GameMaker mit ds_grid und JSON-Item-Datenbank. Beschreibt Initialisierung, Datenladen, Speicherung mit ref-Koordinaten und grundlegende Operationen. Geeignet für mittlere/senior Entwickler.

GameMaker: Inventar-Raster wie in S.T.A.L.K.E.R.
Advertisement 728x90

Implementierung eines Raster-Inventars in GameMaker: Schritt-für-Schritt-Aufschlüsselung

Das rasterbasierte Inventarsystem ermöglicht es, Gegenstände unterschiedlicher Größen in einem ds_grid unterzubringen, ähnlich wie die Mechaniken in Deus Ex oder S.T.A.L.K.E.R. Zum Einstieg erstellen Sie ein Spielerobjekt oPlayer mit einem Sprite und ein Container-Objekt oContainer ohne Standard-Sprite. Bereiten Sie Item-Sprites vor: spApple (32x32), spWaterBottle (32x64), spMysteriousPackage (64x64), spItemError (32x32). Im Raum rTest richten Sie Instances- und UI-Layer ein und fügen Instanzen von oPlayer und oContainer hinzu.

Erstellen Sie ein persistentes Objekt oGameManager im Startraum rInit. Im Create-Event:

global.inventoryDebugMode = true;
#macro InteractionDistance 100
global.ItemDB = {};
loadItemDefinitions();
room_goto(rTest);

Dies initialisiert den Debug-Modus, die Interaktionsdistanz-Konstante und die Item-Datenbank.

Google AdInline article slot

Item-Datenbank aus JSON laden

Legen Sie die Datei items.json in datafiles ab. Die Struktur eines Items umfasst Name, Type, Width, Height, MaxStack, Sprite, Description. Das Skript scItemDatabase enthält 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)));
}

Die Funktion getItemData(_itemID) gibt die Item-Struct zurück oder undefined.

  • Vorteile von ds_struct: dynamischer Zugriff über String-Keys via [$ _id].
  • Fehlerbehandlung: Rückfall auf spItemError, falls Sprite fehlt.
  • Accessoren: für ds_grid — [# i, j], für struct — [$ key].

Grundlagen zum Speichern von Items im Raster

Das Inventar ist ein ds_grid, in dem:

Google AdInline article slot
  • Die Hauptzelle eines Items eine Struct {itemID, quantity} speichert.
  • Hilfszellen speichern {refX, refY} mit den Koordinaten der Hauptzelle.
  • Leere Zellen sind noone.

Items berücksichtigen Width/Height aus der Datenbank sowie MaxStack für das Stapeln.

Das Skript scInventory beginnt mit grundlegenden Funktionen:

Inventar erstellen und zerstören

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;
	}
}

Rasterprüf- und Manipulationsfunktionen

Als Nächstes implementieren Sie eine Leerprüfung:

Google AdInline article slot
  • inventoryIsEmpty(_inventory): durchsucht das Raster nach noone.

Wichtige Item-Operationen:

  • Hinzufügen: freien Platz basierend auf Width/Height finden, Hauptzelle platzieren und Refs in die anderen Zellen.
  • Verschieben: Überlappungen prüfen, refX/refY aktualisieren.
  • Entfernen: Hauptt- und Hilfszellen leeren.

Für die Interaktion: Abstand < InteractionDistance von oPlayer zu oContainer prüfen.

Anzeige der Inventar-UI

Auf der UI-Layer das Raster mit draw_sprite_part für Items zeichnen. Mouse-Over für Hervorhebung handhaben, Drag-and-Drop via global.dragItem.

In oPlayer inventoryPlayer = inventoryCreate(10, 6); hinzufügen; dasselbe für Container.

Wichtige Punkte

  • ds_grid für effiziente 2D-Speicherung mit [#x,y]-Accessoren verwenden.
  • Nur itemID/quantity in der Hauptzelle speichern; Rest via getItemData abrufen.
  • Atomare Operationen sicherstellen: alle Zellen vor dem Platzieren prüfen.
  • DebugMode erleichtert das Debugging von Laden und Manipulationen.
  • Persistentes oGameManager sichert den globalen ItemDB-Zustand.

— Editorial Team

Advertisement 728x90

Weiterlesen