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...