2021年5月2日星期日

How do I make an image which rotates without distorting in pygame

I am creating a racecar game and I have decided to rewrite it because I realised I was initially writing it in a very inefficient way. I initially used image an just changed their location around the screen but I am now trying to learn how to create an object and I am running into a problem which I had initially but I don't know how to fix within a class.

What happens is when I turn the image it distorts a lot and ends up slowing down because I think pygame can't handle it maybe. In my old code, I created a copy of the original image and rotated the copy of the image which fixed the distortion problem. I now don't know how to do the same within a class.

main.py

import pygame, random  #Let's import the Car Class  from Car import Car  pygame.init()      SCREENWIDTH=800  SCREENHEIGHT=600     size = (SCREENWIDTH, SCREENHEIGHT)  screen = pygame.display.set_mode(size)  pygame.display.set_caption("Car Racing")     #This will be a list that will contain all the sprites we intend to use in our game.  all_sprites_list = pygame.sprite.Group()    playerCar = Car(60, 80, 70)  playerCar.rect.x = 160  playerCar.rect.y = 100    # Add the car to the list of objects  all_sprites_list.add(playerCar)    #Allowing the user to close the window...  carryOn = True  clock=pygame.time.Clock()     while carryOn:          for event in pygame.event.get():              if event.type==pygame.QUIT:                  carryOn=False              elif event.type==pygame.KEYDOWN:                  if event.key==pygame.K_x:                       playerCar.moveRight(10)             keys = pygame.key.get_pressed()          if keys[pygame.K_LEFT]:              #playerCar.moveLeft(5)              playerCar.rot_center(2)          if keys[pygame.K_RIGHT]:              #playerCar.moveRight(5)              playerCar.rot_center(-2)          if keys[pygame.K_UP]:              playerCar.moveUp(5)          if keys[pygame.K_DOWN]:              playerCar.moveDown(5)              all_sprites_list.update()             #Drawing on Screen          screen.fill("white")             #Now let's draw all the sprites in one go. (For now we only have 1 sprite!)          all_sprites_list.draw(screen)             #Refresh Screen          pygame.display.flip()             #Number of frames per secong e.g. 60          clock.tick(25)     pygame.quit()  

Car.py

import pygame  WHITE = (255, 255, 255)     class Car(pygame.sprite.Sprite):      #This class represents a car. It derives from the "Sprite" class in Pygame.         def __init__(self, width, height, speed):          # Call the parent class (Sprite) constructor          super().__init__()                    # Instead we could load a proper picture of a car...          self.image = pygame.image.load("car.png").convert_alpha()          self.image = pygame.transform.rotate(self.image, 90)            #Initialise attributes of the car.          self.width=width          self.height=height            rect_surf = pygame.Surface((width, height), pygame.SRCALPHA)          rect_surf.fill((0, 0, 0, 0))          self.rect_surf = rect_surf             # Draw the car (a rectangle!)          pygame.draw.rect(self.image, (0, 0, 0, 0), [0, 0, self.width, self.height])             # Fetch the rectangle object that has the dimensions of the image.          self.rect = self.image.get_rect()         def moveRight(self, pixels):          self.rect.x += pixels         def moveLeft(self, pixels):          self.rect.x -= pixels         def moveUp(self, pixels):          self.rect.y -= pixels         def moveDown(self, pixels):          self.rect.y += pixels         def changeSpeed(self, speed):          self.speed = speed        def rot_center(self, angle):          rotated_image = pygame.transform.rotate(self.image, angle)          new_rect = rotated_image.get_rect(center = self.image.get_rect(center = (self.rect.x + (self.rect.width / 2), self.rect.y + (self.rect.height / 2))).center)            self.image = rotated_image          self.rect = new_rect  

Any help on how to slvoe this would be much appreciated. I had questions about how to initially turn the image on another question, How do I make an object in pygame rotate.

I also don't know how to apply the rect correctly so that it is the size of the image and doesn't create a transparent spot on the image. Any help would be much appreciated thanks. :):)

https://stackoverflow.com/questions/67362677/how-do-i-make-an-image-which-rotates-without-distorting-in-pygame May 03, 2021 at 09:54AM

没有评论:

发表评论