Cómo llamar a una función de una clase de otra clase en el juego de pelota kivy Pong

Estoy practicando Kivy con el código de PongGame dado en el tutorial. Quiero saber cómo llamar a una función – serve_ball2 () en la clase PongGame de una clase recién creada – PongSample. En el código de abajo, creé una clase PongSample para servir la segunda bola una vez que la primera bola colisiona con la paleta.

Actualización: puedo llamar a serve_ball2 () desde PongSample, pero serve_ball2 () no funciona como es debido, es decir, no sirve a la pelota.

He compartido el código completo a continuación. Gracias por adelantado

Pong.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, time from threading import Thread 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 PongSample().call_game() 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 PongSample(Widget): def call_game(self): print 'PongSample' ponggame=PongGame() ponggame.serve_ball2() class PongGame(Widget): ball = ObjectProperty(None) ball2 = 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 serve_ball2(self, vel=(3, 0)): print 'Serve_ball2' self.ball2.center = self.center self.ball2.velocity = vel def serve_down(self): print 'Inside Serve Down' self.ball.center = self.center self.ball.velocity = Vector(4,0).rotate(-90) def update(self, dt): self.ball.move() self.ball2.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.top): self.ball.velocity_y *= -1 if (self.ball2.y  self.top): self.ball2.velocity_y *= -1 #went of to a side to score point? if self.ball.x  self.width: self.player1.score += 1 self.serve_ball(vel=(-4, 0)) if self.ball2.x  self.width: self.player1.score += 1 self.serve_ball2(vel=(-3, 0)) def on_touch_move(self, touch): if touch.x  self.width - self.width / 3: self.player2.center_y = touch.y class PongApp(App): def build(self): game = PongGame() game.serve_ball() Clock.schedule_interval(game.update, 1.0 / 60.0) return game if __name__ == '__main__': PongApp().run() 

pong.kv:

  #:kivy 1.8.0 : size: 50, 50 canvas: Ellipse: pos: self.pos size: self.size : size: 25, 200 canvas: Rectangle: pos:self.pos size:self.size : ball: pong_ball ball2: pong_ball2 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 PongBall: id: pong_ball2 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 

Para usar su clase, agregue game.serve_ball2() to PongApp

 class PongApp(App): def build(self): game = PongGame() game.serve_ball() game.serve_ball2() Clock.schedule_interval(game.update, 1.0 / 60.0) return game 

Y agrega self.ball2 para rebotar en las paletas:

 #bounce of paddles self.player1.bounce_ball(self.ball) self.player2.bounce_ball(self.ball) self.player1.bounce_ball(self.ball2) self.player2.bounce_ball(self.ball2) 

PongSample que esto parece innecesario, y que PongSample parece que no necesita existir en absoluto. Sin embargo, para hacer lo que me pidió, creo que lo siguiente debería funcionar. Sin embargo, una cosa que realmente no me gusta de esto es que se crea una instancia de PongSample en el archivo kv, sin otro propósito que servir a ball2. Sin embargo…

¿Por qué no definir la función serve_ball2 en la clase PongSample y pasarle ball2 ?

Ejemplo:

 class PongSample(Widget): def serve_ball2(self, ball2, vel=(3,0)): print 'Serve ball 2' ball2.center = self.center ball2.velocity = vel 

Y en la clase PongGame:

 class PongGame(Widget): ball = ObjectProperty(None) ball2 = ObjectProperty(None) player1 = ObjectProperty(None) player2 = ObjectProperty(None) # add this sample = ObjectProperty(None) 

Luego en el archivo kv:

 # add at the top : size: self.size pos: self.pos # add the below in appropriate places within the PongGame definition PongGame: sample: pong_sample PongSample: id: pong_sample # now it's linked to 'sample' in PongGame 

Así que ahora en PongGame puedes llamar a self.sample.serve_ball2(ball2) desde cualquier método.