如何在pygame中使用图像进行碰撞检测

2024-09-30 12:11:16 发布

您现在位置:Python中文网/ 问答频道 /正文

import pygame
import os

pygame.init()
# Images
bgImg = pygame.image.load("Images/background.png")
playerImgRight = (pygame.image.load("Images/playerRight.png"))
playerImgLeft = pygame.image.load("Images/playerLeft.png")
playerImgBack = pygame.image.load("Images/playerBack.png")
chestClosed = pygame.transform.scale(pygame.image.load("Images/chestsClosed.png"), (30, 40))
chestOpened = pygame.transform.scale(pygame.image.load("Images/chestOpen.png"), (30, 40))
currentPlayerImg = playerImgBack

screen = pygame.display.set_mode((800, 800))
pygame.display.set_caption("Richmonia")
pygame.display.set_icon(currentPlayerImg)
clock = pygame.time.Clock()

playerX = 380
playerY = 380
playerXSpeed = 0
playerYSpeed = 0

胸科 我想要胸部更新功能中的碰撞检测

class Chest:
    def __init__(self, x, y, openImage, closeImage, playerX, playerY):
        self.x = x
        self.y = y
        self.openImage = openImage
        self.closeImage = closeImage
        self.currentImage = self.closeImage
        self.playerX = playerX
        self.playerY = playerY


    def update(self):
        print("Placeholder")

    def show(self):
        screen.blit(self.currentImage, (self.x, self.y))


chestOne = Chest(100, 100, chestOpened, chestClosed, playerX, playerY)

running = True
while running:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                currentPlayerImg = playerImgBack
                playerYSpeed = -5
            if event.key == pygame.K_DOWN:
                currentPlayerImg = playerImgBack
                playerYSpeed = 5
            if event.key == pygame.K_LEFT:
                currentPlayerImg = playerImgLeft
                playerXSpeed = -5
            if event.key == pygame.K_RIGHT:
                currentPlayerImg = playerImgRight
                playerXSpeed = 5

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                playerYSpeed = 0
            if event.key == pygame.K_DOWN:
                playerYSpeed = 0
            if event.key == pygame.K_LEFT:
                playerXSpeed = 0
            if event.key == pygame.K_RIGHT:
                playerXSpeed = 0

    if playerY <= 0:
        playerY = 0
    if playerY >= 740:
        playerY = 740
    if playerX <= 0:
        playerX = 0
    if playerX >= 760:
        playerX = 760

    playerX += playerXSpeed
    playerY += playerYSpeed
    screen.blit(bgImg, (0, 0))
    chestOne.show()
    chestOne.update()

    screen.blit(currentPlayerImg, (playerX, playerY))
    pygame.display.update()
pygame.quit()
quit()

我知道有一种使用精灵的方法,但我想知道是否有一种仅使用图像的方法。 还有一个问题是如何获得fps


Tags: keyimageselfeventifpngloadpygame
1条回答
网友
1楼 · 发布于 2024-09-30 12:11:16

使用^{}对象和^{}查找矩形和对象之间的冲突。
^{}返回一个大小为曲面对象的矩形,该矩形始终从(0,0)开始,因为曲面对象没有位置。矩形的位置可以通过关键字参数指定:

running = True
while running:
    # [...]

    player_rect = currentPlayerImg.get_rect(topleft = (playerX, playerY))
    chestOne_rect = chestOne.currentImage.get_rect(topleft = (self.x, self.y))
    if player_rect .colliderect(chestOne_rect):
        print("hit")

    # [...]

一个^{}对象的方法^{}以这种方式延迟游戏,循环的每次迭代都消耗相同的时间段。
因此,在您的情况下,每秒帧数为60:

while running:
   clock.tick(60)

^{}返回自上次调用以来经过的毫秒数。如果在应用程序循环中调用它,则这是自上一帧以来经过的毫秒数

while run:
    ms_since_last_frame = clock.tick(60)

相关问题 更多 >

    热门问题