Я пытаюсь использовать Kivy, чтобы изменить пример Pong Game, чтобы иметь главное меню. Мне потребовалось возраст, но я наконец -то получил систему меню для работы и запустил сам игровой объект на новом экране. Тем не менее, это сломало графику, и я не могу на всю жизнь понять, как их восстановить. Столкновение между мячом и лопастями все еще работает, но оно сильно смещено. Я понимаю, что это как -то связано с тем фактом, что ScreenManager использует относительный макет, где виджет по умолчанию, который я использовал до введения экранов, был абсолютным. Тем не менее, на этой странице описывается точная проблема, с которой я сталкиваюсь, где лопатки и мяч смещены от их предполагаемого центра, но предлагаемое решение настройки POS: 0,0 или просто удаление POS вообще не помогает, оно просто помещает все в нижний левый угол экрана, и теперь ничто не движется. Приведенный ниже код является моим первоначальным начальным кодом, который по -прежнему является наиболее функциональным из всего, что я пробовал.from kivy.app import App
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty
from kivy.uix.screenmanager import Screen, ScreenManager, NoTransition
from kivy.uix.widget import Widget
from kivy.vector import Vector
from kivy.clock import Clock
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()
self.player1.bounce_ball(self.ball)
self.player2.bounce_ball(self.ball)
if (self.ball.y < 0) or (self.ball.top > self.height):
self.ball.velocity_y *= -1
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 PongScreen(Screen):
def on_enter(self, *args):
game = PongGame()
self.add_widget(game)
game.serve_ball()
Clock.schedule_interval(game.update, 1 / 60)
return game
class PongMenu(Screen):
pass
class PongApp(App):
def build(self):
sm = ScreenManager(transition=NoTransition())
sm.add_widget(PongMenu(name="menu"))
sm.add_widget(PongScreen(name="game"))
return sm
if __name__ == "__main__":
PongApp().run()
< /code>
pong.kv
#:kivy 2.3.1
:
canvas:
Ellipse:
pos: self.pos
size: 50, 50
:
canvas:
Rectangle:
pos: self.pos
size: 25, 200
:
ball: pong_ball
player1: player_left
player2: player_right
canvas:
Rectangle:
pos: self.center_x - 5, 0
size: 10, self.height
Label:
font_size: 70
center_x: root.width / 4
top: root.top - 50
text: str(root.player1.score)
Label:
font_size: 70
center_x: root.width * 3 / 4
top: root.top - 50
text: str(root.player2.score)
PongBall:
id: pong_ball
center: self.parent.center
PongPaddle:
id: player_left
x: self.parent.x
center_y: self.parent.center_y
PongPaddle:
id: player_right
x: self.parent.width - self.width
center_y: self.parent.center_y
:
start_btn: button_start
BoxLayout:
orientation: 'vertical'
Button:
id: button_start
text: "Start Game"
markup: True
width: 200
height: 200
on_press: root.manager.current = "game"
Подробнее здесь: https://stackoverflow.com/questions/797 ... eenmanager
Столкновение изменилось в Киви из -за использования ScreenManager ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Текущее свойство Kivy ScreenManager не находит экраны с указанным свойством имени
Anonymous » » в форуме Python - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-