2016-12-26 24 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'は 'dr ag == True'と 'MOUSEBUTTONUP'を使って' drag = False'を設定します – furas

答えて

3

あなたがオブジェクトをクリックするとdrag = Trueを設定(およびマウスの位置と長方形の左上隅の間のオフセットを覚えている)されたかどうかを確認するために

  • MOUSEBUTTONDOWNを使用する必要が
  • MOUSEBUTTONUP設定するdrag = False
  • MOUSEMOTIONdrag == 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() 

EDIT:GitHubの上で多くの長方形や円、ボタン付き他の例:

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

関連する問題