Loja com lista de itens
Você quer uma loja (ou um inventário, ou uma seleção de fases) em que o número de itens vem do código, sem montar cada linha à mão.
No editor
Seção intitulada “No editor”- Crie a interface
Lojacom um Texto chamadoMoedas. - Ponha um Painel chamado
Itense, em Organizar filhos, escolha Coluna. - Dentro dele, monte um item: um Painel chamado
Modelocom uma ImagemIcone, um TextoNomee um BotãoComprar. - Desmarque Visível no
Modelo. Ele continua aparecendo na aba, para você editar, mas não aparece no jogo.
No código
Seção intitulada “No 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); }}Como funciona
Seção intitulada “Como funciona”moedas(umint) emudou(umbool) são campos da classeLoja, declarados noLoja.hpp.clone("Item0")copia oModelocom tudo o que tem dentro, põe a cópia no fim do painelItense a deixa visível. Como o painel organiza os filhos em coluna, cada cópia cai embaixo da anterior.linha["Nome"]procura o elemento dentro daquela cópia: cada item tem o seuNomee o seuComprar.setEnabled(false)deixa o botão apagado e sem responder: é o item caro demais ou já comprado.- Chamar
clonede novo com o mesmo nome refaz a cópia em vez de criar outra. Por isso recomeçar a room não duplica a lista. remove()tira um elemento da interface, e os de baixo sobem.- O painel da loja prende o clique: comprar não faz o personagem atirar atrás.
O modelo Zumbis (em Novo projeto) tem uma loja completa feita assim, com dinheiro, armas e munição.
Limites desta versão
Seção intitulada “Limites desta versão”- Se os itens não cabem no painel, marque Rolar no Inspetor do painel: o que passa da borda fica escondido e a roda do mouse rola a lista.
- O que foi comprado se perde ao fechar o jogo, a não ser que você guarde com
Save. Veja Salvar dados.
Veja também
Seção intitulada “Veja também”- Interface, a aba do editor.
- Interface, a referência do código.
- HUD e menu de pausa.
