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

时间:2017-10-27 15:32:26

标签: python python-3.x pygame

我的节目是钢琴英雄'在pygame中的游戏,其工作方式与吉他英雄相同,不同之处在于它是用于计算机键盘,而是基于弹钢琴而不是吉他。我使用类似于Synthesia的设计作为我的界面,其中矩形下降到一个' hitline'你必须在合适的时间按下键。

我的问题是,尽管矩形首先绘制并按预期工作,但它们似乎不会更新,因此顶部会停止。换句话说,歌曲中的每个音符都是无限长的。

我觉得这可能是错误的地方,虽然我不是百分百肯定。

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

这一行位于while循环中,它只是一次更新一首歌曲中的所有矩形。

for z in notes:
        if z.drawing:
            z.Draw(hitLine)

1 个答案:

答案 0 :(得分:1)

我发现你的问题非常有趣,非常有趣!

需要考虑的一些事项。

  1. 似乎没有任何理由使用&#34; pygame polygon&#34;对于明显是矩形的Note对象。在下面的代码中,我使用&#34; pygame Rect&#34;对象

  2. 您的主循环并不是每帧都清除屏幕。

  3. 在主循环中,您需要每帧清除屏幕。在我的代码中,我使用了Rect对象。当笔记的顶部点击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()