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