Python 如何停止绘制特定的矩形pygame

Python 如何停止绘制特定的矩形pygame,python,python-3.x,pygame,Python,Python 3.x,Pygame,我的程序是pygame中的一个“钢琴英雄”游戏,它的工作方式与吉他英雄相同,只是它是一个电脑键盘,基于弹钢琴而不是吉他。我在界面上使用了类似Synthesia的设计,矩形变成了“hitline”,你必须在正确的时间按键 我的问题是,尽管矩形一开始是按照预期的方式绘制和工作的,但它们似乎没有更新,因此顶部永远不会停止。换句话说,歌曲中的每个音符都是无限长的 我觉得这可能就是错误所在,尽管我不是100%确定 def Draw(self,hitLine): if self.coords[2]

我的程序是pygame中的一个“钢琴英雄”游戏,它的工作方式与吉他英雄相同,只是它是一个电脑键盘,基于弹钢琴而不是吉他。我在界面上使用了类似Synthesia的设计,矩形变成了“hitline”,你必须在正确的时间按键

我的问题是,尽管矩形一开始是按照预期的方式绘制和工作的,但它们似乎没有更新,因此顶部永远不会停止。换句话说,歌曲中的每个音符都是无限长的

我觉得这可能就是错误所在,尽管我不是100%确定

def Draw(self,hitLine):

    if self.coords[2][1]<hitLine:
        self.coords[0][1]+=2
        self.coords[1][1]+=2
        self.coords[2][1]+=2
        self.coords[3][1]+=2
    elif self.coords[2][1]>=hitLine and self.coords[0][1]<hitLine:
        self.coords[0][1]+=2
        self.coords[1][1]+=2
    else:
        self.drawing = False
    pygame.draw.polygon(screen,BLUE,self.coords,0)
    pygame.display.update()

我发现你的问题很有趣,而且很有趣

一些要考虑的事项。

  • 似乎没有任何理由对明显为矩形的笔记对象使用“pygame多边形”。在下面的代码中,我使用了“pygame Rect”对象

  • 主循环并不是每帧都清除屏幕

  • 在主循环中,您需要每帧清除屏幕。在我的代码中,我使用了Rect对象。当便笺的顶部点击标题时,便笺停止绘制

    import pygame
    pygame.init()
    
    gameScreen = pygame.display.set_mode((1100, 692))
    
    hitLine = 500
    
    class Note:
        def __init__(self, rect):
            self.rect = rect
            self.drawing = True
    
        def draw(self):
    
            if self.rect.y < hitLine:
                self.rect.y += 2
    
            else:
                self.drawing = False;
    
            pygame.draw.rect(gameScreen, (0, 0, 255), self.rect, 0)
    
    fNote = Note(pygame.Rect(500, -550, 80, 550))
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
    
        gameScreen.fill((0, 0, 0))
    
        if fNote.drawing:
            fNote.draw()
    
        pygame.display.update()
    
    导入pygame
    pygame.init()
    gameScreen=pygame.display.set_模式((1100692))
    hitLine=500
    课堂笔记:
    def uuu init uuuu(self,rect):
    self.rect=rect
    self.drawing=True
    def牵引(自):
    如果self.rect.y
    您是否尝试调试您的程序并检查self.coords的值是多少?矩形是否正确移动,直到达到
    hitLine
    为止?请提供一个我们可以运行和测试的,否则很难甚至不可能找到bug。我确实考虑过truing来提供一个可以测试和运行的示例,但这需要我提供几乎所有的代码。这是一个链接,指向它当前正在做的事情@Code外科医生矩形确实正确移动,因为矩形的底部离它越来越近,但是如果你观看视频,我们永远看不到矩形的顶部。我确实试过调试它,坐标确实正确地改变了,但是屏幕没有更新以显示我最近画的东西。问题是外科医生说了什么,我只是不知道what@CodeSurgeon我之前的评论留下了完整的代码?此外,它们正在正确更新。谢谢你的最后一句话-让生活变得轻松了很多,但同样的问题仍然存在。谢谢!我真不敢相信事情会这么简单。当代码外科医生说没有必要在每一个注释后都进行更新,因为这会使我的代码变得非常慢时,我有点想这会是这样的!另外,使用pygame rect有什么好处吗?这是一个大学项目,我还有其他事情要补充。现在修改我所有的代码值得吗?此外,在您的代码中,矩形将在顶部点击点击线时停止绘制,因此底部将通过点击线并可见。我将链接我的所有游戏,如果你想检查到目前为止!使用矩形会更干净,并且会使用更少的内存空间来存储2D中的所有顶点。我认为这只是一个小小的改变。而且,在游戏中,我认为在顶部击中命中线之前,让音符可见是有意义的。要阻止音符底部可见,您可以先渲染音符,然后渲染恰好位于其上的hitline下方的钢琴图像,然后只有音符顶部可见。重要的是,只有当您以正确的顺序绘制所有内容时,才更新屏幕。祝你在大学里好运!
    import pygame
    pygame.init()
    
    gameScreen = pygame.display.set_mode((1100, 692))
    
    hitLine = 500
    
    class Note:
        def __init__(self, rect):
            self.rect = rect
            self.drawing = True
    
        def draw(self):
    
            if self.rect.y < hitLine:
                self.rect.y += 2
    
            else:
                self.drawing = False;
    
            pygame.draw.rect(gameScreen, (0, 0, 255), self.rect, 0)
    
    fNote = Note(pygame.Rect(500, -550, 80, 550))
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
    
        gameScreen.fill((0, 0, 0))
    
        if fNote.drawing:
            fNote.draw()
    
        pygame.display.update()