Ir al contenido
Descargar

Tienda con lista de ítems

Quieres una tienda (o un inventario, o una selección de niveles) en la que el número de ítems viene del código, sin montar cada fila a mano.

  1. Crea la interfaz Loja con un Texto llamado Moedas.
  2. Pon un Painel llamado Itens y, en Organizar filhos, elige Coluna.
  3. Dentro de él, monta un ítem: un panel llamado Modelo con una Imagem Icone, un Texto Nome y un Botão Comprar.
  4. Desmarca Visível en Modelo. Sigue apareciendo en la pestaña, para que lo edites, pero no en el juego.
#include "Loja.hpp"
#include <format>
#include <string>
#include <vector>
using namespace brasa;
struct Item {
std::string nome;
std::string sprite;
int preco;
bool comprado = false;
};
std::vector<Item> itens = {{"Espada", "espada", 10}, {"Escudo", "escudo", 40}};
void Loja::onSpawn() {
Ui::Element loja = Ui::get("Loja");
for (std::size_t n = 0; n < itens.size(); ++n) {
Ui::Element linha = loja["Itens"]["Modelo"].clone(std::format("Item{}", n));
linha["Nome"].setText(itens[n].nome);
linha["Icone"].setSprite(itens[n].sprite);
linha["Comprar"].setText(std::format("{} moedas", itens[n].preco));
linha["Comprar"].onClick(this, [this, n] {
moedas -= itens[n].preco;
itens[n].comprado = true;
mudou = true;
});
}
mudou = true;
}
void Loja::onUpdate() {
if (!mudou) return;
mudou = false;
Ui::Element loja = Ui::get("Loja");
loja["Moedas"].setText(std::format("Moedas: {}", moedas));
for (std::size_t n = 0; n < itens.size(); ++n) {
Ui::Element botao = loja["Itens"][std::format("Item{}", n)]["Comprar"];
if (itens[n].comprado) botao.setText("Comprado");
botao.setEnabled(!itens[n].comprado && moedas >= itens[n].preco);
}
}
  • moedas (un int) y mudou (un bool) son campos de la clase Loja, declarados en Loja.hpp.
  • clone("Item0") copia el Modelo con todo lo que tiene dentro, pone la copia al final del panel Itens y la deja visible. Como el panel ordena a sus hijos en columna, cada copia queda debajo de la anterior.
  • linha["Nome"] busca el elemento dentro de esa copia: cada ítem tiene su Nome y su Comprar.
  • setEnabled(false) deja el botón apagado y sin responder: es el ítem demasiado caro o ya comprado.
  • Llamar a clone otra vez con el mismo nombre rehace la copia en vez de crear otra. Por eso reiniciar la room no duplica la lista.
  • remove() quita un elemento de la interfaz, y los de abajo suben.
  • El panel de la tienda retiene el clic: comprar no hace que el personaje dispare detrás.

La plantilla Zumbis (en Novo projeto) tiene una tienda completa hecha así, con dinero, armas y munición.

  • Si los ítems no caben en el panel, marca Rolar (desplazar) en el Inspector del panel: lo que pasa del borde queda oculto y la rueda del mouse desplaza la lista.
  • Lo que se compró se pierde al cerrar el juego, a no ser que lo guardes con Save. Mira Guardar datos.