如何使用pygame绘制可以拖放到屏幕上的对象?



我正在尝试绘制 5 个矩形,所有这些矩形都可以在屏幕上拖放。我正在使用pygame。我设法绘制了 1 个可以拖放的矩形,但我不能用 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 个时,我都无法拖动任何一个。有人对此有解决方案吗?

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

我正在使用offsetpygame.math.Vector2来保存示例中的几行。

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

最新更新