Пигамат Поворот прямоугольников на поверхности - PullRequest
1 голос
/ 17 марта 2019

У меня проблемы с отслеживанием двух прямоугольников, которые я выбрасываю на поверхность после того, как я поворачиваю эту поверхность.На поверхности нарисованы три прямоугольника, представляющих игрока.При нажатии левой и правой клавиш все прямоугольники вращаются вокруг центральной точки правильно.Когда клавиша пробела нажата, «огни» должны включаться и выключаться, однако они всегда перерисовываются в нижней части поверхности.Можете посоветовать, что я делаю не так?

import pygame
from pygame.locals import *


class Player(pygame.sprite.Sprite):
    height = 48
    width = 48
    colour = (30,144,255)

    def __init__(self):
        super(Player, self).__init__()
        self.surf = pygame.Surface((self.width, self.height))
        self.surf.fill((0, 0, 0))
        self.rect = self.surf.get_rect(center = (screen_width / 2, screen_height / 2))
        self.rotation = 0
        self.PlayerBody = pygame.draw.rect(self.surf, self.colour, Rect(15, 15, 20, 35))
        self.PlayerLightLeft = pygame.draw.rect(self.surf, (125, 0, 0), Rect(19, 45, 4, 4))
        self.PlayerLightRight = pygame.draw.rect(self.surf, (125, 0, 0), Rect(27, 45, 4, 4))
        self.lights = False
        self.lightsOnColour = (255, 0, 0)
        self.lightsOffColour = (125, 0, 0)
        self.lightsColour = self.lightsOffColour

    def update(self, pressedKey):
        if pressedKey == pygame.K_RIGHT:
            self.surf = pygame.transform.rotate(self.surf, -90)
        if pressedKey == pygame.K_LEFT:
            self.surf = pygame.transform.rotate(self.surf, 90)
        if pressedKey == pygame.K_SPACE:
            if self.lights:
                self.lightsColour = self.lightsOffColour
                self.lights = False
            else:
                self.lightsColour = self.lightsOnColour
                self.lights = True
        # always draws rectangles at the bottom of the surface
            self.PlayerLightLeft = pygame.draw.rect(self.surf, self.lightsColour, self.PlayerLightLeft)
            self.PlayerLightRight = pygame.draw.rect(self.surf, self.lightsColour, self.PlayerLightRight)


# initialize pygame
pygame.init()

screen_width = 800
screen_height = 600

screen = pygame.display.set_mode((screen_width, screen_height))
background = pygame.Surface(screen.get_size())
background.fill((255, 255, 255))

Player = Player()

running = True

while running:
    pressedKey = pygame.K_0
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False
            pressedKey = event.key
        elif event.type == QUIT:
            running = False
    screen.blit(background, (0, 0))
    Player.update(pressedKey)
    screen.blit(Player.surf, Player.rect)

    pygame.display.flip()

# end of game, quit
pygame.quit()

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Бриллиант @ Rabbid76!Спасибо!

Обновлен код ниже на случай, если у кого-то возникнет подобная проблема.

import pygame
from pygame.locals import *


class Player(pygame.sprite.Sprite):
    height = 48
    width = 48
    colour = (30,144,255)

    def __init__(self):
        super(Player, self).__init__()
        self.surf = pygame.Surface((self.width, self.height))
        self.surf.fill((0, 0, 0))
        self.rect = self.surf.get_rect(center = (screen_width / 2, screen_height / 2))
        self.angle = 0
        self.PlayerBody = pygame.draw.rect(self.surf, self.colour, Rect(15, 15, 20, 35))
        self.PlayerLightLeft = pygame.draw.rect(self.surf, (125, 0, 0), Rect(19, 45, 4, 4))
        self.PlayerLightRight = pygame.draw.rect(self.surf, (125, 0, 0), Rect(27, 45, 4, 4))
        self.lights = False
        self.lightsOnColour = (255, 0, 0)
        self.lightsOffColour = (125, 0, 0)
        self.lightsColour = self.lightsOffColour

    def update(self, pressedKey):
        if pressedKey == pygame.K_RIGHT:
            self.angle = (self.angle - 90) % 360
        if pressedKey == pygame.K_LEFT:
            self.angle = (self.angle + 90) % 360
        if pressedKey == pygame.K_SPACE:
            if self.lights:
                self.lightsColour = self.lightsOffColour
                self.lights = False
            else:
                self.lightsColour = self.lightsOnColour
                self.lights = True
            self.PlayerLightLeft = pygame.draw.rect(self.surf, self.lightsColour, self.PlayerLightLeft)
            self.PlayerLightRight = pygame.draw.rect(self.surf, self.lightsColour, self.PlayerLightRight)


# initialize pygame
pygame.init()

screen_width = 800
screen_height = 600

screen = pygame.display.set_mode((screen_width, screen_height))
background = pygame.Surface(screen.get_size())
background.fill((255, 255, 255))

Player = Player()

running = True

while running:
    pressedKey = pygame.K_0
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False
            pressedKey = event.key
        elif event.type == QUIT:
            running = False
    screen.blit(background, (0, 0))
    Player.update(pressedKey)
    rotSurf = pygame.transform.rotate(Player.surf, Player.angle)
    screen.blit(rotSurf, Player.rect)

    pygame.display.flip()

# end of game, quit
pygame.quit()
0 голосов
/ 17 марта 2019

Не поворачивайте поверхность игрока, когда нажата клавиша, но добавьте атрибут angle к классу Player, который хранит текущий угол поверхности.
Измените angle, когда *Нажата клавиша 1005 * или K_LEFT.

class Player(pygame.sprite.Sprite):
    height = 48
    width = 48
    colour = (30,144,255)

    def __init__(self):
        super(Player, self).__init__()

        # [...]

        self.angle = 0

    def update(self, pressedKey):
        if pressedKey == pygame.K_RIGHT:
            self.angle = (self.angle - 90) % 360
        if pressedKey == pygame.K_LEFT:
            self.angle = (self.angle + 90) % 360
        # [...] 

. Это приводит к тому, что исходная поверхность никогда не изменяется, и изменение «источников света» всегда будет работать.

Создайте повернутую поверхность, котораяповорачивается на Player.angle и blit вращаемая поверхность:

rotSurf = pygame.transform.rotate(Player.surf, Player.angle)
screen.blit(rotSurf, Player.rect)

...