Best way to do this in GUI?

I know there are a few GUI extensions, but I’m not intimately familiar with them to know which is the best to use. Or just to use the default Defold GUI API.

So in between rounds I want to offer upgrades for purchase. Like this:

Player chooses the type of upgrade they want to get. There will be various costs associated with them.

Then after clicking on it…the Type of upgrades go away and are replaced by a screen offering them random items from that class of upgrade where they can choose 1.

I’ll also want to make fancy shaders for them (think of it like a balatro upgrade system…it’s different but you get the gist).

Any suggestions for doing this that will make the code easy to maintain but also have it be flexible for what I’m trying to do. Yes I can just do it in the default GUI api but was wondering if there are GUI extensions I should use instead.

You mean something with supporting selections or just show/hide scenes? if just show/hide scenes then Monarch is a good one

Something that will make it easy to show the selections and manage them easily.

I’m doing something very similar to this with the default GUI. The player gets to choose a weapon upgrade after leveling up. I store the upgrades in a module and randomly select ones that are available.

For showing/hiding gui nodes, I use scale. Not sure if it’s the best way, but it works for me.


local function hide_weapon_options(self)
	for i = 1, 3 do
		gui.set_scale(self.effect_option[i], vmath.vector3())

To show the weapon options

local function show_weapon_options(self)
    -- Make sure table is reset
	self.selection = {}
	-- Prepare copy of weapon index
	local index_copy = {}

	-- Add available weapons to index copy, weapons are stored in a module
	for i = 1, #weapons.index do
		if weapons.index[i].available then
			index_copy[i] = weapons.index[i]

	-- Randomly select 3 weapons
	for i = 1, max_selection do
		local random = math.random(1, #index_copy)
		self.selection[i] = index_copy[random]

		-- Remove weapon from copy to avoid duplicates
		table.remove(index_copy, random)

        -- Store the name when picking it later
		local hash = self.selection[i].hash
        -- Info for the gui nodes
		local id, effect, description = weapons.get_effects(hash)

        -- To use later for input selection
		self.selection[i].id = id

		-- print(effect, description)
		gui.set_text(gui.get_node("effect" .. i), effect)
		gui.set_text(gui.get_node("description" .. i), description)
		gui.set_scale(self.effect_option[i], vmath.vector3(1,1,1))

Selecting an upgrade

local function on_touch_release(self, action)
	for i = 1, #self.effect_option do
		if gui.pick_node(self.effect_option[i], action.x, action.y) then
			add_weapon_effect(self, i)

function on_input(self, action_id, action)
	if action_id == TOUCH and action.released then
		on_touch_release(self, action)
1 Like

Thanks. I like the module idea.

Modules are very useful. I also have each of the weapons as its own module. This makes it easy to update the weapon - gun.add() and gun.upgrade(effect_id).

Ok, I just looked at monarch. It looks pretty cool to me. I like the popup idea. That may work for what I’m doing. I’ll check it out. Thanks.

1 Like