Kivy ScreenManager дает мне черный экран - PullRequest
0 голосов
/ 20 февраля 2020

Я пытался создать игру в пинг-понг, используя kivy. Я следовал учебнику на их сайте , и он отлично работал! Однако я хотел добавить стартовый экран. Я посмотрел в Google и увидел, что мне нужно использовать Screen Manager от Kivy. Я вставил это в свой код, но, тем не менее, когда я нажимаю кнопку запуска, он просто ничего не делает и дает мне черный экран. Я пытался понять это, но я не вижу, что не так! Вероятно, потому что у меня нет большого опыта с Киви. Вот мой код
main.py

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
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition

class PingPongPaddle(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 PingPongBall(Widget):
    #Velocity on x and y axis
    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(0)

    #So ball.velocity can be used
    velocity = ReferenceListProperty(velocity_x, velocity_y)

    #Moves the ball one step
    def move(self):
        self.pos = Vector(*self.velocity) + self.pos

class PingPongGame(Widget):
    ball = ObjectProperty(None)
    player1 = ObjectProperty(None)
    player2 = ObjectProperty(None)


    def serve_ball(self, vel=(8, 0)):
        self.ball.center = self.center
        self.ball.velocity = vel
    def update(self, dt):
        self.ball.move()
        #Bounce off the paddles
        self.player1.bounce_ball(self.ball)
        self.player2.bounce_ball(self.ball)
        #Bounce off top and bottom
        if (self.ball.y < 0) or (self.ball.top > self.height):
            self.ball.velocity_y *= -1

        #Went off the side
        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):
        #To sense if screen is touched
        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 GameScreen(Screen):
    def play(self):
        global game
        game = PingPongGame()
        game.serve_ball()
        #Runs every 60th of a second
        Clock.schedule_interval(game.update, 1.0/60.0)
        return game

class MainScreen(Screen):
    pass



class PingPongApp(App):
    def build(self):
        screen_manager = ScreenManager(transition=SlideTransition())

        screen_manager.add_widget(MainScreen(name="main"))
        screen_manager.add_widget(GameScreen(name="game"))
        return screen_manager




if __name__ == "__main__":
    PingPongApp().run()


pingpong.kv

#:kivy 1.11.1

<MainScreen>:
    BoxLayout:
        Button:
            text: "Start!"
            on_press: root.manager.current = "game"
<GameScreen>:
    on_enter: self.play()

<PingPongBall>:
    size: 75, 75
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size          

<PingPongPaddle>:
    size: 50, 400
    canvas:
        Rectangle:
            pos:self.pos
            size:self.size

<PingPongGame>:
    ball: PingPong_ball
    player1: player_left
    player2: player_right

    canvas:
        Rectangle:
            pos: self.center_x - 5, 0
            size: 20, self.height

    Label:
        font_size: 140  
        center_x: root.width / 4
        top: root.top - 50
        text: str(root.player1.score)

    Label:
        font_size: 140 
        center_x: root.width * 3 / 4
        top: root.top - 50
        text: str(root.player2.score)

    Label:
        font_size: 35
        center_x: root.width * 6/7
        top: root.top - 500
        text: "by Me"

    PingPongBall:
        id: PingPong_ball
        center: self.parent.center

    PingPongPaddle:
        id: player_left
        x: root.x
        center_y: root.center_y

    PingPongPaddle:
        id: player_right
        x: root.width - self.width
        center_y: root.center_y

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Я исправил это, включив эту строку в функцию воспроизведения GameScreen.

self.add_widget(game)
0 голосов
/ 20 февраля 2020

Я новичок здесь, но я думаю, что это может помочь. Когда я использую Kivy, я также импортирую «экран» и использую его. Вот оно:

        self.removeuser = RemoveUser()
    screen = Screen(name="RemoveUser") # This will be the naem of screen to be called
    screen.add_widget(self.removeuser)
    self.screen_manager.add_widget(screen)

Это должно сработать, вернуть self.screen_manager. Затем для кнопки «Пуск» создать функцию, которая выполняет

PingPongApp.screen_manger.current = "<name of start screen>"
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...