Pular para o conteúdo
Baixar

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.

  1. Crie a interface Loja com um Texto chamado Moedas.
  2. Ponha um Painel chamado Itens e, em Organizar filhos, escolha Coluna.
  3. Dentro dele, monte um item: um Painel chamado Modelo com uma Imagem Icone, um Texto Nome e um Botão Comprar.
  4. Desmarque Visível no Modelo. Ele continua aparecendo na aba, para você editar, mas não aparece no jogo.
#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 (um int) e mudou (um bool) são campos da classe Loja, declarados no Loja.hpp.
  • clone("Item0") copia o Modelo com tudo o que tem dentro, põe a cópia no fim do painel Itens e 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 seu Nome e o seu Comprar.
  • setEnabled(false) deixa o botão apagado e sem responder: é o item caro demais ou já comprado.
  • Chamar clone de 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.

  • 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.