Forum Archive

Menu with ui

Python567

Hello together,
I don‘t know how to make a menu with ui. The menu must start the game when I klick the button!

My Code:

from scene import *
import ui
import sound
A = Action

def button_tapped(sender):
    print('button tapped')

button = ui.Button()
button.action = button_tapped



class ButtonNode (SpriteNode):
    def __init__(self, title, *args, **kwargs):
        SpriteNode.__init__(self, 'pzl:Button1', *args, **kwargs)
        button_font = ('Avenir Next', 20)
        self.title_label = LabelNode(title, font=button_font, color='black', position=(0, 1), parent=self)
        self.title = title

class MenuScene (Scene):
    def __init__(self, title, subtitle, button_titles):
        Scene.__init__(self)
        self.title = title
        self.subtitle = subtitle
        self.button_titles = button_titles

    def setup(self):
        button_font = ('Avenir Next', 20)
        title_font = ('Avenir Next', 36)
        num_buttons = len(self.button_titles)
        self.bg = SpriteNode(color='black', parent=self)
        bg_shape = ui.Path.rounded_rect(0, 0, 240, num_buttons * 64 + 140, 8)
        bg_shape.line_width = 4
        shadow = ((0, 0, 0, 0.35), 0, 0, 24)
        self.menu_bg = ShapeNode(bg_shape, (1,1,1,0.9), '#15a4ff', shadow=shadow, parent=self)
        self.title_label = LabelNode(self.title, font=title_font, color='black', position=(0, self.menu_bg.size.h/2 - 40), parent=self.menu_bg)
        self.title_label.anchor_point = (0.5, 1)
        self.subtitle_label = LabelNode(self.subtitle, font=button_font, position=(0, self.menu_bg.size.h/2 - 100), color='black', parent=self.menu_bg)
        self.subtitle_label.anchor_point = (0.5, 1)
        self.buttons = []
        for i, title in enumerate(reversed(self.button_titles)):
            btn = ButtonNode(title, parent=self.menu_bg)
            btn.position = 0, i * 64 - (num_buttons-1) * 32 - 50
            self.buttons.append(btn)
        self.did_change_size()
        self.menu_bg.scale = 0
        self.bg.alpha = 0
        self.bg.run_action(A.fade_to(0.4))
        self.menu_bg.run_action(A.scale_to(1, 0.3, TIMING_EASE_OUT_2))
        self.background_color = 'white'

    def did_change_size(self):
        self.bg.size = self.size + (2, 2)
        self.bg.position = self.size/2
        self.menu_bg.position = self.size/2

    def touch_began(self, touch):
        touch_loc = self.menu_bg.point_from_scene(touch.location)
        for btn in self.buttons:
            if touch_loc in btn.frame:
                sound.play_effect('8ve:8ve-beep-hightone')
                btn.texture = Texture('pzl:Button2')

    def touch_ended(self, touch):
        touch_loc = self.menu_bg.point_from_scene(touch.location)
        for btn in self.buttons:
            btn.texture = Texture('pzl:Button1')
            if self.presenting_scene and touch_loc in btn.frame:
                new_title = self.presenting_scene.menu_button_selected(btn.title)
                if new_title:
                    btn.title = new_title
                    btn.title_label.text = new_title

    def menu(self):
        pass


    def button_tapped(self, sender):
        print('button tapped')

    button = ui.Button()
    button.action = button_tapped


if __name__ == '__main__':
    run(MenuScene('LeiRacers', 'Subtitle', ['Play']))
cvp

@Python567 perhaps like this (be careful to how you name __init__)

from scene import *
import ui
import sound
A = Action

class ButtonNode (SpriteNode):
    def __init__(self, title, *args, **kwargs):
        SpriteNode.__init__(self, 'pzl:Button1', *args, **kwargs)
        button_font = ('Avenir Next', 20)
        self.title_label = LabelNode(title, font=button_font, color='black', position=(0, 1), parent=self)
        self.title = title

class MenuScene (Scene):
  def __init__(self, title, subtitle, button_titles, *args, **kwargs):
    Scene.__init__(self, *args, **kwargs)
    self.title = 'title'#title
    self.subtitle = 'subtitle'#subtitle
    self.button_titles = ['Play']#button_titles

  def setup(self):
    button_font = ('Avenir Next', 20)
    title_font = ('Avenir Next', 36)
    num_buttons = len(self.button_titles)
    self.bg = SpriteNode(color='black', parent=self)
    bg_shape = ui.Path.rounded_rect(0, 0, 240, num_buttons * 64 + 140, 8)
    bg_shape.line_width = 4
    shadow = ((0, 0, 0, 0.35), 0, 0, 24)
    self.menu_bg = ShapeNode(bg_shape, (1,1,1,0.9), '#15a4ff', shadow=shadow, parent=self)
    self.title_label = LabelNode(self.title, font=title_font, color='black', position=(0, self.menu_bg.size.h/2 - 40), parent=self.menu_bg)
    self.title_label.anchor_point = (0.5, 1)
    self.subtitle_label = LabelNode(self.subtitle, font=button_font, position=(0, self.menu_bg.size.h/2 - 100), color='black', parent=self.menu_bg)
    self.subtitle_label.anchor_point = (0.5, 1)
    self.buttons = []
    for i, title in enumerate(reversed(self.button_titles)):
        btn = ButtonNode(title, parent=self.menu_bg)
        btn.position = 0, i * 64 - (num_buttons-1) * 32 - 50
        self.buttons.append(btn)
    self.did_change_size()
    self.menu_bg.scale = 0
    self.bg.alpha = 0
    self.bg.run_action(A.fade_to(0.4))
    self.menu_bg.run_action(A.scale_to(1, 0.3, TIMING_EASE_OUT_2))
    self.background_color = 'white'

  def did_change_size(self):
    self.bg.size = self.size + (2, 2)
    self.bg.position = self.size/2
    self.menu_bg.position = self.size/2

  def touch_began(self, touch):
    touch_loc = self.menu_bg.point_from_scene(touch.location)
    for btn in self.buttons:
        if touch_loc in btn.frame:
            sound.play_effect('8ve:8ve-beep-hightone')
            btn.texture = Texture('pzl:Button2')
            self.button_tapped(btn)

  def touch_ended(self, touch):
    for btn in self.buttons:
        btn.texture = Texture('pzl:Button1')
        if self.presenting_scene and touch_loc in btn.frame:
            new_title = self.presenting_scene.menu_button_selected(btn.title)
            if new_title:
                btn.title = new_title
                btn.title_label.text = new_title

  def menu(self):
    pass


  def button_tapped(self, sender):
    print('button tapped:', sender.title)

if __name__ == '__main__':
  run(MenuScene('LeiRacers', 'Subtitle', ['Play']))
Python567

@cvp thanks. But what you mean with „be careful how you name init“?

cvp

@Python567 said:

But what you mean with „be careful how you name init“?

When I have copied your script, the init's were without their underscores...

PS I'm not sure that I did understand your request because you use a node and touch_began as button thus no ui.Button seems to be needed.
But I often don't understand correctly, so...

Python567

I need two buttons, one in the game area, and the other one in the menu, so it‘s right what you send me before.

cvp

@Python567 👍