2016-12-26 89 views
1

我是pygame的新手,我正在编写一个程序,允许用户在pygame窗口周围单击并拖动一个矩形,然后通过套接字发送它的坐标。我可以通过点击鼠标来移动矩形,但是我一直在弄乱它,但仍然无法弄清楚如何实现点击和拖动。任何帮助,将不胜感激。下面是相关的代码:用pygame单击并拖动一个矩形

from pygame.locals import * 
import socket, pygame, time 
#define variables 
x = y = 0 
screen = pygame.display.set_mode((430, 410)) 
targetRectangle = pygame.draw.rect(screen, (255, 0, 0), (176, 134, 7, 7)) 
pygame.display.flip() 
#define smaller functions 
    #define function to start pygame window 
def startPygame(): 
    pygame.display.set_caption(option + " Tracking System") 
    pygame.mouse.set_visible(True) 
    screen.fill((255, 255, 255)) 
    targetRectangle = pygame.draw.rect(screen, (255, 0, 0), (176, 134, 7, 7)) 
    pygame.display.flip() 
    #define function to update pygame window 
def updateWindow(): 
    screen.fill((255, 255, 255)) 
    global targetRectangle 
    global xPosition 
    global yPosition 
    targetRectangle = pygame.draw.rect(screen, (255, 0, 0), (xPosition, yPosition, 7, 7)) 
    pygame.display.flip() 
#define main functions 
def collectMouseData(): 
    startPygame() 
    print "\n" 
    print "mouse tracking system" 
    #wait until a mouse button is clicked 
    running = 1 
    while running == 1: 
    event = pygame.event.poll() 
    if event.type == pygame.QUIT: 
     c.send("quit") 
     pygame.quit() 
     running = 0 
    #see if a mousebutton is down 
    elif event.type == pygame.MOUSEBUTTONDOWN: 
     xMouse = event.pos[0] 
     yMouse = event.pos[1] 
     #see if mouse click collides with targetRectangle 
     if targetRectangle.collidepoint(xMouse, yMouse): 
     global xPosition 
     xPosition = event.pos[0] 
     global yPosition 
     yPosition = event.pos[1] 
     updateWindow() 
     global targetRectangle 
     sendData(targetRectangle) 
+0

你必须使用'MOUSEBUTTONDOWN'来检查对象是否被点击并设置'drag = True','MOUSEMOTION'来移动对象ag == True'和'MOUSEBUTTONUP'来设置'drag = False' – furas

回答

3

你必须使用

  • MOUSEBUTTONDOWN检查是否被点击对象,并设置drag = True(和鼠标位置和矩形左上角之间记得偏移)
  • MOUSEBUTTONUP设置为drag = False
  • MOUSEMOTION使用鼠标位置和偏移量移动对象drag == True

工作实例

import pygame 

# --- constants --- (UPPER_CASE names) 

SCREEN_WIDTH = 430 
SCREEN_HEIGHT = 410 

#BLACK = ( 0, 0, 0) 
WHITE = (255, 255, 255) 
RED = (255, 0, 0) 

FPS = 30 

# --- classses --- (CamelCase names) 

# empty 

# --- functions --- (lower_case names) 

# empty 

# --- main --- 

# - init - 

pygame.init() 

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) 
#screen_rect = screen.get_rect() 

pygame.display.set_caption("Tracking System") 

# - objects - 

rectangle = pygame.rect.Rect(176, 134, 17, 17) 
rectangle_draging = False 

# - mainloop - 

clock = pygame.time.Clock() 

running = True 

while running: 

    # - events - 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 

     elif event.type == pygame.MOUSEBUTTONDOWN: 
      if event.button == 1:    
       if rectangle.collidepoint(event.pos): 
        rectangle_draging = True 
        mouse_x, mouse_y = event.pos 
        offset_x = rectangle.x - mouse_x 
        offset_y = rectangle.y - mouse_y 

     elif event.type == pygame.MOUSEBUTTONUP: 
      if event.button == 1:    
       rectangle_draging = False 

     elif event.type == pygame.MOUSEMOTION: 
      if rectangle_draging: 
       mouse_x, mouse_y = event.pos 
       rectangle.x = mouse_x + offset_x 
       rectangle.y = mouse_y + offset_y 

    # - updates (without draws) - 

    # empty 

    # - draws (without updates) - 

    screen.fill(WHITE) 

    pygame.draw.rect(screen, RED, rectangle) 

    pygame.display.flip() 

    # - constant game speed/FPS - 

    clock.tick(FPS) 

# - end - 

pygame.quit() 

编辑:有许多矩形或圆形按钮在GitHub上其他例子:

furas/python-examples/pygame/drag-rectangles-circles