使用midi事件让玩家在游戏中移动的方法

时间:2017-07-11 22:46:46

标签: python events pygame midi

我用pygame模块制作了一些小游戏,很有趣。但是,现在我正在尝试使用pygame.midi通过midi用钢琴移动角色。有问题。我做到了但不是我想要的方式,因为 角色有时移动而其他移动不移动。我想我知道问题出在哪里:如果我理解正确,pygame.event.get()函数总是“捕获”事件,那么什么时候(在游戏的主循环内)并不重要,所以我认为我的代码没有发生这种情况,我的意思是,我认为玩家并不总是做应该做的事情,因为midi输入必须在特定的“时间”而不是pygame.event.get()。我查看了pygame文档,似乎有一个功能可以解决这个问题:pygame.midi.midis2events(),但我不知道如何使用它。问题只是: 如何通过midi用pygame将角色移动到钢琴中以便角色每次移动?

import pygame as pg, pygame.midi 

WIDTH = 800
HEIGHT = 600
FPS = 60

BLACK = (0,0,0)
BLUE = (0,0,255)


pg.init()
pg.midi.init()
screen = pg.display.set_mode((WIDTH,HEIGHT))
pg.display.set_caption('STACKOVERFLOW_EXAMPLE_MIDI')
clock = pg.time.Clock()

running = True

inp = pg.midi.Input(1)
x = WIDTH//2
y = HEIGHT//2
speedx = 0

midi_list = []

while running:
    clock.tick(FPS)
    if inp.poll():
        midi_value = inp.read(1000)[0][0][1]
        if midi_value==57:
            midi_list.append(midi_value)
            if len(midi_list)==1:
                speedx = -1
            else:
                speedx = 0
                midi_list = []
        if midi_value == 63:
            running = False
    x = x+speedx
    screen.fill(BLUE)
    pg.draw.rect(screen,BLACK,[x,y,50,60])
    pg.display.update()
    pg.display.flip()

pg.quit()

我需要当按下钢琴的键A3(特定音符)时玩家向左(或向右)移动,并且当玩家停止移动时 钥匙已经发布。在代码的这个特定片段中,还要做一些事情,比如按一个钢琴的键,不管是否被按下,都要拍一个子弹,简而言之,我可以用键盘事件做同样的事情。 / p>

1 个答案:

答案 0 :(得分:0)

OK!我发现并回答了目前运作良好的问题:

if inp.poll():
    s(0.1)
    midi_values = inp.read(1000)

    for midi in midi_values:
        midi_value = midi[0][1]
        #Movement to the left
        if midi_value==57:
            midi_list.append(midi_value)
            if len(midi_list)==1:
                speedx = -50

修改代码以便迭代列表midi_values给出了正确的输入 - 输出响应,而没有我遇到的不稳定性。此外,我确实引入了睡眠(0.1)延迟,并且在没有太多CPU使用的情况下运行良好。我在这里找到了答案: https://www.reddit.com/r/learnpython/comments/36dxu9/python_whileloop_cpu_demanding/

我现在发现的唯一问题是pygame窗口停止,消息没有响应(没有响应或类似的东西),它停止工作。 例如,我用钢琴键移动的立方体没有做任何事情,但关闭程序的关键确实工作正常!!