Kivy游戏引擎中将游戏显示在屏幕上的方法

110 阅读1分钟

在Kivy游戏引擎中,如何将游戏显示在屏幕上?用户在Kivy中构建了一个具有开始菜单的应用程序,但无法在第二个屏幕上显示其Pong游戏。用户希望知道如何正确地引用游戏以使其可见。

huake_00183_.jpg 2、解决方案 在Kivy中,可以使用ScreenManager来管理不同的屏幕,并使用Screen来创建不同的屏幕。在您的代码中,您已经创建了三个屏幕:ScreenOne、ScreenTwo和ScreenThree。您可以在ScreenTwo中创建Pong游戏,并在ScreenManager中将ScreenTwo设置为当前屏幕,以使Pong游戏可见。

以下是修改后的代码:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition
from kivy.properties import ObjectProperty
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.popup import Popup
from kivy.uix.label import Label

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))
            if self.player1.score == 10:
                popup = Popup(title='Test popup', content=Label(text='Hello world'), auto_dismiss=False)
                return popup
    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 ScreenThree(Screen):
    pass

class ScreenTwo(Screen):
    pong_game = ObjectProperty(None)

    def build(self):
        self.pong_game = PongGame()
        self.pong_game.serve_ball()
        Clock.schedule_interval(self.pong_game.update, 1.0 / 60.0)
        return self.pong_game

class ScreenOne(Screen):
    pass

class Manager(ScreenManager):

    screen_one = ObjectProperty(None)
    screen_two = ObjectProperty(None)
    screen_three = ObjectProperty(None)

class ScreensApp(App):

    def build(self):
        m = Manager(transition=WipeTransition())
        return m

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

然后,在screen.kv文件中,您需要将PongGame添加到ScreenTwo中:

<ScreenTwo>:

    PongGame:
        id: pong_game
        center: self.parent.center

这样就可以在ScreenTwo中显示Pong游戏了。