Pygame: рисование эллипса или прямоугольника на основе аргумента конструктора - PullRequest
2 голосов
/ 24 октября 2011

Я не знаю, правильный ли это веб-сайт, но вы, ребята, уже так помогали, что я хотел бы получить ваш совет по проблеме, возникшей у меня с Python и Pygame.

Я делаю простую игру, и только недавно начал изучать Python (до сих пор его люблю), и на данный момент у меня есть конструктор спрайтов, который я использую. Этот конструктор будет управлять моими объектами, но я хочу, чтобы он рисовал эллипс или прямоугольник на основе переданного ему аргумента.

#My code
class Block(pygame.sprite.Sprite):
    #Variables!
    speed = 2
    indestructible = True
    #Constructor
    def __init__(self, color, width, height, name, shapeType):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([width,height])
        self.image.fill(color)
        #Choose what to draw
        if shapeType == "Ellipse":
            pygame.draw.ellipse(self.image,color,[0,0,width,height])
        elif shapeType == "Rect":
            pygame.draw.rect(self.image,color,[0,0,width,height])
        elif shapeType == "":
            print("Shape type for ",name," not defined.")
            pygame.draw.rect(self.image,color,[0,0,width,height])
        #Init the Rect class for sprites
        self.rect = self.image.get_rect()

Код, который я использую для рисования квадрата, приведен ниже:

#Add 'white star' to the list
for i in range(random.randrange(100,200)):
    whiteStar = Block(white, 1, 1, "White Star", "Rect")
    whiteStar.rect.x = random.randrange(size[0])
    whiteStar.rect.y = random.randrange(size[1])
    whiteStar.speed = 2
    block_list.add(whiteStar)
    all_sprites_list.add(whiteStar)

Это прекрасно работает. Он рисует идеальный маленький белый квадрат для меня. Но это не работает:

#Create Planet
planet = Block(green, 15,15, "Planet", "Ellipse")
planet.rect.x = random.randrange(size[0])
planet.rect.y = 30
planet.speed = 1
block_list.add(planet)
all_sprites_list.add(planet)

«Планета» появляется правильно, но это происходит как квадрат. Почему это происходит? И как я могу это исправить? Должен ли я использовать растровое изображение, чтобы исправить это? Или моя кодировка неверна?

Просто для пояснения, я точно знаю, что self.rect = self.image.get_rect() действительно работает для рисования эллипса, потому что приведенная ниже кодировка работает.

#Not the code I'm using, but this works and proves self.rect = self.image.get_rect() is not the cause
# Call the parent class (Sprite) constructor
    pygame.sprite.Sprite.__init__(self) 

    # Create an image of the block, and fill it with a color.
    # This could also be an image loaded from the disk.
    self.image = pygame.Surface([width, height])
    self.image.fill(white)
    self.image.set_colorkey(white)
    pygame.draw.ellipse(self.image,color,[0,0,width,height])

    # Fetch the rectangle object that has the dimensions of the image
    # image.
    # Update the position of this object by setting the values 
    # of rect.x and rect.y
    self.rect = self.image.get_rect()

Спасибо за вашу помощь. : -)

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

В конструкторе Block вы вызываете self.image.fill(color). Это зальет все изображение спрайта этим цветом, и вы получите прямоугольник.

Пример кода, который у вас есть, вызывает self.image.set_colorkey(white) после выполнения заливки, чтобы при его рисовании фоновая заливка была прозрачной. Это, вероятно, самое быстрое решение.

1 голос
/ 24 октября 2011

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

...