1、創建精靈和精靈組並檢測碰撞
import random import pygame from pygame.locals import * class Player(pygame.sprite.Sprite): # 繼承pygame.sprite.Sprite精靈對象 def __init__(self): super().__init__() self.image = pygame.Surface((50, 50)) # 創建Surface平面對象 self.image.fill('orange') # 填充顏色 self.rect = self.image.get_rect() # 獲取X,Y坐標和大小 print(f'rect:{self.rect}') # 不設置默認是0,0 self.rect.x = 20 # 重新設置X軸坐標 self.rect.y = 100 # 重新設置Y軸坐標 def update(self, pressed_keys, *args, **kwargs): if pressed_keys[K_UP]: # 如果按下的是方向上鍵 self.rect.move_ip(0, -5) # 更新rect的X,Y if pressed_keys[K_DOWN]: # 如果按下的是方向下鍵 self.rect.move_ip(0, 5) # 更新rect的X,Y if pressed_keys[K_LEFT]: # 如果按下的是方向左鍵 self.rect.move_ip(-5, 0) # 更新rect的X,Y if pressed_keys[K_RIGHT]: # 如果按下的是方向右鍵 self.rect.move_ip(5, 0) # 更新rect的X,Y self.stay_inside() # 保證一直在窗口里面 def stay_inside(self): # 保證一直在窗口里面 if self.rect.top < 0: # 如果上邊界小於0 self.rect.top = 0 # 設置上邊界為0 if self.rect.bottom > screen.get_height(): # 如果下邊界超過窗口高度 self.rect.bottom = screen.get_height() # 設置下邊界為窗口高度 if self.rect.left < 0: # 如果左邊界小於0 self.rect.left = 0 # 設置左邊界為0 if self.rect.right > screen.get_width(): # 如果右邊界超過窗口寬度 self.rect.right = screen.get_width() # 設置右邊界為窗口寬度 class Enemy(pygame.sprite.Sprite): # 繼承pygame.sprite.Sprite精靈對象 def __init__(self): super().__init__() self.image = pygame.Surface((50, 50)) # 創建Surface平面對象 self.image.fill('blue') # 填充顏色 self.rect = self.image.get_rect() # 獲取X,Y坐標和大小 self.rect.centerx = screen.get_width() + 20 # 設置中心X軸坐標,設置在窗口最右邊距離20 self.rect.centery = random.randint(0, screen.get_height()) # 設置中心Y軸坐標,隨機坐標 self.speed = random.randint(1, 5) # 設置速度隨機 def update(self, *args, **kwargs): self.rect.move_ip(-self.speed, 0) # 一直向左跑,速度隨機 if self.rect.right < 0: # 如果跑到頭 self.kill() # 從精靈組移除自己 ADDENEMY = USEREVENT + 1 # 自定義事件的值,必須大於USEREVENT,因為在USEREVENT之下的數值都被pygame用完了 pygame.time.set_timer(ADDENEMY, 500) # 定時器,用於生成敵人,負責把事件傳入PyGame的事件隊列中 pygame.init() # 初始化pygame screen = pygame.display.set_mode((300, 300)) # 創建窗口 player = Player() # 創建Player對象 running = True clock = pygame.time.Clock() # 創建Clock用於跟蹤時間 enemies = pygame.sprite.Group() # 定義精靈組,用於存放enemy all_sprite = pygame.sprite.Group() # 定義精靈組,用於存放所有精靈 all_sprite.add(player) # 添加player到精靈組 while running: for event in pygame.event.get(): # 獲取所有事件 if event.type == KEYDOWN: # 獲取按鈕按下事件 if event.key == K_ESCAPE: # 如果是按下了ESC鍵 running = False if event.type == QUIT: # 如果是QUIT事件,如點擊關閉窗口按鈕 running = False if event.type == ADDENEMY: # 監控自定義事件 enemy = Enemy() # 創建敵人 enemies.add(enemy) # 添加到enemies精靈組 all_sprite.add(enemy) # 添加到all_sprite精靈組 clock.tick(100) # 每秒刷新多少幀,不設置按鍵后移動的飛快 pressed_key = pygame.key.get_pressed() # 獲取按鍵 screen.fill(color='white') # 為窗口填充白色 all_sprite.update(pressed_key) # 更新組中的精靈位置 all_sprite.draw(screen) # 顯示整個精靈組中的精靈 # 碰撞檢測,檢測player和enemies精靈組中精靈是否碰撞 collide_sprite = pygame.sprite.spritecollideany(player, enemies) if collide_sprite: # 如果碰撞,返回精靈組中的碰撞精靈 collide_sprite.kill() # 從精靈組移除自己 pygame.display.update() # 刷新整個平面 或者 pygame.display.flip() pygame.quit() # 退出pygame