当前位置: 首页 > 知识库问答 >
问题:

在pygame中使用midi事件使玩家移动的方法

訾稳
2023-03-14

我做了一些小游戏与pyplay模块,它一直很有趣。然而,现在我正试图通过midi用钢琴移动角色pygame.midi.有问题。我做到了,但不是以我想的方式,因为角色有时会移动,有时不会。我想我知道问题在哪里:如果我理解正确,pygame.event.get()函数捕捉事件总是,它不重要的时候(在游戏的主循环内),所以我认为用我的代码这不是发生,我的意思是,我相信玩家并不总是做应该做的事情,因为midi输入必须在特定的“时间”而不是pygame.event.get()。我看了pyplay留档,似乎有一个函数,做的诀窍:pygame.midi.midis2事件(),但我不知道如何使用它。问题只是:我如何通过midi与pyplay通过钢琴移动角色,以便角色每次移动?

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键(一个特定的音符)被按下时,演奏者向左(或向右)移动,当琴键被释放时,演奏者停止移动。在这个特定的代码片段中,我还可以做一些事情,比如按钢琴键,不管是否被按下,都可以射出一颗子弹,简言之,我可以用键盘事件做同样的事情。

共有1个答案

孔君浩
2023-03-14

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_值,可以提供正确的输入输出响应,而不会出现我所经历的不稳定性。此外,我还引入了睡眠(0.1)延迟,在不占用太多cpu的情况下工作良好。我在这里找到了答案:https://www.reddit.com/r/learnpython/comments/36dxu9/python_whileloop_cpu_demanding/

我现在发现的唯一问题是pygame窗口停止显示消息no Response(不响应或类似消息),并且停止工作。例如,我用钢琴的键移动的立方体没有任何作用,但是关闭程序的键可以很好地工作!!

 类似资料:
  • 刚开始使用pygame,当你按住箭头键时,试图让一个简单的点在屏幕上移动。目前,它只在你按键时移动,但你必须重复按键。 此外,我很感激你对我目前的代码有任何建议,可以改进或改变,使之更有效。

  • 我正在做一个平台游戏,玩家有一把剑。我希望玩家只能在他下面有地面的时候攻击(所以他不能在空中攻击)。所以我实现了这段代码: 但是.. 每次返回零。虽然如果我将添加到测试玩家是否在地面的部分,它仍然存在!(虽然接地仍然等于零) 以下是完整的代码: 有人能帮忙吗?:)

  • 本篇教程,我们将介绍 Cocos Creator 的全局系统事件。 全局系统事件是指与节点树不相关的各种全局事件,由 cc.systemEvent 来统一派发,目前支持了以下几种事件: 键盘事件 设备重力传感事件 除此之外,鼠标事件与触摸事件请参考 节点系统事件 注意:目前已经不建议直接使用 cc.eventManager 来注册任何事件,cc.eventManager 的用法也不保证持续性,有可

  • 我正在做一个简单的pygame项目,它目前有从屏幕顶部落到屏幕底部的炸弹。如果玩家击中炸弹他们就会死。到现在为止一切正常。问题是当炸弹已经经过玩家,但还没有离开屏幕时,它仍然会杀死玩家。也就是说,炸弹将会通过玩家的下部,但如果你越过,在它越过屏幕的下部之前,你将会死亡。他是我的代码: 数值如下: player.rect.x的值范围为120到500,具体取决于播放机在屏幕上的位置。(当您移动时,屏幕

  • 我在这里要做的是,让角色移动到一个位置,同时避开他前进道路上的障碍。我试着用这样的东西: 我的主要问题是这个角色从一半开始走路:

  • 我是一个业余程序员,在Pyplay非常新。这是我用Pyplay编写的程序,类似于我的世界。在过去的一个小时里,我一直在尝试设置一个代码,让我的玩家在按下X键时移动到随机瓦片。我已经耗尽了大部分如果不是所有的网站和搜索引擎寻找。我已经设法完成了一半的任务;当按下X键时,化身会移动到随机磁贴,但它会移出窗口/显示器。拜托,你能看看我的代码,看看我能做些什么来改进它吗?