pygame矩形碰到边缘就反弹示例程序

"""
本程序创建一个矩形类,实例化后让它们在屏幕上随机移动,碰到屏幕边缘会反弹。
本程序可不必继承自pygame.sprite.Sprite实现,请自行编写。
"""

import pygame
from pygame.locals import *
from random import randint

class Rectangle(pygame.sprite.Sprite):
    
    def __init__(self,position,width,height,screen,color=(0,255,255)):
        """
           实始化,position:中心点坐标元组,width:宽度,height:高度,screen:所在屏幕,color:颜色
        """
        pygame.sprite.Sprite.__init__(self)   # 初始化父类
        self.image = pygame.Surface((width,height)) # 新建surface,代表它的图形
        self.image.fill(color)                 # 给图形填色
        self.rect = self.image.get_rect()      # 获取矩形对象
        self.rect.center = position            # 定矩形的位置
        self.dx = randint(-5,5)                # 水平方向单位位移
        self.dy = randint(-5,5)                # 垂直方向单位位移
        self.screen = screen                   # 所在的屏幕  
        self.sw = screen.get_width()           # 屏幕宽席
        self.sh = screen.get_height()          # 屏幕高度

    def update(self):
        """更新坐标"""
        self.rect.move_ip(self.dx,self.dy)     # 移动矩形
        self.bounce_on_edge()                  # 碰到边缘就反弹
        
    def bounce_on_edge(self):
        """碰到边缘就反弹"""
        if self.rect.left<=0 or self.rect.right>=self.sw : self.dx = -self.dx
        if self.rect.top<=0 or self.rect.bottom>=self.sh : self.dy = -self.dy

def main():
    """主要函数"""
    
    width,height = 480,360
    screen = pygame.display.set_mode((width,height))
    pygame.display.set_caption("pygame矩形碰到边缘就反弹示例程序")
    
    square_group = pygame.sprite.Group()       #  创建组 ,用来对方块进行统一更新与渲染

    # 初始坐标
    positions = [(100,100),(-100,100),(0,0),(-100,-100),(100,-100)]
    positions = [(x+width//2,y+height//2) for (x,y) in positions]
    square_amount = len(positions)

    # 生成矩形
    [square_group.add(Rectangle(pos,50,50,screen)) for pos in positions]

    clock = pygame.time.Clock()               # 时钟对象
    running = True                            # 控制循环的逻辑变量
    
    while running:        
        event = pygame.event.poll()          # 从事件队列中取一个事件
        if event.type == QUIT:running = False # 如果此事件为退出,则逻辑变量为False

        # 上面的内容是交互
        square_group.update()              # 更新方块的坐标
                                           # 上面这句是游戏逻辑,改变了坐标后需重画
                                           # 以便真实反映方块所在位置
        screen.fill((0,0,0))               # 填充屏幕为黑色
        square_group.draw(screen)          # 重画所有方块 

        pygame.display.update()            # 更新屏幕显示
        clock.tick(30)                     # 限制1/30秒后再循环
        
    pygame.quit()
    
    
if __name__ == "__main__":

    main()