كيفية إضافة كرة كذبة ثانية إلى النافذة؟
سؤال
لقد ترميز الرسوم المتحركة (في بيثون) لكرة الشاطئ لترتد حول الشاشة. أتمنى الآن إضافة كرة ثانية إلى النافذة، وعندما يصطاد الاثنان لهم لترتد بعضهم البعض.
حتى الآن، لم تكن محاولاتي في هذا غير ناجحة. أي أفكار كيف نفعل ذلك؟ الرمز الذي لدي حتى الآن هو أدناه.
import pygame
import sys
if __name__ =='__main__':
ball_image = 'Beachball.jpg'
bounce_sound = 'Thump.wav'
width = 800
height = 600
background_colour = 0,0,0
caption= 'Bouncing Ball animation'
velocity = [1,1]
pygame.init ()
frame = pygame.display.set_mode ((width, height))
pygame.display.set_caption (caption)
ball= pygame.image.load (ball_image). convert()
ball_boundary = ball.get_rect (center=(300,300))
sound = pygame.mixer.Sound (bounce_sound)
while True:
for event in pygame.event.get():
print event
if event.type == pygame.QUIT: sys.exit(0)
if ball_boundary.left < 0 or ball_boundary.right > width:
sound.play()
velocity[0] = -1 * velocity[0]
if ball_boundary.top < 0 or ball_boundary.bottom > height:
sound.play()
velocity[1] = -1 * velocity[1]
ball_boundary = ball_boundary.move (velocity)
frame.fill (background_colour)
frame.blit (ball, ball_boundary)
pygame.display.flip()
المحلول
إليك إعادة هيكلة أساسية للغاية في التعليمات البرمجية الخاصة بك. لا يزال من الممكن ارتباطك كثيرا، ولكن يجب أن تظهر لك كيف يمكنك استخدام مثيلات الفصل.
import pygame
import random
import sys
class Ball:
def __init__(self,X,Y):
self.velocity = [1,1]
self.ball_image = pygame.image.load ('Beachball.jpg'). convert()
self.ball_boundary = self.ball_image.get_rect (center=(X,Y))
self.sound = pygame.mixer.Sound ('Thump.wav')
if __name__ =='__main__':
width = 800
height = 600
background_colour = 0,0,0
pygame.init()
frame = pygame.display.set_mode((width, height))
pygame.display.set_caption("Bouncing Ball animation")
num_balls = 1000
ball_list = []
for i in range(num_balls):
ball_list.append( Ball(random.randint(0, width),random.randint(0, height)) )
while True:
for event in pygame.event.get():
print event
if event.type == pygame.QUIT:
sys.exit(0)
frame.fill (background_colour)
for ball in ball_list:
if ball.ball_boundary.left < 0 or ball.ball_boundary.right > width:
ball.sound.play()
ball.velocity[0] = -1 * ball.velocity[0]
if ball.ball_boundary.top < 0 or ball.ball_boundary.bottom > height:
ball.sound.play()
ball.velocity[1] = -1 * ball.velocity[1]
ball.ball_boundary = ball.ball_boundary.move (ball.velocity)
frame.blit (ball.ball_image, ball.ball_boundary)
pygame.display.flip()
نصائح أخرى
ربما يجب عليك إنشاء فئة لتمثيل كرة الشاطئ الخاص بك. ثم تكون مثيل أكبر عدد ممكن، ووضع المثيلات في قائمة بيثون.
بعد ذلك تذهب من خلال تلك القائمة على كل إطار، تحديث وتقديم كل منها.
ستحتاج إلى تضمين طريقة لاختبار الاصطدام مقابل كرة أخرى (هذا بسيط للدوائر). إذا تم اكتشاف تصادم، يجب أن تحاكي الكرات المعنية إرتدادا بعيدا عن بعضها البعض.