为什么播放器类中的 self 变量不更新

问题描述

我正在使用 python 开发一个游戏,我想添加一个功能,每当按下一个键时,根据哪个键旋转玩家图像,但 self.rotation 变量永远不会更新

玩家等级代码

import pygame
from physics import Movement

class Player():
    def __init__(self,x,y,width,height,skin):
        self.x = x
        self.y = y
        self.rotation = 0
        self.width = width
        self.height = height
        self.rect = (x,height)
        self.speed = 3
        self.skin = skin

    def draw(self,win,skin):
        self.rotation = Movement.rotate(self,self.rotation)
        print(self.rotation)
        player = pygame.transform.rotate(skin.convert_alpha(),self.rotation)
        win.blit(player,self.rect)

    def move(self):
        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            self.x -= self.speed

        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            self.x += self.speed

        if keys[pygame.K_UP] or keys[pygame.K_w]:
            self.y -= self.speed

        if keys[pygame.K_DOWN] or keys[pygame.K_s]:
            self.y += self.speed

        self.update()

    def update(self):
        self.rect = (self.x,self.y,self.width,self.height)

物理课代码

import pygame

class Movement():

    def rotate(self,rotation):
        self.rotation = rotation
        keys = pygame.key.get_pressed()

        if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
            if self.rotation < 90 and self.rotation > 0:
                self.rotation += 5

        if keys[pygame.K_DOWN] or keys[pygame.K_s]:
            if self.rotation < 180 and self.rotation > 90:
                self.rotation += 5

        if keys[pygame.K_LEFT] or keys[pygame.K_a]:
            if self.rotation < 270 and self.rotation > 180:
                self.rotation += 5

        if keys[pygame.K_UP] or keys[pygame.K_w]:
            if self.rotation < 360 and self.rotation > 270:
                self.rotation += 5

        return self.rotation

游戏代码

import pygame
from Network import Network

pygame.font.init()
pygame.init()

width = 700
height = 600
fps = 60
current_id = 0
img = pygame.image.load('game_background.png')
win = pygame.display.set_mode((width,height))
pygame.display.set_caption("Astro party")
info_font = pygame.font.SysFont("Verdana",26)

player_list = {}
player_count = 0
loaded_skins = {}

n = Network()
name = 'Player'
NAME_FONT = pygame.font.SysFont("comicsans",24)

def redrawWindow(win,players,id):
    global player_count
    win.blit(img.convert(),(0,0))

    for player in players:
        p = players[player]
        if player_count < len(players):
            skin = pygame.image.load(p['skin'])
            loaded_skins[player] = skin
        p['player'].draw(win,loaded_skins[player])
        text = NAME_FONT.render(p["name"],1,0))
        win.blit(text,(p['player'].x - text.get_width()/2,p['player'].y - text.get_height()/2))
    player_count = len(players)


def main(name):
    global win,height
    run = True
    n = Network()
    clock = pygame.time.Clock()
    current_id = n.connect(name)
    player_list = n.send("get")

    while run:
        clock.tick(fps)

        player_list = n.send("get")

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                pygame.quit()

        player_list[current_id]['player'].move()
        data = player_list
        n.send(data,pick=True)

        redrawWindow(win,player_list,current_id)
        pygame.display.update()

    n.disconnect()
    pygame.quit()
    quit()

main(name)

因此,每当玩家单击特定键时,我都会尝试对玩家图像进行评级,并且我尝试打印 self.rotation,但它永远不会更新。

解决方法

self.roation 的初始值为 0。更改 Movement.rotate 中的条件。您需要检查 self.rotation >= 0 而不是 self.rotation > 0

if self.rotation < 90 and self.rotation > 0:

if self.rotation < 90 and self.rotation >= 0:

如果你想围绕它的中心旋转播放器,你需要设置旋转矩形的中心,通过原始矩形的中心设置中心位置。见How do I rotate an image around its center using PyGame?

class Player():

    def draw(self,win,skin):
        self.rotation = Movement.rotate(self,self.rotation)
        print(self.rotation)
        player = pygame.transform.rotate(skin.convert_alpha(),self.rotation)
        
        rect = pygame.Rect(rect)            
        win.blit(player,player.get_rect(centere = rect.center))