Nick Hallas
Nick Hallas

Reputation: 7

where to place code for kivy button in a game

hello My problem is that I dont know how to place a button inside my game without making the gamescreen gone. whenever I try to add return btn1 inside the code it just shows the button. but not the game. I am sure this is a beginner question but looking it up did not work for me.

BTW yes this is the code from a tutorial which I use privately

my code is:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, ReferenceListProperty,\
ObjectProperty
from kivy.vector import Vector
from kivy.clock import Clock
import kivy.uix.button
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.button import Button

def callback(instance):
 print('The button <%s> is being pressed' % instance.text)

btn1 = Button(text='Hello world 1')
btn1.bind(on_press=callback)
btn2 = Button(text='Hello world 2')
btn2.bind(on_press=callback)




class PongPaddle(Widget):

 score = NumericProperty(0)

def bounce_ball(self, ball):
    if self.collide_widget(ball):
        vx, vy = ball.velocity
        offset = (ball.center_y - self.center_y) / (self.height / 2)
        bounced = Vector(-1 * vx, vy)
        vel = bounced * 1.1
        ball.velocity = vel.x, vel.y + offset


class PongBall(Widget):
 velocity_x = NumericProperty(0)
 velocity_y = NumericProperty(0)
 velocity = ReferenceListProperty(velocity_x, velocity_y)

 def move(self):
    self.pos = Vector(*self.velocity) + self.pos


 class PongGame(Widget):

 ball = ObjectProperty(None)
 player1 = ObjectProperty(None)
 player2 = ObjectProperty(None)


 def serve_ball(self, vel=(4, 0)):
    self.ball.center = self.center
    self.ball.velocity = vel


def update(self, dt):
    self.ball.move()

    # bounce of paddles
    self.player1.bounce_ball(self.ball)
    self.player2.bounce_ball(self.ball)

    # bounce ball off bottom or top
    if (self.ball.y < self.y) or (self.ball.top > self.top):
        self.ball.velocity_y *= -1

    # went of to a side to score point?
    if self.ball.x < self.x:
        self.player2.score += 1
        self.serve_ball(vel=(4, 0))
    if self.ball.x > self.width:
        self.player1.score += 1
        self.serve_ball(vel=(-4, 0))

def on_touch_move(self, touch):
    if touch.x < self.width / 3:
        self.player1.center_y = touch.y
    if touch.x > self.width - self.width / 3:
        self.player2.center_y = touch.y 


class PongApp(App):
 def build(self):
    game = PongGame()
    game.serve_ball()
    Clock.schedule_interval(game.update, 1.0 / 60.0)





if __name__ == '__main__':
 PongApp().run() 

Upvotes: 0

Views: 65

Answers (1)

eyllanesc
eyllanesc

Reputation: 243897

If you want one widget to be part of another, this widget must be the son of the other widget or its ancestor is the son of that widget, and when you return btn1 in the build() you are indicating that it is the root, that is, the window, it does not show the game, to make a widget's son an option is to use add_widget():

class PongApp(App):
    def build(self):
        game = PongGame()
        game.add_widget(btn1) # <--
        btn2.pos = 100, 100
        game.add_widget(btn2) # <--
        game.serve_ball()
        Clock.schedule_interval(game.update, 1.0 / 60.0)
        return game

Upvotes: 1

Related Questions