【发布时间】:2014-09-23 16:06:36
【问题描述】:
我目前正在使用 Pygame 开发游戏,我决定将我的所有 GUI 对象组合在一个字典中,如下所示:
gui_objects = {
# The GuiObject parameters define a rect (for positioning) and background colour.
"healthbar" : GuiObject((10, 10, 100, 20), Colour.BLUE),
"mini_map" : GuiObject((10, 400, 50, 50), Colour.WHITE)
}
我像这样对 GUI 对象进行分组的原因是这样我可以轻松地修改它们:
gui_objects.get("mini_map").set_enabled(false)
现在,当我想将我的 GUI 对象渲染到屏幕上时,我只是这样做了:
for key, value in gui_objects.iteritems():
value.render(screen)
这可行,但由于某种原因,白色的“mini_map” GuiObject 被渲染在“healthbar” GuiObject 下方。我决定将“mini_map”放在字典中“healthbar”的上方,但这并没有改变。但现在这是奇怪的部分。如果我分别渲染 GUI 对象,即分别调用它们的 render() 函数,如下所示:
gui_objects.get("healthbar").render(screen)
gui_objects.get("mini_map" ).render(screen)
然后 GuiObjects 正确重叠。我现在的问题是,当我使用 for 循环渲染它们时,为什么我的 GuiObjects 不能正确重叠?然而,它们在单独渲染时重叠得很好?
很遗憾,我无法上传图片,因为我没有足够的声誉 ¬_¬ 但是,这是源代码:
import pygame
# Just a definition of a few colours
class Colour(object):
WHITE = (255, 255, 255)
GREY = (128, 128, 128)
BLUE = ( 64, 128, 255)
# GuiObject is just a rectangle with a colour at the moment (for testing purposes).
class GuiObject(object):
def __init__(self, rect, colour):
self.rect = rect
self.colour = colour
def render(self, screen):
pygame.draw.rect(screen, self.colour, self.rect)
def main():
############################################################################
# Initialise
pygame.init()
screen = pygame.display.set_mode((800, 600))
# if render_type = 0 then render GuiObjects using a for loop
# if render_type = 1 then render GuiObjects separately.
render_type = 1
gui_objects = {
"hpbar_bg" : GuiObject(( 0, 0, 150, 600), (Colour.BLUE)),
"enemy_hpbar" : GuiObject((10, 10, 200, 400), (Colour.WHITE)),
}
############################################################################
# Main loop
while True:
########################################################################
# Event Handling
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit(0)
########################################################################
# Render
screen.fill((0, 0, 0))
# Here, I render the GuiObjects.
if render_type == 0:
# This for loop messes up overlapping.
for key, value in gui_objects.iteritems():
value.render(screen)
elif render_type == 1:
# This works fine.
gui_objects.get("hpbar_bg").render(screen)
gui_objects.get("enemy_hpbar").render(screen)
pygame.display.flip()
if __name__ == "__main__":
main()
有没有人知道为什么在使用 for 循环时重叠的 GuiObjects 不能正常工作?
我希望我已经足够清楚地解释了自己。如果不是,请询问,我会尽力澄清。
【问题讨论】:
标签: python pygame rendering overlapping