Я пытался создать игру в пинг-понг, используя Kivy. Я следовал учебнику на их веб-сайте, и он работал отлично! Однако я хотел добавить стартовый экран. Я посмотрел в Google и увидел, что мне следует использовать Screen Manager от Kivy. Я вставил его в свой код, но, тем не менее, когда я нажимаю кнопку запуска, он просто ничего не делает и дает мне черный экран. Я пытался понять это, но я не вижу, что не так! Вероятно, потому что у меня нет большого опыта работы с Kivy. Вот мой код.
< сильный > < EM> 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()


< сильный > < EM> 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

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

0
PythonPython 20 Фев 2020 в 15:10

2 ответа

Лучший ответ

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

self.add_widget(game)
0
PythonPython 20 Фев 2020 в 15:32

Я новичок здесь, но я думаю, что это может помочь. Когда я использую 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>"
0
Scot_Survivor 20 Фев 2020 в 12:36