Pygame 边界矩形不在精灵中心

Pygame bounding rect is not on sprite center

我对 pygame 有疑问。

我只是想了解碰撞。我想用 self.rect = self.image.get_bounding_rect() 在我的播放器周围实现一个矩形,但该矩形偏离中心,我无法找到一种方法使其在我的播放器精灵上居中。

矩形目前的样子:

Player spirte rectangle

这是我的播放器 class:

import pygame

# Class Variable
player_sprite_group = pygame.sprite.Group()


class Player(pygame.sprite.Sprite):
    def __init__(self, window_size, health, name):
        pygame.sprite.Sprite.__init__(self)
        self.image = self.load_character_sprites()
        self.rect = self.image.get_bounding_rect()
        self.health = health
        self.current_state = "idle"
        self.direction = "right"
        self.name = name
        self.rect.center = window_size[0] / 2, window_size[1] / 2
        self.moving_speed = 6
        self.x_moving_velocity = 0
        self.y_moving_velocity = 0
        self.add_player_to_sprite_group()

    def load_character_sprites(self):
        return pygame.image.load("../Assets/Hero Knight/Sprites/HeroKnight/Idle/HeroKnight_Idle_0.png")

    def state(self, set_state, direction):
        if direction == "right":
            self.direction = "right"
        if direction == "left":
            self.direction = "left"
        if set_state == "idle":
            self.current_state = set_state
        if set_state == "walking":
            self.current_state = set_state
        if set_state == "fight":
            self.current_state = set_state
        if set_state == "jump":
            self.current_state = set_state


    def collision(self):
        pass

    # player movement
    def player_movement(self, keys_pressed):
        if keys_pressed[pygame.K_w] or keys_pressed[pygame.K_s] or keys_pressed[pygame.K_a] or keys_pressed[pygame.K_d]:
            self.state("walking", self.direction)
        if keys_pressed[pygame.K_UP] or keys_pressed[pygame.K_w]:
            self.rect.y -= self.moving_speed
        if keys_pressed[pygame.K_DOWN] or keys_pressed[pygame.K_s]:
            self.rect.y += self.moving_speed
        if keys_pressed[pygame.K_LEFT] or keys_pressed[pygame.K_a]:
            if self.direction != "left":
                self.state("moving", "left")
                self.image = pygame.transform.flip(self.image, True, False)
            self.rect.x -= self.moving_speed
        if keys_pressed[pygame.K_RIGHT] or keys_pressed[pygame.K_d]:
            if self.direction != "right":
                self.state("walking", "right")
                self.image = pygame.transform.flip(self.image, True, False)
            self.rect.x += self.moving_speed

    def set_current_location(self):
        pass

    def update_player(self):
        player_sprite_group.update()

    def draw_player(self, screen):
        pygame.draw.rect(screen, (255, 0, 255), self.rect)
        player_sprite_group.draw(screen)

    def add_player_to_sprite_group(self):
        player_sprite_group.add(self)

这是我的 pygame 文件及其设置和游戏循环:

import pygame
import sys
from pygame.locals import *
from debug import debug
from player import Player

# clock implementation
clock = pygame.time.Clock()
# window name
pygame.display.set_caption("Dungeon crawler")
# Set the window size
window_size = [1200, 720]
# no frame window
window_frame_noframe = NOFRAME
# frame window
window_frame_frame = 0
# init the game window
screen = pygame.display.set_mode(window_size, window_frame_noframe, 32)

# create player object
player_one = Player(window_size, 100, "knight")

# test rect
test_rect = pygame.Rect(200, 300, 50, 50)

# game main loop
while True:
    # clear screen
    screen.fill((146, 244, 255))

    # debugging methods
    debug(clock, 10, 10)
    debug(player_one.current_state, 30, 10)
    debug(player_one.direction, 60, 10)
    debug(player_one.rect, 90, 10)

    # player movement
    key_pressed = pygame.key.get_pressed()
    player_one.player_movement(key_pressed)

    # event loop
    for event in pygame.event.get():
        if event.type == QUIT:
            # close the window and end the game
            pygame.quit()
            sys.exit()

    # draw collision rect
    pygame.draw.rect(screen, (255, 255, 255), test_rect)
    # draw and update player
    player_one.update_player()
    player_one.draw_player(screen)

    # show window
    pygame.display.update()
    # set fps to 60 with clock
    clock.tick(60)

希望你能帮我解决这个问题

get_bounding_rect()返回的矩形左上角不是(0, 0),外接矩形的大小不是图像的大小。使用原始图像和边界矩形时,不考虑边界矩形的偏移。您必须使用边界矩形来获得 subsurface 的 iamge:

class Player(pygame.sprite.Sprite):
    def __init__(self, window_size, health, name):
  
        pygame.sprite.Sprite.__init__(self)
 
        self.image = self.load_character_sprites()
        self.rect = self.image.get_bounding_rect()
        self.image = self.image.subsurface(self.rect)
        self.rect.center = window_size[0] / 2, window_size[1] / 2

        # [...]