2015-06-19 2 views
0

Я пытаюсь создать приложение kivy со стартовым меню, но я не могу отобразить свою игру «Понг» на втором экране. Как я должен ссылаться на игру, чтобы сделать ее видимой? Я пытался и искал, но ничего не нашел. Я на 100% уверен, что PongGame работает исправно, я просто не могу его отобразить. Было бы здорово, если бы кто-нибудь мог показать мне, как это сделать.Как отображать игру на экране?

Main.py:

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): 
    pass 

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:

<PongBall>: 
    size: 50, 50 
    canvas: 
     Ellipse: 
      pos: self.pos 
      size: self.size 

<PongPaddle>: 
    size: 25, 200 
    canvas: 
     Rectangle: 
      pos:self.pos 
      size:self.size 

<PongGame>: 
    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: root.x 
     center_y: root.center_y 

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

<ScreenOne>: 
    Button: 
     text: "Screen 1 >> Screen 2" 
     on_press: root.manager.current = 'screen2' 
<ScreenTwo>: 
     def build(self): 
      game = PongGame() 
      game.serve_ball() 
      Clock.schedule_interval(game.update, 1.0/60.0) 
      return game 

<ScreenThree>: 
    Button: 
     text: "Screen 3 >> Screen 1" 
     on_press: root.manager.current = 'screen1' 


<Manager>: 
    id: screen_manager 

    screen_one: screen_one 
    screen_two: screen_two 
    screen_three: screen_three 

    ScreenOne: 
     id: screen_one 
     name: 'screen1' 
     manager: screen_manager 

    ScreenTwo: 
     id: screen_two 
     name: 'screen2' 
     manager: screen_manager 

    ScreenThree: 
     id: screen_three 
     name: 'screen3' 
     manager: screen_manager 

ответ

0

Ну! в вашей программе было много ошибок, и мне пришлось сделать тонну улучшения. (Я это понимаю, поскольку вы новичок)

Прежде всего, пожалуйста, прочитайте полный текст kivy language documentation, так как я ясно вижу, что вы непосредственно начали с кодирования, не задумываясь об основах. Вы можете сделать пару хороших игр, но в конечном итоге вы столкнетесь с такими проблемами, которые не могут быть решены без четких концепций. И, к сожалению, вы не сможете обнаружить истинную силу kivy. :)

Возможно, вы также захотите пересмотреть свои концепции python.

Некоторые улучшения не стоит упоминать, но были важны, вы получите представление, прочитав код.

Улучшение 1:.

Приложение может быть построен, если вернуть виджет на сборки(), или если вы установите self.root (Но вы не можете сделать приложение еще раз п раз) как вы сделал здесь:

<ScreenTwo>: 
    def build(self): 
     game = PongGame() 
     game.serve_ball() 
     Clock.schedule_interval(game.update, 1.0/60.0) 
     return game 

Улучшение 2:

Если нажать на кнопку играть в пинг-понг, который представляет собой экранную игру. ваша игра начинается с подачи мяча.

on_release: root.current = 'game';game.serve_ball() 

(знаний)

Если вы все еще получаете черный экран вы можете захотеть, чтобы проверить имя kivy файла, для этого вы можете либо перейти к kivy документации или this link

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 __init__(self, *args, **kwargs): 
     super(PongGame, self).__init__(*args, **kwargs) 
     Clock.schedule_interval(self.update, 1.0/60.0) 

    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)) 

    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 Manager(ScreenManager): 
    pass 

class ScreensApp(App): 
    def build(self): 
     self.load_kv('t6.kv') 
     return Manager(transition=WipeTransition()) 

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

Вот файл kv.

<PongBall>: 
    size: 50, 50 
    canvas: 
     Ellipse: 
      pos: self.pos 
      size: self.size 

<PongPaddle>: 
    size: 25, 200 
    canvas: 
     Rectangle: 
      pos:self.pos 
      size:self.size 

<PongGame>: 
    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: root.x 
     center_y: root.center_y 

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

<Manager>: 
    id: screen_manager 


    Screen: 
     name: 'home' 
     Button: 
      text: 'Play Ping Pong' 
      halign: 'center' 
      valign: 'middle' 
      font_size: 100 
      text_size: self.size 
      on_release: root.current = 'game';game.serve_ball() 

    Screen: 
     name: 'game' 
     PongGame: 
      id: game 
+0

Большое спасибо! Я думаю, что я больше, чем новичок, и ваши советы очень полезны. Теперь все работает отлично, и легко понять, почему. Еще раз большое спасибо! :) – RIP

+0

Я рад помочь :) – kiok46

Смежные вопросы