pygame之精靈碰撞檢測


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM