Pygame: рисование эллипса или прямоугольника на основе аргумента конструктора



Я не знаю, правильный ли это сайт, но вы, ребята, были так полезны раньше, я хотел получить ваш совет по проблеме, которая у меня возникла с 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()


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



#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()


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

2 ответов:

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

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

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

Comments

    Ничего не найдено.