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.
En el editor
Sección titulada «En el editor»- Crea la interfaz
Lojacon un Texto llamadoMoedas. - Pon un Painel llamado
Itensy, en Organizar filhos, elige Coluna. - Dentro de él, monta un ítem: un panel llamado
Modelocon una ImagemIcone, un TextoNomey un BotãoComprar. - Desmarca Visível en
Modelo. Sigue apareciendo en la pestaña, para que lo edites, pero no en el juego.
En el código
Sección titulada «En el código»#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); }}Cómo funciona
Sección titulada «Cómo funciona»moedas(unint) ymudou(unbool) son campos de la claseLoja, declarados enLoja.hpp.clone("Item0")copia elModelocon todo lo que tiene dentro, pone la copia al final del panelItensy 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 suNomey suComprar.setEnabled(false)deja el botón apagado y sin responder: es el ítem demasiado caro o ya comprado.- Llamar a
cloneotra 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.
Límites de esta versión
Sección titulada «Límites de esta versió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.
Mira también
Sección titulada «Mira también»- Interfaz, la pestaña del editor.
- Interfaz, la referencia del código.
- HUD y menú de pausa.
