【问题标题】:pygame - Snap Mouse to Gridpygame - 将鼠标捕捉到网格
【发布时间】:2016-08-31 14:15:50
【问题描述】:

我正在使用 pygame 制作一个小型平台游戏,并决定为每个级别制作一个关卡编辑器比输入每个块的坐标和大小更容易。


我正在使用一组水平和垂直的线来制作网格,以便更容易地绘制点。

这是我的网格的代码:

def makeGrid(surface, width, height, spacing):
    for x in range(0, width, spacing):
        pygame.draw.line(surface, BLACK, (x,0), (x, height))
    for y in range(0, height, spacing):
        pygame.draw.line(surface, BLACK, (0,y), (width, y))

我希望用户的鼠标以 10px 的间隔移动,只移动到交叉点。这是我试图强制鼠标捕捉到网格的内容。

def snapToGrid(mousePos):
    if 0 < mousePos[0] < DISPLAYWIDTH and 0 < mousePos[1] < 700:
        pygame.mouse.set_pos(roundCoords(mousePos[0],mousePos[1]))

(顺便说一句,roundCoords() 返回四舍五入到最接近的十个单位的坐标。)

(顺便说一句,snapToGrid() 在主游戏循环中被调用(虽然没有完成))

...但是this 发生了,鼠标不想移动到其他任何地方。


关于如何解决此问题的任何建议?如果需要,我也可以更改网格代码。 非常感谢。

附注这是在 64 位 Python 2.7 上使用最新版本的 PyGame

【问题讨论】:

    标签: python python-2.7 pygame grid-layout


    【解决方案1】:

    首先,我认为你离我们不远了。

    我认为问题在于代码在每个游戏循环中运行得非常快,因此您的鼠标没有时间移动太远,然后就被您的函数设置为返回的位置。

    我要查看的是而不是 pygame.mouse.set_pos() 只是将捕捉到的坐标返回到一个变量并使用它在屏幕上显示一个标记,突出显示感兴趣的交叉点(这里我使用一个圆圈,但你可以只是 blit 鼠标的图像;))。并使用pygame.mouse.set_visible(False) 隐藏您的实际鼠标:

    def snapToGrid(mousePos):
        if 0 < mousePos[0] < DISPLAYWIDTH and 0 < mousePos[1] < 700:
            return roundCoords(mousePos[0],mousePos[1])
    
    snap_coord = snapToGrid(mousePos)# save snapped coordinates to variable
    
    pygame.draw.circle(Surface, color, snap_coord, radius, 0)# define the remaining arguments, Surface, color, radius as you need
    
    pygame.mouse.set_visible(False)# hide the actual mouse pointer
    

    希望对你有用!

    【讨论】:

    • 我非常喜欢这个,谢谢。唯一的问题是之前的圆圈并没有消失。
    • 我不知道这对你来说有多可行,但我通常倾向于在每一帧再次对我的背景进行 blit,然后在其上再次对所有内容进行 blit。所以在你的情况下,我会 1)在每一帧上对白色背景进行 blit,2)对网格进行 blit,3)对圆圈进行 blit。
    • 我所做的是用与背景相同的颜色在上面再画一个圆圈,所以这个点看起来像网格中的一个空间而不是一个点。
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多