繁体   English   中英

Pygame - 如何让鼠标手势移动更顺畅?

[英]Pygame - How to make mouse gesture movement smoother?

我希望能够仅使用鼠标手势在 pygame window 周围“滚动”,或者在这种情况下,“两根手指滚动”(不知道正确的术语)。

我设法做了一个示例实现:

import pygame

pygame.init()

size = (width, height) = (800, 600)
screen = pygame.display.set_mode(size)


class SceneElement:
    def __init__(self, x, y, width, height, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color

class Scene:
    def __init__(self):
        self.elements = [
            SceneElement(150, 150, 200, 200, (55, 55, 10, 0.3)),
            SceneElement(250, 300, 200, 200, (155, 200, 10, 0.5)),
        ]

    def render(self, offset):
        screen.fill((255, 255, 255))
        for element in self.elements:
            x = element.x + offset[0]
            y = element.y + offset[1]
            pygame.draw.rect(screen, element.color, (x, y, element.width, element.height))

scene = Scene()
offset = [0, 0]

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == 1027:
            if event.x == 0 and event.y == -1:
                print(event.x, event.y)
                offset[1] -= 10
            elif event.x == -1 and event.y == 0:
                offset[0] += 10
                print(event.x, event.y)
            elif event.x == 1 and event.y == 0:
                offset[0] -= 10
                print(event.x, event.y)
            elif event.x == 0 and event.y == 1:
                offset[1] += 10
                print(event.x, event.y)

    scene.render(offset)
    pygame.display.flip()

pygame.quit()

以上作品。 这是一个显示它有效的 gif 现在的问题是,我不认为这是应该如何实施的。 我没有在网上看到任何这样做的示例或现有代码。

因此,尽管上述方法有效,但感觉并不“流畅”。 尝试绕圈或沿对角线移动感觉非常不自然(如接近尾声的 gif 中所示)。 是否有更好的方法来执行上述操作(使用鼠标手势移动)或者这是正确的实现方式?

主要是你在这里要处理的是你的对角线移动没有标准化,解决这个最简单的方法就是使用pygame.Vector2作为位置等,它还有一个normalized的方法可以为你做标准化:

scene = Scene()
offset = pygame.Vector2()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEWHEEL:
            direction = pygame.Vector2(event.x, event.y).normalize()
            offset += direction * 10

    scene.render(offset)
    pygame.display.flip()

这不会影响代码 rest 的功能,因为向量可以像列表一样被索引,但是,我建议您使用pygame.Vector2来获取位置、速度和加速度以及其他物理相关的东西,因为它们更快,方便多了。

还使用常量代替一些任意的 integer 事件类型和其他东西的值,因为它使代码阅读起来容易得多。

感谢马蒂斯的回答,我设法找到了如何做到这一点的线索:

import pygame

pygame.init()

size = (width, height) = (800, 600)
screen = pygame.display.set_mode(size)


class SceneElement:
    def __init__(self, x, y, width, height, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color


class Scene:
    def __init__(self):
        self.elements = [
            SceneElement(150, 150, 200, 200, (55, 55, 10, 0.3)),
            SceneElement(250, 300, 200, 200, (155, 200, 10, 0.5)),
        ]

    def render(self, offset):
        screen.fill((255, 255, 255))
        for element in self.elements:
            x = element.x + offset[0]
            y = element.y + offset[1]
            pygame.draw.rect(screen, element.color, (x, y, element.width, element.height))


scene = Scene()
offset = pygame.Vector2()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEWHEEL:
            print(event.x, event.y)
            if event.x == 0 and event.y == 1:
                direction = pygame.Vector2(event.x, event.y).normalize()
                offset += direction * 10
            elif event.x == 0 and event.y == -1:
                direction = pygame.Vector2(event.x, event.y).normalize()
                offset += direction * 10
            elif event.x == -1 and event.y == 0:
                direction = pygame.Vector2(1, event.y).normalize()
                offset += direction * 10
            elif event.x == 1 and event.y == 0:
                direction = pygame.Vector2(-1, event.y).normalize()
                offset += direction * 10

    scene.render(offset)
    pygame.display.flip()

pygame.quit()

这似乎工作得更顺利,但我觉得这仍然可以改进: https://imgur.com/a/7WNNQIl

编辑:根据 Matiiss 的评论,使用他们的答案并将event.x替换为-event.x似乎在没有 if/elif 的情况下像上面那样工作:

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEWHEEL:
            direction = pygame.Vector2(-event.x, event.y).normalize()
            offset += direction * 10

    scene.render(offset)
    pygame.display.flip()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM