[Python] problem with rotating and translation an object in pygame

Discussão em 'Python' iniciado por Stack, Agosto 17, 2025.

  1. Stack

    Stack Membro Participativo

    I'm having an issue where when I change the direction the character is supposed to move, I get a frame where it doesn't change direction but just translates.

    So, I tried putting the rotate function before the translate one but then I encountered another problem where there is one less frame in the move, showing a stutter every time I change direction.

    This is my code: main.py

    from player import Player
    import pygame
    pygame.init()


    white = (255, 255, 255)
    index = 0

    screen_width = 660
    screen_height = 960
    screen = pygame.display.set_mode((screen_width, screen_height))

    image = pygame.image.load("Originalpacmaze.png")
    image = pygame.transform.scale(image, (screen_width, screen_height-80))
    imageRect = image.get_rect(midbottom=screen.get_rect().midbottom)

    clock = pygame.time.Clock()

    pacMan = Player(screen)

    rect_stupid1 = pygame.Rect((175, 255), (30, 215))
    rect_stupid2 = pygame.Rect((175, 450), (30, 20))
    cornerTurned = False
    while 1:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    pygame.quit()
    raise SystemExit
    if event.type == pygame.KEYDOWN:
    pacMan.previousKey = pacMan.currentKey
    pacMan.currentKey = event.key

    if index >= len(pacMan.sprites):
    index = 0
    pacManSprite = pacMan.sprites[index]
    pacManRect = pacMan.rects[index]

    pacMan.move()
    pacMan.collision(index, rect_stupid1)
    if pacManRect.colliderect(rect_stupid2) and not cornerTurned:
    cornerTurned = True
    pacMan.nextKey = pacMan.currentKey
    if pacMan.nextKey == pygame.K_LEFT:
    print("IL GIANNI")
    if pacMan.nextKey == pygame.K_RIGHT:
    print("IL GIANNI")
    if pacMan.nextKey == pygame.K_UP:
    print("IL GIANNI")
    if pacMan.nextKey == pygame.K_DOWN:
    print("IL GIANNI")
    elif cornerTurned:
    pacMan.currentKey = pacMan.nextKey
    pacMan.move()

    screen.blit(pacManSprite, pacManRect)
    pygame.draw.rect(screen, (255, 0, 0), pacManRect, 1)
    pygame.draw.rect(screen, (255, 0, 0), rect_stupid1, 1)
    pygame.draw.rect(screen, (0, 255, 0), rect_stupid2, 1)

    index += 1
    pygame.display.flip()
    clock.tick(15)


    player.py

    import pygame
    pygame.init()

    class Player(pygame.sprite.Sprite):
    def __init__(self, screen):
    super().__init__()
    self.baseSprites = [pygame.transform.scale(pygame.image.load("Pac-Man_Plus_Comparable_Sprite_Sheet (1).png"), (40, 40))]
    self.sprites = [pygame.transform.scale(pygame.image.load("Pac-Man_Plus_Comparable_Sprite_Sheet (1).png"), (40, 40))]
    self.rects = [p.get_rect(center=(screen.get_rect().center)) for p in self.baseSprites]
    self.previousKey = None
    self.currentKey = None
    self.nextKey = None
    self._speed = 5
    self._direction: str = "RIGHT"
    self._nextDirection: str = None

    def move(self):
    if self.currentKey == pygame.K_RIGHT:
    self._nextDirection = "RIGHT"
    self._rotate(0)
    self._changeX(self._speed)
    elif self.currentKey == pygame.K_UP:
    self._nextDirection = "UP"
    self._rotate(90)
    self._changeY(-self._speed)
    if self.currentKey == pygame.K_LEFT:
    self._nextDirection = "LEFT"
    self._rotate(180)
    self._changeX(-self._speed)
    elif self.currentKey == pygame.K_DOWN:
    self._nextDirection = "DOWN"
    self._rotate(270)
    self._changeY(self._speed)

    def collision(self, index, object):
    if self.rects[index].colliderect(object):
    if self.currentKey == pygame.K_RIGHT:
    self._changeX(-self._speed)
    elif self.currentKey == pygame.K_UP:
    self._changeY(self._speed)
    elif self.currentKey == pygame.K_LEFT:
    self._changeX(self._speed)
    elif self.currentKey == pygame.K_DOWN:
    self._changeY(-self._speed)
    self._onHitWall()
    else:
    self.previousKey = None

    def _changeX(self, step):
    for i in range(len(self.rects)):
    self.rects.x += step

    def _changeY(self, step):
    for i in range(len(self.rects)):
    self.rects.y += step

    def _rotate(self, angle):
    if self._direction != self._nextDirection:
    for i in range(len(self.baseSprites)):
    self.sprites = pygame.transform.rotate(self.baseSprites, angle)
    self._direction = self._nextDirection

    def _onHitWall(self):
    print("CIAO")
    self.currentKey = self.previousKey
    self.move()

    Continue reading...

Compartilhe esta Página