如何在pygame中反转"window.blit",或删除我制作的对象(精灵)



我试图删除一个精灵每当我点击它,然而,我不能得到原来的项目离开屏幕。似乎一旦我渲染或"绘制"它,它就会永久地停留在那里。我怎么能改变下面的代码,以摆脱"blit"我在类中产生一旦它被点击?

import pygame
pygame.init()
window = pygame.display.set_mode((1152,720))
background = pygame.image.load("images/emptyroom.jpg")
image=pygame.image.load("images/smallkey.png")
b = window.blit(pygame.image.load("images/emptyroom.jpg"), (0,0))
spritestay = True
# d = window.blit(pygame.image.load("images/leglamp.png"), (15,500))
class HiddenObject(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.i1 = pygame.image.load("images/smallkey.png")
        self.i2 = pygame.image.load("images/Clear.png")
        self.rect=self.i1.get_rect()
    def draw(self, x, y):
        while spritestay == True:
            d = window.blit(self.i1, (x,y))
#d.collidepoint(pygame.mouse.get_pos())
        while spritestay == False:
            d = window.blit(self.i1, (x,y))
pygame.display.set_caption("Eye Spy Game Test")
gameLoop = True
while gameLoop:
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            spritestay = False
        if event.type == pygame.MOUSEBUTTONUP:
            spritestay = True
        if (event.type==pygame.QUIT):
            gameLoop=False
    yotestvar = HiddenObject()
    d = yotestvar.draw(100,100)

    pygame.display.flip()
pygame.quit()

你的代码有不少问题。

不应该在主循环之前进行比特化。

如果隐藏对象重新定位就更好了。通过在构造函数中添加一个位置来改变它,并在draw方法中使用它。

def __init__(self,pos):
    ...
    self.pos = pos
def draw(self):
    window.blit(self.i1, self.pos)

你的绘制方法永远不会完成。您需要用if语句替换while语句。当spritestay为False时,您也不会绘制第二个图像。我猜你是想blblt Clear.png.

if spritestay:
    window.blit(self.i1, (x,y))
else: 
    window.blit(self.i2, (x,y))

如果Clear.png只是一个空图像,那么根本没有必要对其进行比特化。这就变成了:

if spritestay:
   window.blit(self.i1, (x,y))

你不会从draw函数返回任何东西,所以在

之后
d = yotestvar.draw(100,100)

d为None。你没有在任何地方使用d,所以你可以删除它。

你在每一帧上创建HiddenObject。我认为最好把它移到循环之前。

最后一个问题是你没有用任何颜色填充屏幕。这可能是你一直在挣扎的真正问题。以下是比特化的工作原理。

你是一个画家,在你面前是一幅画布。如果你用你的画笔画了一些东西,你怎么能摆脱它呢?唯一的方法就是在上面画点东西。在pygame中,我们使用fill方法来用某种颜色填充整个表面。

screen.fill((0,0,0)) # fills screen with black color

所以为了在屏幕上有一些东西,你需要调用screen.fill,然后绘制你想看到的任何其他对象

在pygame中,一旦你blit到屏幕上,你不能简单地删除选择的对象。相反,您必须在每次绘制之后清除屏幕,然后绘制新的更新对象。例如,如果你要做更多的东西,你必须先画它,然后擦掉它,稍微移动它,画它,然后再擦掉,等等。

因此,建议您在每次循环while循环结束时清除屏幕。对于您的情况,它看起来如下所示:

yotestvar = HiddenObject()
while gameLoop:
    window.fill((255, 255, 255)) # (255, 255, 255) RGB value for WHITE
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            spritestay = False
        if event.type == pygame.MOUSEBUTTONUP:
            spritestay = True
        if (event.type==pygame.QUIT):
            gameLoop=False
    yotestvar.draw(100,100)
    pygame.display.update()
pygame.quit()

最新更新