سؤال

لقد ترميز الرسوم المتحركة (في بيثون) لكرة الشاطئ لترتد حول الشاشة. أتمنى الآن إضافة كرة ثانية إلى النافذة، وعندما يصطاد الاثنان لهم لترتد بعضهم البعض.

حتى الآن، لم تكن محاولاتي في هذا غير ناجحة. أي أفكار كيف نفعل ذلك؟ الرمز الذي لدي حتى الآن هو أدناه.

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

نصائح أخرى

ربما يجب عليك إنشاء فئة لتمثيل كرة الشاطئ الخاص بك. ثم تكون مثيل أكبر عدد ممكن، ووضع المثيلات في قائمة بيثون.

بعد ذلك تذهب من خلال تلك القائمة على كل إطار، تحديث وتقديم كل منها.

ستحتاج إلى تضمين طريقة لاختبار الاصطدام مقابل كرة أخرى (هذا بسيط للدوائر). إذا تم اكتشاف تصادم، يجب أن تحاكي الكرات المعنية إرتدادا بعيدا عن بعضها البعض.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top