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.
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:
- 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:
- 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
Noch keine Kommentare.