简体   繁体   中英

How to click and drag an object in pygame?

I have created this window that allows the user to create dots in the windows and link them, What I'm trying to do now is to allow him to move which ever point he wants after finishing drawing them

In my example I allow him to draw five dots, then I want him to move the point of his choice, I really don't know how to do this

This is my code:

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()

Thanks.

pygame is low lewel, it does not have any preimplemented method for drag and drop. You have to built it by yourself.

You have to play with the various events types. Here is the idea:

First, create a variable dragged_dot = None outside the main loop. And in the event loop check for the following events:

  • pygame.MOUSEBUTTONDOWN event tells you when the button is pressed. When you detect this event, check if the mouse is clicking on an existing dot or not. This is what your for loop does. If not, add a new dot like you are already doing. Otherwise, set the dot to be dragged: dragged_dot = oPosition .
  • pygame.MOUSEMOTION event tells you when the mouse moves. When you detect this event, check if there is a dragged dot: if dragged_dot is not None . If so, edit it's coordinates adding the mouse motion so that it can be redrawn at a new position (remember to delete the image of the dot at the previous postion). Use event.rel to know the difference between previous mouse position and current mouse position.
  • pygame.MOUSEBUTTONUP event tells you when the button is released. Simply set dragged_dot = None , so that the dot is dropped and will not follow the mouse motion anymore.

Ok this is the answer if you are interested

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()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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