Python Pyglet on_key_press_和on_mouse_运动非常不一致 背景

Python Pyglet on_key_press_和on_mouse_运动非常不一致 背景,python,input,pyglet,Python,Input,Pyglet,我一直在玩弄皮格勒,无意中发现了这家伙的雷管克隆。Github在这里: 我已经做了一些修改(针对Python 3和我自己的一些首选项),完整的代码如下: 问题 当我运行代码时,它有时可能不会记录任何鼠标移动或按键。这种情况很少见,但偶尔也会发生。我会说,在10次中,它只会断一次 细节 我甚至不知道罪魁祸首是什么,但我将提供一些代码片段 这是不可预测的,但有一些方法可以解决它。目前唯一可靠的方法是强制退出(而不仅仅是退出)应用程序,然后重新启动它 我不知道为什么,我已经尝试了各种方法来修复它 如果

我一直在玩弄皮格勒,无意中发现了这家伙的雷管克隆。Github在这里:

我已经做了一些修改(针对Python 3和我自己的一些首选项),完整的代码如下:

问题 当我运行代码时,它有时可能不会记录任何鼠标移动或按键。这种情况很少见,但偶尔也会发生。我会说,在10次中,它只会断一次

细节 我甚至不知道罪魁祸首是什么,但我将提供一些代码片段

这是不可预测的,但有一些方法可以解决它。目前唯一可靠的方法是强制退出(而不仅仅是退出)应用程序,然后重新启动它

我不知道为什么,我已经尝试了各种方法来修复它

如果有必要的话,我正在使用macOS Mojave、Python 3.8.2和Pyglet 1.5.14

下面是窗口的
\uuuuu init\uuuuu
函数:

def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # Whether or not the window exclusively captures the mouse.
        self.exclusive = False

        # When flying gravity has no effect and speed is increased.
        self.flying = False

        # Strafing is moving lateral to the direction you are facing,
        # e.g. moving to the left or right while continuing to face forward.
        #
        # First element is -1 when moving forward, 1 when moving back, and 0
        # otherwise. The second element is -1 when moving left, 1 when moving
        # right, and 0 otherwise.
        self.strafe = [0, 0]

        # Current (x, y, z) position in the world, specified with floats. Note
        # that, perhaps unlike in math class, the y-axis is the vertical axis.
        self.position = (0, 0, 0)

        # First element is rotation of the player in the x-z plane (ground
        # plane) measured from the z-axis down. The second is the rotation
        # angle from the ground plane up. Rotation is in degrees.
        #
        # The vertical plane rotation ranges from -90 (looking straight down) to
        # 90 (looking straight up). The horizontal rotation range is unbounded.
        self.rotation = (0, 0)

        # Which sector the player is currently in.
        self.sector = None

        # The crosshairs at the center of the screen.
        self.reticle = None

        # Velocity in the y (upward) direction.
        self.dy = 0

        # A list of blocks the player can place. Hit num keys to cycle.
        self.inventory = [BRICK, GRASS, SAND]

        # The current block the user can place. Hit num keys to cycle.
        self.block = self.inventory[0]

        # Convenience list of num keys.
        self.num_keys = [
            key._1, key._2, key._3, key._4, key._5,
            key._6, key._7, key._8, key._9, key._0]

        # Instance of the model that handles the world.
        self.model = Model()

        # The label that is displayed in the top left of the canvas.
        self.label = pyglet.text.Label('', font_name='Arial', font_size=18,
            x=10, y=self.height - 10, anchor_x='left', anchor_y='top',
            color=(0, 0, 0, 255))

        # This call schedules the `update()` method to be called
        # TICKS_PER_SEC. This is the main game event loop.
        pyglet.clock.schedule_interval(self.update, 1.0 / TICKS_PER_SEC)
以下是输入处理程序:

def on_mouse_press(self, x, y, button, modifiers):
        """ Called when a mouse button is pressed. See pyglet docs for button
        amd modifier mappings.

        Parameters
        ----------
        x, y : int
            The coordinates of the mouse click. Always center of the screen if
            the mouse is captured.
        button : int
            Number representing mouse button that was clicked. 1 = left button,
            4 = right button.
        modifiers : int
            Number representing any modifying keys that were pressed when the
            mouse button was clicked.

        """
        if self.exclusive:
            vector = self.get_sight_vector()
            block, previous = self.model.hit_test(self.position, vector)
            if (button == mouse.RIGHT) or \
                    ((button == mouse.LEFT) and (modifiers & key.MOD_CTRL)):
                # ON OSX, control + left click = right click.
                if previous:
                    self.model.add_block(previous, self.block)
            if button == pyglet.window.mouse.LEFT and block:
                texture = self.model.world[block]
                self.model.remove_block(block)
        else:
            self.set_exclusive_mouse(True)

    def on_mouse_motion(self, x, y, dx, dy):
        """ Called when the player moves the mouse.

        Parameters
        ----------
        x, y : int
            The coordinates of the mouse click. Always center of the screen if
            the mouse is captured.
        dx, dy : float
            The movement of the mouse.

        """
        if self.exclusive:
            m = 0.15
            x, y = self.rotation
            x, y = x + dx * m, y + dy * m
            y = max(-90, min(90, y))
            self.rotation = (x, y)

    def on_key_press(self, symbol, modifiers):
        if symbol == key.W:
            self.strafe[0] -= 1
        if symbol == key.S:
            self.strafe[0] += 1
        if symbol == key.A:
            self.strafe[1] -= 1
        if symbol == key.D:
            self.strafe[1] += 1
        if symbol == key.SPACE:
            if self.dy == 0:
                self.dy = JUMP_SPEED
        if symbol == key.ESCAPE:
            self.set_exclusive_mouse(False)
        if symbol == key.TAB:
            self.flying = not self.flying
        if symbol in self.num_keys:
            index = (symbol - self.num_keys[0]) % len(self.inventory)
            self.block = self.inventory[index]
最后,这里是设置:

    """ Configure the OpenGL fog properties.

    """
    # Enable fog. Fog "blends a fog color with each rasterized pixel fragment's
    # post-texturing color."
    glEnable(GL_FOG)
    # Set the fog color.
    glFogfv(GL_FOG_COLOR, (GLfloat * 4)(0.5, 0.69, 1.0, 1))
    # Say we have no preference between rendering speed and quality.
    glHint(GL_FOG_HINT, GL_DONT_CARE)
    # Specify the equation used to compute the blending factor.
    glFogi(GL_FOG_MODE, GL_LINEAR)
    # How close and far away fog starts and ends. The closer the start and end,
    # the denser the fog in the fog range.
    glFogf(GL_FOG_START, 50.0)
    glFogf(GL_FOG_END, 100.0)


def setup():
    """ Basic OpenGL configuration.

    """
    # Set the color of "clear", i.e. the sky, in rgba.
    glClearColor(0.5, 0.69, 1.0, 1)
    # Enable culling (not rendering) of back-facing facets -- facets that aren't
    # visible to you.
    glEnable(GL_CULL_FACE)
    # Set the texture minification/magnification function to GL_NEAREST (nearest
    # in Manhattan distance) to the specified texture coordinates. GL_NEAREST
    # "is generally faster than GL_LINEAR, but it can produce textured images
    # with sharper edges because the transition between texture elements is not
    # as smooth."
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    setup_fog()


def main():
    window = Window(width=800, height=600, caption='Minecraft', resizable=True)
    # Hide the mouse cursor and prevent the mouse from leaving the window.
    setup()

if __name__ == '__main__':
    main()
    pyglet.app.run()

下面是
texture.png

下面是一个正在发生的情况的示例(黑色圆圈表示我单击了鼠标,最后,我快速按下了W):

我所做的 以下是我迄今为止所做的工作:

  • 看看Pyglet文档
  • 用不同的措辞和关键词研究谷歌

听起来可能是与Mac相关的问题。下面是一个关于Mac出现类似情况的错误报告:

我想尝试的一件事就是尝试一个简单的设置,看看用最少的代码是否仍然存在问题。如果这种情况仍然发生,那么Mac/Pyglet交互中很可能存在错误。如果基本示例有效,则Minecraft示例中可能存在错误

import pyglet

window = pyglet.window.Window()

@window.event
def on_draw():
    print('on_draw')
    window.clear()

@window.event
def on_mouse_motion(x, y, dx, dy):
    print('on_mouse_motion', x, y, dx, dy)

@window.event
def on_key_press(symbol, modifiers):
    print('on_key_press', symbol, modifiers)

pyglet.app.run()

您好,谢谢您的回复。我尝试了一个简单的设置,它100%的时间都能正常工作。IDK为什么。奇怪的是,这可能与游戏使用的“独占”鼠标设置有关。试着评论一下独家新闻,看看是否有帮助。好的,谢谢!我试试看,很有效,谢谢!