如何使用pygame绘制可以在屏幕上拖动和下垂的对象?

时间:2017-06-03 11:52:30

标签: python python-3.x pygame

我正在尝试绘制5个矩形,所有这些矩形都可以在屏幕上拖放。我正在使用pygame。我设法绘制了一个可以拖放的矩形,但是我无法用5来完成。这是我的代码:

import pygame
from pygame.locals import *
from random import randint


SCREEN_WIDTH = 1024
SCREEN_HEIGHT = 768

BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)
RED   = (255,   0,   0)
pygame.init()

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

pygame.display.set_caption("Moving circles")

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


clock = pygame.time.Clock()

running = True

while running:
    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


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

    pygame.display.flip()

clock.tick(FPS)


pygame.quit()

我想这是最重要的部分:

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

每当我尝试绘制其中的5个时,我都无法拖动它们中的任何一个。有人有解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以创建一个矩形列表和一个selected_rect变量,该变量指向当前选定的矩形。在事件循环中检查其中一个rects是否与event.pos冲突,然后将selected_rect设置为鼠标光标下的rect并移动它。

我使用pygame.math.Vector2 offset来保存示例中的几行。

import sys
import pygame as pg
from pygame.math import Vector2


pg.init()

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

screen = pg.display.set_mode((1024, 768))

selected_rect = None  # Currently selected rectangle.
rectangles = []
for y in range(5):
    rectangles.append(pg.Rect(20, 30*y, 17, 17))
# As a list comprehension.
# rectangles = [pg.Rect(20, 30*y, 17, 17) for y in range(5)]

clock = pg.time.Clock()
running = True

while running:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            running = False
        elif event.type == pg.MOUSEBUTTONDOWN:
            if event.button == 1:
                for rectangle in rectangles:
                    if rectangle.collidepoint(event.pos):
                        offset = Vector2(rectangle.topleft) - event.pos
                        selected_rect = rectangle
        elif event.type == pg.MOUSEBUTTONUP:
            if event.button == 1:
                selected_rect = None
        elif event.type == pg.MOUSEMOTION:
            if selected_rect:
                selected_rect.topleft = event.pos + offset

    screen.fill(WHITE)
    for rectangle in rectangles:
        pg.draw.rect(screen, RED, rectangle)

    pg.display.flip()
    clock.tick(30)

pg.quit()
sys.exit()