如何在pygame中点击并拖动对象?

How to click and drag an object in pygame?

我创建了这个 window 允许用户在 windows 和 link 中创建点, 我现在要做的是让他在画完之后可以随意移动他想要的点

在我的例子中我让他画了五个点,然后我要他移动他选择的点,我真的不知道该怎么做

这是我的代码:

import pygame

#Initialise pygame

pygame.init()

#Create the screen

screen = pygame.display.set_mode((1200, 700))

#Change the title and the icon

pygame.display.set_caption('The Thoughtful Minds')
icon = pygame.image.load('IA.png')
pygame.display.set_icon(icon)

#Dots

dot = pygame.image.load('point.png')

class Dot:
    def __init__(self, pos):
        self.cx, self.cy = pos

    def draw(self):
        screen.blit(dot,(self.cx-8 , self.cy-8))

def text_objects(text,font):
    textSurface = font.render(text, True, (100,100,100))
    return textSurface, textSurface.get_rect()

dots = []

#Running the window
i = 0
running = True
while running:
    mx, my = pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            for oPosition in dots:
                if ((oPosition.cx - 8) < mx < (oPosition.cx + 8)) and ((oPosition.cy - 8) < my < (oPosition.cy + 8)):
                    '''



                    What should I put her to allow him to move the dot he clicked on 



                    '''
            if i<3:
                # append a new dot at the current mouse position
                dots.append(Dot((mx,my)))
                i += 1


    # clear the display
    screen.fill((30,30,30))

    # draw all the dots

    if len(dots)>1:
        for i in range(len(dots)-1):
            pygame.draw.line(screen, (50, 50, 50), [dots[i].cx,dots[i].cy],[dots[i+1].cx,dots[i+1].cy],2 )

    for d in dots:
        d.draw()

    if mx < 50 and my < 50:
        pygame.draw.rect(screen,(24,24,24),(0,0,50,50))
    else:
        pygame.draw.rect(screen,(20,20,20),(0,0,50,50))

    text = pygame.font.Font("freesansbold.ttf",25)
    textSurf, textRect = text_objects('–', text)
    textRect.center = (25,25)
    screen.blit( textSurf, textRect )

    if 52 < mx < 102 and my < 50:
        pygame.draw.rect(screen,(24,24,24),(52,0,50,50))
    else:
        pygame.draw.rect(screen,(20,20,20),(52,0,50,50))

    textSurf, textRect = text_objects('+', text)
    textRect.center = (76,25)
    screen.blit( textSurf, textRect )

    # update the dispalay
    pygame.display.flip()

谢谢。

pygame 是低级别的,它没有任何预实现的拖放方法。必须自己搭建。

您必须玩各种类型的赛事。这是想法:

首先,在主循环外创建一个变量dragged_dot = None。并在事件循环中检查以下事件:

  • pygame.MOUSEBUTTONDOWN 事件告诉您按钮何时被按下。当您检测到此事件时,请检查鼠标是否正在单击现有点。这就是您的 for 循环所做的。如果没有,请像您已经在做的那样添加一个新点。否则,设置要拖动的点:dragged_dot = oPosition.
  • pygame.MOUSEMOTION 事件告诉您鼠标何时移动。当你检测到这个事件时,检查是否有一个被拖动的点:if dragged_dot is not None。如果是这样,编辑它的坐标并添加鼠标移动,以便它可以在新位置重新绘制(记得删除前一个位置的点图像)。使用 event.rel 了解先前鼠标位置与当前鼠标位置之间的差异。
  • pygame.MOUSEBUTTONUP 事件告诉您按钮何时被释放。只需设置dragged_dot = None,这样点就被放下,不再跟随鼠标移动。

好的,如果您有兴趣,这就是答案

import pygame

#Initialise pygame

pygame.init()

#Create the screen

screen = pygame.display.set_mode((1200, 700))
screen.set_alpha(None)

#Change the title and the icon

pygame.display.set_caption('The Thoughtful Minds')
icon = pygame.image.load('IA.png')
pygame.display.set_icon(icon)

#Dots
dot = pygame.image.load('point.png')
class Dot:
    def __init__(self, pos):
        self.cx, self.cy = pos

    def draw(self):
        screen.blit(dot,(self.cx-8 , self.cy-8))

def text_objects(text,font):
    textSurface = font.render(text, True, (100,100,100))
    return textSurface, textSurface.get_rect()

dots = []
#Running the window
i = 0
running = True
draging = False
while running:
    mx, my = pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            pass

        elif event.type == pygame.MOUSEBUTTONDOWN:
            for oPosition in dots:
                if ((oPosition.cx - 8) < mx < (oPosition.cx + 8)) and ((oPosition.cy - 8) < my < (oPosition.cy + 8)):
                    draging = True
                    break

            if i<3:
                # append a new dot at the current mouse position
                dots.append(Dot((mx,my)))
                i += 1
        elif event.type == pygame.MOUSEBUTTONUP:
            draging = False

        elif event.type == pygame.MOUSEMOTION:
            if draging :
                oPosition.cx = mx
                oPosition.cy = my

    # clear the display
    screen.fill((30,30,30))

    # draw all the dots

    if len(dots)>1:
        for i in range(len(dots)-1):
            pygame.draw.line(screen, (50, 50, 50), [dots[i].cx,dots[i].cy],[dots[i+1].cx,dots[i+1].cy],2 )

    for d in dots:
        d.draw()

    if mx < 50 and my < 50:
        pygame.draw.rect(screen,(24,24,24),(0,0,50,50))
    else:
        pygame.draw.rect(screen,(20,20,20),(0,0,50,50))

    text = pygame.font.Font("freesansbold.ttf",25)
    textSurf, textRect = text_objects('–', text)
    textRect.center = (25,25)
    screen.blit( textSurf, textRect )

    if 52 < mx < 102 and my < 50:
        pygame.draw.rect(screen,(24,24,24),(52,0,50,50))
    else:
        pygame.draw.rect(screen,(20,20,20),(52,0,50,50))

    textSurf, textRect = text_objects('+', text)
    textRect.center = (76,25)
    screen.blit( textSurf, textRect )

    # update the dispalay
    pygame.display.flip()