Невозможно вращать и перемещать спрайт в одном коде с помощью Pygame

#python #pygame #2d

#python #pygame #2d

Вопрос:

Мне дали домашнее задание по созданию шутера сверху вниз, но каждый раз, когда я заставляю свой спрайт вращаться, линии перемещения перестают работать, и каждый раз, когда я заставляю спрайт двигаться, линии вращения начинают выходить из строя. Я никогда в жизни не использовал Pygame, но я думаю, что проблема заключается в моем непонимании команды self. Не сдерживайтесь, рассказывая мне, насколько я неправ, как я уже сказал, я раньше не касался Pygame, и я кодирую всего около 5 месяцев, так что есть вероятность, что некоторые строки в любом случае избыточны.

 import pygame
import math

class Player(pygame.sprite.Sprite):

    def __init__(self,x,y):
        super().__init__()
        self.image = pygame.image.load("blue.png")
        self.movex = 0 # move along X
        self.movey = 0 # move along Y
        self.orig_img = self.image
        self.pos = pygame.math.Vector2(x,y)
        self.rect = self.image.get_rect(center=self.pos)
        self.vel = pygame.math.Vector2(0, 0)

    def update(self):
        self.rect.x = self.rect.x   self.movex
        self.rect.y = self.rect.y   self.movey
        self.rotate()
        self.pos  = self.vel
        self.rect.center = self.pos

    def move(self,x,y):
        #https://opensource.com/article/17/12/game-python-moving-player - movement source
        self.movex  = x
        self.movey  = y

    def rotate(self):
        rel_x, rel_y = pygame.mouse.get_pos() - self.pos
        angle = -math.degrees(math.atan2(rel_y, rel_x))
        self.image = pygame.transform.rotozoom(self.orig_img, angle, 1)
        self.rect = self.image.get_rect(center=self.pos)

  
 
player = Player(200,300)
steps = 10
sprite_list = pygame.sprite.Group()
sprite_list.add(player)
  
 
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                player.move(-steps,0) 

  
     if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == ord('a'):
            player.move(steps,0)
  

Я хотел бы иметь возможность перемещать и вращать в одном коде, я не возражаю против заикания в данный момент. Извините, если я вставил слишком много кода, я действительно не знаю, в чем проблема, поэтому я решил, что лучше предоставить больше информации, чем меньше.

Ответ №1:

Вы должны изменить, self.pos а не self.rect , потому что self.rect обновляется self.pos в методе rotate() :

 def rotate(self):
    # [...]
    self.rect = self.image.get_rect(center=self.pos) # set self.rect by self.pos 
  

Вызывается обновление self.pos в update() , перед rotate() :

 class Player(pygame.sprite.Sprite):

    # [...]

    def update(self):

        #self.rect.x = self.rect.x   self.movex <--- delete
        #self.rect.y = self.rect.y   self.movey <--- delete
        self.pos = self.pos   pygame.math.Vector2(self.movex, self.movey)

        self.rotate()
        self.pos  = self.vel
        self.rect.center = self.pos
  

Комментарии:

1. Ты спасатель, честно говоря, не знаю, как я этого не заметил