我正在为Flow创建一个类似的游戏。如果您熟悉它,则需要用户通过网格上相同颜色的线将相同的圆圈匹配在一起。我遇到了一个问题,无论哪里有鼠标运动事件,我都希望用户只能画直线(左,右,上,下)。目前用户可以在任何地方绘图,我有一个功能,只要鼠标运动事件发生时绘制圆圈,虽然我已经使用了一些if语句试图限制用户可以绘制它的位置仍然无法正常工作。也许有更好的方法而不是使用鼠标运动事件?我不确定,但非常感谢任何帮助!
以下是一些代码:
''' *** IN PROGRESS *** '''
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True # Closes the game and exits the loop
elif event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
pygame.mouse.set_visible(True)
''' If the user clicks down on the left button the mouse coordinates at that point are assigned to variables
x and y which are used to check the condition of the click_detection function'''
elif event.type == pygame.MOUSEBUTTONUP:
pygame.mouse.set_visible(True)
# Makes the cursor visible to choose a new circle easily
elif event.type == pygame.MOUSEMOTION:
''' State is assigned to an array for each of three mouse buttons
at state[0] it checks the left mouse button'''
state = pygame.mouse.get_pressed()
for circle in circle_grid_list:
# Checks following conditions for every circle in that Sprite group
if ClickDetection.click_detection(circle) == True:
''' Checks whether a circle is being clicked
- If so then variable colour is assigned to the colour of the clicked circle
- This is used so that the move method from circle_line class can be called using the colour of the clicked circle'''
colour = circle.colour
# *** WORK IN PROGRESS ***
if MovementChecker.check() != False:
print("can draw")
if state[0] == 1:
# Checking the left mouse button state, if 1 then button is being clicked or held down
moving_line_mouse.Move()
elif MovementChecker.check() == False:
# Used to stop the move method for the moving_line object from being called if movement checker is false
print("Can't draw")
答案 0 :(得分:0)
所以,不要再考虑“这是我的鼠标所在的位置”,而是试着用“哪个盒子是我的鼠标位于?”来思考。如果是,那就给那个盒子上色。这可能会有所帮助
例如,如果您的每个正方形都是100x100像素,并且您的鼠标位于坐标424和651处,那么您可以通过执行int(424 / 100)
和int(651 / 100)
来计算网格位置 - 您的鼠标位于网格上的位置4x6(请注意,我们从零开始计算,因此左上角的方块位于0x0位置。)
然后,您可以检查网格4x6是否已经填充,检查它是否填充了不同的颜色,并处理所有逻辑。
Flow还有一个功能,它会绘制一条线,连接您输入的位置和离开的位置。如果你用另一种颜色“切割”它,它也会删除预先存在的一半的行。
实现这一目标的一种方法是创建一个“方形”对象,该对象跟踪其当前颜色,对您来自的方块的引用,以及对您最终选取的方块的引用。
这样,你就会在你的网格中创建一种“链表” - 每个方块都指向它所连接的下一个方块,所以你知道是否需要绘制垂直条,水平条或者一个角落。如果你切开已经设置了颜色的方块,你可以继续跟踪引用链,找到上一个颜色流过的下一个方块,并在继续之前将它们设置为空。