pygame拖动方块示例.py

"""pygame拖动方块示例.py
"""
import pygame
import random
 
# 定义颜色常量
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
 
 
class Block(pygame.sprite.Sprite):
    """
    方块类,继承自角色类
    """
 
    def __init__(self, color, width, height):
        """ 初始化方法,传递的参数为颜色,宽度,高度"""
 
        # 调用父类的初始化方法
        super().__init__()
 
        # 创建图形,填充为color
        self.image = pygame.Surface([width, height])
        self.image.fill(color)
 
        # 新建rect属性,它的值为图像的矩形对象
        self.rect = self.image.get_rect()
 
 
class Player(Block):
    """ 此类继承自Block类,重写了update方法 """
 
    # 所携带的方块列表
    carry_block_list = []
 
    def update(self):
        """ 更新角色坐标的时候所调用的方法. """
 
        # 获取鼠标指针的坐标
        pos = pygame.mouse.get_pos()
 
        # 由于所拖曳的方块要和鼠标指针一起相对移动,所以要算出鼠标指针的相对移动距离
        diff_x = self.rect.x - pos[0]
        diff_y = self.rect.y - pos[1]
 
        # 遍历每个已拖到的小方块
        for block in self.carry_block_list:
            block.rect.x -= diff_x
            block.rect.y -= diff_y
 
        # 把玩家方块坐标设为鼠标指针坐标
        self.rect.x = pos[0]
        self.rect.y = pos[1]
 
# 初始化pygame引擎
pygame.init()
 
# 新建屏幕对象,它是一个surface对象
screen_width = 700
screen_height = 400
screen = pygame.display.set_mode([screen_width, screen_height])
pygame.display.set_caption("拖动方块示例")
 
# 所有方块列表
block_list = pygame.sprite.Group()
 
# 所有角色列表
all_sprites_list = pygame.sprite.Group()
 
for i in range(50):
    # 实例化一个方块
    block = Block(BLACK, 20, 15)
 
    # 设定随机坐标
    block.rect.x = random.randrange(screen_width)
    block.rect.y = random.randrange(screen_height)
 
    # 增加到方块列表和所有角色列表
    block_list.add(block)
    all_sprites_list.add(block)
 
# 实例化红色的方块
player = Player(RED, 20, 15)
all_sprites_list.add(player)
 
# 用来结束while循环的逻辑变量
done = False
 
# 设置刷新率的时钟对象
clock = pygame.time.Clock()
 
# 隐藏鼠标指针
pygame.mouse.set_visible(False)
 
# -------- 主程序循环-----------
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
 
        elif event.type == pygame.MOUSEBUTTONDOWN:
            # 当按下鼠标指针时,对player和所有方块进行碰撞检测,返回碰撞的方块列表
            blocks_hit_list = pygame.sprite.spritecollide(player, block_list, False)
 
            # 碰撞到的方块列表也就是玩家所能携带的方块列表
            player.carry_block_list = blocks_hit_list
 
        elif event.type == pygame.MOUSEBUTTONUP:
            # 鼠标按键弹起,所携带列表清空
            player.carry_block_list = []
 
    all_sprites_list.update()
 
    # 填充屏幕为白色
    screen.fill(WHITE)
 
    # 重画所有角色
    all_sprites_list.draw(screen)
 
    # 限制刷新率为60秒
    clock.tick(60)
 
    # 显示
    pygame.display.flip()
 
pygame.quit()