我不知道这是不是正确的网站,但你们之前一直很有帮助,我想就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)
'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()
谢谢你的帮助。 : - )
答案 0 :(得分:2)
在Block构造函数中,您调用self.image.fill(color)
。这将用该颜色填充精灵的整个图像,因此你得到一个矩形。
您在填充后调用的示例代码self.image.set_colorkey(white)
,以便在绘制时,背景填充是透明的。这可能是最快的解决方案。
答案 1 :(得分:1)
您使用给定的color
填充曲面,然后在同一color
中绘制形状。当然,它不会以这种方式可见,而你只是获得了纯色的表面,它是矩形的。