【问题标题】:screen.blit(image) in pygame, image disappearspygame中的screen.blit(image),图像消失
【发布时间】:2017-08-11 17:11:15
【问题描述】:

我正在尝试根据一个事件(midi 输入)在 pygame 窗口中对图像进行 blit,然后根据下一个事件(另一个 midi 输入)对另一个图像进行 blit。这里发生的情况是,当我按下 MIDI 键盘上的一个键时,图像会弹出一秒钟。我需要它留在窗口中,即使在我输入另一个输入并blit另一个图像之后。发生这种情况的是,我的 midi 键盘上的每个键都被记录为一个数字 (1-88) 并添加到 NoteList[] 然后使用 h 在窗口中显示一个图像,NoteList 中的一个项目作为 x协调。在我实际的 pygame 中,h 变量也会通过一堆函数,我只是想在一个更简单的 pygame 窗口中找出这部分。

going = True
while going:
    screen.fill(white)
    events = event_get()
    NoteList=[]
    for e in events:
        if e.type in [QUIT]:
            going = False
        if e.type in [KEYDOWN]:
            going = False
            events = pygame.event.get()
        if e.type in [pygame.midi.MIDIIN]:
            print(str(e.data1))
            NoteList.append(int(e.data1-20))
    for h in NoteList:
            screen.blit(EthnoteIMG, (int(h), 100))
    pygame.display.update()

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    如果注释应该持续存在,您需要在 while 循环之外定义 NoteList,否则每次迭代都会创建一个新的空列表。

    NoteList = []
    
    going = True
    while going:
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                going = False
            elif e.type == pygame.midi.MIDIIN:
                print(str(e.data1))
                NoteList.append(int(e.data1-20))
    
        screen.fill(white)
    
        for h in NoteList:
            screen.blit(EthnoteIMG, (int(h), 100))
    
        pygame.display.update()
    

    您可以使用enumerate函数来移动位置:

    for g, h in enumerate(NoteList):
        screen.blit(EthnoteIMG, (g*12, int(h)))
    

    【讨论】:

    • 我还建议添加一个时钟clock = pygame.time.Clock(),然后通过在while循环中调用clock.tick(30) # or 60来限制帧速率。
    • 好的,谢谢。你知道我会如何在这样的 while 循环中执行此操作:g=0 while g>8: g+=1 screen.blit(IMG, (g*12), int(h)),它只通过每次我通过 MIDI 输入内容时循环一次
    • 我在答案中添加了一段。这就是你想要的吗?
    • 我要做的是创建一个带有 4 个变量的对象,Note(x,y,z,d),然后在其上运行一个函数,Note.ExNote()它将图像插入窗口。我在彼此内部有 3 个 while 循环来确定 3 个变量,midi 输入决定第 4 个。每次我输入另一个音符时,其他 3 个变量中的一个会根据 while 循环(y+=1)略有变化,因此我可以输入音符并将它们打印到我的乐谱上。唯一的问题是我输入了一个音符,它会遍历所有循环并在整个乐谱上打印出来
    【解决方案2】:

    我相信问题在于每次 while 循环运行时您都会填满屏幕,但是当事件发生时您只是在屏幕上对该图像进行 blit...

    试试这个:

    screen.fill(white)
    going = True
    while going:
        events = event_get()
        NoteList=[]
        for e in events:
            if e.type in [QUIT]:
                going = False
            if e.type in [KEYDOWN]:
                going = False
                events = pygame.event.get()
            if e.type in [pygame.midi.MIDIIN]:
                print(str(e.data1))
                NoteList.append(int(e.data1-20))
        for h in NoteList:
            screen.fill(white)
            screen.blit(EthnoteIMG, (int(h), 100))
        pygame.display.update()
    

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 2023-03-22
      • 2020-12-13
      • 2021-09-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多