Volver al inicio

Inventario en Rejilla GameMaker: Código y JSON

Guía para crear inventario en rejilla en GameMaker usando ds_grid y base de datos de ítems JSON. Describe inicialización, carga de datos, almacenamiento con coordenadas ref y operaciones básicas. Adecuada para desarrolladores intermedios/senior.

GameMaker: inventario en rejilla como en S.T.A.L.K.E.R.
Advertisement 728x90

Implementación de un inventario en cuadrícula en GameMaker: desglose paso a paso

El sistema de inventario basado en cuadrícula te permite colocar ítems de varios tamaños en una ds_grid, similar a las mecánicas en Deus Ex o S.T.A.L.K.E.R. Para empezar, crea un objeto de jugador oPlayer con un sprite y un objeto contenedor oContainer sin sprite por defecto. Prepara sprites para ítems: spApple (32x32), spWaterBottle (32x64), spMysteriousPackage (64x64), spItemError (32x32). En la sala rTest, configura las capas Instances y UI, y añade instancias de oPlayer y oContainer.

Crea un objeto persistente oGameManager en la sala inicial rInit. En el evento Create:

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

Esto inicializa el modo debug, la constante de distancia de interacción y la base de datos de ítems.

Google AdInline article slot

Carga de la base de datos de ítems desde JSON

Coloca el archivo items.json en datafiles. La estructura de un ítem incluye Name, Type, Width, Height, MaxStack, Sprite, Description. El script scItemDatabase contiene 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 función getItemData(_itemID) devuelve la estructura del ítem o undefined.

  • Ventajas de ds_struct: acceso dinámico por claves de cadena mediante [$ _id].
  • Manejo de errores: retroceso a spItemError si falta el sprite.
  • Accesores: para ds_grid — [# i, j], para struct — [$ key].

Fundamentos para almacenar ítems en la cuadrícula

El inventario es una ds_grid donde:

Google AdInline article slot
  • La celda principal de un ítem almacena una struct {itemID, quantity}.
  • Las celdas auxiliares almacenan {refX, refY} con las coordenadas de la celda principal.
  • Las celdas vacías son noone.

Los ítems tienen en cuenta Width/Height de la base de datos y MaxStack para apilar.

El script scInventory comienza con funciones básicas:

Creación y destrucción del inventario

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

Funciones de verificación y manipulación de la cuadrícula

A continuación, implementa una verificación de vacío:

Google AdInline article slot
  • inventoryIsEmpty(_inventory): escanea la cuadrícula en busca de noone.

Operaciones clave con ítems:

  • Añadir: busca espacio libre basado en Width/Height, coloca la celda principal y las refs en las demás.
  • Mover: verifica superposiciones, actualiza refX/refY.
  • Eliminar: limpia la celda principal y las de ref.

Para la interacción: verifica distancia < InteractionDistance desde oPlayer a oContainer.

Visualización de la UI del inventario

En la capa UI, dibuja la cuadrícula usando draw_sprite_part para los ítems. Maneja mouse-over para resaltar, drag-and-drop mediante global.dragItem.

En oPlayer, añade inventoryPlayer = inventoryCreate(10, 6); haz lo mismo para los contenedores.

Puntos clave

  • Usa ds_grid para almacenamiento 2D eficiente con accesores [#x,y].
  • Almacena solo itemID/quantity en la celda principal; obtén el resto vía getItemData.
  • Asegura operaciones atómicas: verifica todas las celdas antes de colocar.
  • DebugMode simplifica la depuración de carga y manipulaciones.
  • oGameManager persistente asegura el estado global de ItemDB.

— Editorial Team

Advertisement 728x90

Leer después