tutoriales.com

Creando un Sistema de Comercio y Tiendas Dinámicas en Godot 4: Economía y Trueque

En este tutorial aprenderás paso a paso cómo implementar un sistema de economía robusto en Godot 4, abarcando la interfaz de usuario, la lógica de compra y venta, y el intercambio de mercancías con NPCs.

Intermedio8 min de lectura5 views
Reportar error

Introducción al Sistema de Comercio y Economía 💰

Crear una economía equilibrada es uno de los pilares fundamentales en muchos géneros de videojuegos, desde RPGs de mundo abierto hasta simuladores de granjas o aventuras de exploración. Un sistema de comercio dinámico permite al jugador interactuar con el mundo virtual a través de la adquisición de equipo, pociones o materiales valiosos.

En este tutorial avanzado pero accesible, construiremos un sistema completo de tiendas y comercio utilizando Godot 4 y GDScript. Aprenderás a estructurar los datos de los objetos comercializables, manejar el inventario del jugador frente al inventario del comerciante, y programar las transacciones financieras con seguridad y estilo.

💡 Consejo: Antes de empezar, asegúrate de tener una estructura básica de inventario o al menos un script que almacene la moneda del jugador.

🛠️ Requisitos Previos y Estructura de Datos

Para que un sistema de tiendas funcione de manera óptima, necesitamos definir cómo se comportan los objetos. No todos los objetos tienen el mismo valor de compra y de venta (por lo general, los comerciantes compran barato y venden caro).

Crearemos una clase base usando recursos personalizados (Resource) en Godot 4. Esto nos permitirá crear múltiples objetos de forma modular directamente desde el editor.

Creando el Recurso de Objeto (Item)

Crea un nuevo script llamado item_data.gd que extienda de Resource:

class_name ItemData
extends Resource

@export var item_name: String = "Objeto"
@export var description: String = "Descripción del objeto"
@export var icon: Texture2D
@export var base_value: int = 10
@export var is_stackable: bool = true
@export var max_stack: int = 99
📌 Nota: Usar `class_name` facilita la creación de instancias en el inspector de Godot sin necesidad de asignar scripts manualmente cada vez.

🔄 Arquitectura del Sistema de Comercio

El flujo de comercio requiere la comunicación entre tres elementos principales: el Jugador (que posee oro y su propio inventario), la Tienda (que posee su propio stock y oro limitado o infinito), y la Interfaz Gráfica (UI) que muestra ambas partes.

Jugador UI de Tienda Inventario Comerciante Oro Objeto Datos Stock Actualizar Interacción del Sistema

Estructura de la Interfaz de Tienda

Diseñaremos una escena de interfaz con dos paneles principales:

  1. Panel del Inventario del Jugador: Los objetos que el usuario puede vender.
  2. Panel del Comerciante: Los objetos que el usuario puede comprar.

💻 Programando la Lógica del Comerciante

Ahora crearemos el script que gestionará la tienda. Este script manejará las transacciones, verificará si el jugador tiene suficiente dinero y actualizará las cantidades de stock.

Crea un nodo de tipo Node o Control llamado ShopManager.gd y añade el siguiente código:

extends Node

class_name ShopManager

@export var shop_inventory: Array[ItemData] = []
@export var buy_multiplier: float = 1.25 # El precio al que la tienda VENDE al jugador
@export var sell_multiplier: float = 0.5  # El precio al que la tienda COMPRA al jugador

signal transaction_completed(success: bool, message: String)

func get_buy_price(item: ItemData) -> int:
	return int(item.base_value * buy_multiplier)

func get_sell_price(item: ItemData) -> int:
	return int(item.base_value * sell_multiplier)

func buy_item(player: Node, item: ItemData) -> void:
	var price = get_buy_price(item)
	if player.gold >= price:
		player.gold -= price
		player.inventory.add_item(item)
		 emitida_transaccion(true, "¡Compra realizada con éxito!")
	else:
		emitida_transaccion(false, "No tienes suficiente oro.")

func sell_item(player: Node, item: ItemData) -> void:
	var price = get_sell_price(item)
	player.gold += price
	player.inventory.remove_item(item)
	 emitida_transaccion(true, "Objeto vendido correctamente.")

func emitida_transaccion(success: bool, msg: String):
	transaction_completed.emit(success, msg)
⚠️ Advertencia: Asegúrate de que las referencias a `player.gold` y `player.inventory` coincidan con los nombres de variables y métodos de tu sistema de jugador existente.

🎨 Creando la Interfaz Gráfica (UI)

Para visualizar la tienda, necesitaremos una interfaz intuitiva. Vamos a utilizar contenedores de rejilla (GridContainer) para mostrar los iconos de los objetos.

Paso 1: Crear un nodo Control principal llamado ShopUI.
Paso 2: Añadir dos ItemList o GridContainer, uno para la tienda y otro para el jugador.
Paso 3: Añadir etiquetas Label para mostrar el oro actual del jugador y los mensajes de estado.
Paso 4: Conectar las señales de los botones de compra y venta mediante GDScript.

Script de la Interfaz Gráfica

Adjunta el siguiente script a tu nodo raíz de la UI de la tienda:

extends Control

@onready var shop_grid = $HBoxContainer/ShopContainer/GridContainer
@onready var player_grid = $HBoxContainer/PlayerContainer/GridContainer
@onready var gold_label = $GoldLabel

var current_shop: ShopManager
var player_ref: Node

func open_shop(shop: ShopManager, player: Node):
	current_shop = shop
	player_ref = player
	visible = true
	refresh_ui()

func refresh_ui():
	// Limpiar contenedores y rellenar con los datos actuales
	gold_label.text = "Oro: " + str(player_ref.gold)

📊 Tabla Comparativa de Precios y Márgenes

Para equilibrar la economía de tu juego, es vital entender cómo los multiplicadores afectan el flujo del oro:

Tipo de TransacciónMultiplicador EstándarEfecto en el JugadorBalance de Economía
Compra1.25x - 2.0xGasta más oro del valor baseReduce la inflación
Venta0.25x - 0.5xRecibe menos oro del valor baseEvita que el jugador sea demasiado rico rápidamente
Trueque Puro1.0xIntercambio directo de objetosÚtil para economías post-apocalípticas

❓ Preguntas Frecuentes (FAQ)

¿Cómo puedo hacer que los precios fluctúen según la reputación?Puedes añadir un modificador adicional basado en una variable de reputación del jugador, por ejemplo: `final_price = base_price * multiplier * (2.0 - player_reputation)`.
¿Es posible limitar el oro del comerciante?Sí, puedes añadir una variable `var shop_gold: int = 500` en el `ShopManager` y restar o sumar oro al comerciante en cada transacción de la misma forma que con el jugador.

✨ Conclusión y Siguientes Pasos

¡Felicidades! 🎉 Has implementado con éxito la base lógica y visual de un sistema de comercio dinámico en Godot 4. Ahora los jugadores pueden comprar el equipo necesario para sus aventuras y deshacerse del botín sobrante a cambio de valiosas monedas.

Como siguientes pasos recomendados, puedes intentar:

  • Añadir efectos de sonido (SFX) al comprar o vender.
  • Implementar restricciones de nivel para ciertos objetos.
  • Añadir descuentos por misiones completadas.

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!