pygame旋转图形核心原理例子_飞碟与外星人旋转与碰撞举例.py

""" pygame旋转图形核心原理例子_飞碟与外星人旋转与碰撞举例.py """

__author__ = "李兴球"
__date__ = "2019年1月"

import pygame
import random
 
# 定义颜色常量
BLACK  = (   0,   0,   0)
WHITE  = ( 255, 255, 255)
RED    = ( 255,   0,   0)
 
# 方块类
class Block(pygame.sprite.Sprite):
 
    def __init__(self, filename):
        # 调用基类的构造方法
        super().__init__() 
 
        # 创建源图,此图不画在screen上,只是用来旋转
        self.raw_image = pygame.image.load(filename).convert_alpha()
        self.image = self.raw_image  # 这是旋转后的图形,它是最终渲染的.
 
        # 获取矩形对象,用它代表图形的坐标与宽高
        self.rect = self.image.get_rect()
         
        self.angle = 0          # 角度
        self.angle_change = 0   # 角速度
         
    def update(self):
        """这里是旋转的核心原理代码,它是对源图进行旋转,然后注意新的矩形对象要获取老的
           矩形对象的中点值"""
        self.image = pygame.transform.rotate(self.raw_image, self.angle)
        center  = self.rect.center   # 原来的旋转中心  
        self.rect = self.image.get_rect()
        self.rect.center = center    # 保持和原来中心一致
        self.angle += self.angle_change
        self.angle = self.angle % 360
 
# 实始化pygame引擎
pygame.init()
 
# 设置屏幕宽高,然后创建屏幕
screen_width = 700
screen_height = 400
screen = pygame.display.set_mode([screen_width, screen_height])
pygame.display.set_caption("旋转核心原理_飞碟与外星人旋转_作者:李兴球")
 
# 方块“列表”,用Group类创建
block_list = pygame.sprite.Group()
 
# 所有角色“列表”
all_sprites_list = pygame.sprite.Group()
 
for i in range(6):
    # 生成一个方块
    block = Block("alien.png") 
    # 给方块们设置随机位置与随机方向
    block.rect.x = random.randrange(screen_width)
    block.rect.y = random.randrange(screen_height)
    block.angle = random.randrange(360)
    block.angle_change = random.randrange(-1, 2)
    # 把方块加到方块列表和所有角色列表
    block_list.add(block)
    all_sprites_list.add(block)
     
# 创建一个红色的玩家方块
player = Block("ufo.png")
player.angle_change = 0
all_sprites_list.add(player)
 
# 当关闭窗口事件发生时,把下列变量值设为True,从而退出while
done = False
 
# 设定刷新率的时钟对象
clock = pygame.time.Clock()
 
score = 0
 
# -------- 程序主循环-----------
while not done:                       # 当没有结束时,就循环
    for event in pygame.event.get():  # 迭代每个事件
        if event.type == pygame.QUIT: # 如果单击了关闭按钮
            done = True # 这个标志就会True了
 
    # 清屏为白色
    screen.fill(RED)
 
    # 获取鼠标指针坐标 ,玩家跟随鼠标指针坐标
    player.rect.center = pygame.mouse.get_pos()
     
    all_sprites_list.update()
     
    # 检查是否玩家角色和其它方块有碰撞,返回所碰撞的方块列表
    blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True)  
     
    # 遍历每个碰到的方块
    for block in blocks_hit_list:
        score += 1
        print( score )
         
    # 重画所有的角色
    all_sprites_list.draw(screen)
     
    # 设定刷新率为60
    clock.tick(60)
 
    # 显示
    pygame.display.flip()
 
pygame.quit()