Pygame 移动矩形对象
Pygame.Rect类具有存储和操作矩形区域的功能。可以使用left,top,width和height值构建Rect对象。Rect类中的函数使得可以复制、移动和调整Rect对象的大小。
Rect对象具有以下虚拟属性-
除了移动以外,Rect类还有用于测试矩形之间碰撞的方法。
copy() | 返回一个与原始矩形具有相同位置和大小的新矩形。 |
---|---|
move() | 返回一个根据给定偏移量移动的新矩形。x和y参数可以是任何整数值,正数或负数。 |
move_ip() | 与Rect.move()方法相同,但是直接在原始矩形上操作。 |
inflate(x,y) | 返回一个按给定偏移量改变大小的新矩形。负值会缩小矩形。 |
inflate_ip(x, y) | 与Rect.inflate()方法相同,但是直接在原始矩形上操作。 |
clamp(Rect) | 返回一个被移动到完全位于参数Rect内的新矩形。 |
clip(Rect) | 返回一个被剪裁为完全位于参数Rect内的新矩形。 |
union(Rect) | 返回一个完全覆盖两个给定矩形区域的新矩形。 |
union_ip(Rect) | 与Rect.union()方法相同,但是直接在原始矩形上操作。 |
contains(Rect) | 当参数完全位于矩形内部时返回true。 |
collidepoint((x,y)) | 当给定点位于矩形内部时返回true。 |
colliderect(Rect) | 当两个矩形的任何部分重叠时返回true。 |
示例
在下面的程序中,绘制了一个带有红色轮廓的矩形对象。使用copy()方法,创建了一个克隆用于移动。移动通过move_ip()方法实现。箭头键通过增加/减少x/y坐标来移动复制的矩形的位置,每次移动5个像素。
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300))
rect1 = Rect(50, 60, 200, 80)
rect2=rect1.copy()
running = True
x=0
y=0
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == KEYDOWN:
if event.key==K_LEFT:
x= -5
y=0
if event.key == K_RIGHT:
x=5
y=0
if event.key == K_UP:
x = 0
y = -5
if event.key == K_DOWN:
x = 0
y = 5
rect2.move_ip(x,y)
screen.fill((127,127,127))
pygame.draw.rect(screen, (255,0,0), rect1, 1)
pygame.draw.rect(screen, (0,0,255), rect2, 5)
pygame.display.update()
pygame.quit()
输出
下面的输出显示了一个带有红色轮廓的矩形是原始矩形。它的副本会根据箭头键而移动,并且有蓝色轮廓。
示例
将move_ip()方法更改为inflate_ip()方法,根据按下的箭头来扩大/缩小矩形。
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == KEYDOWN:
if event.key==K_LEFT:
x= -5
y=0
if event.key == K_RIGHT:
x=5
y=0
if event.key == K_UP:
x = 0
y = -5
if event.key == K_DOWN:
x = 0
y = 5
rect2.inflate_ip(x,y)
screen.fill((127,127,127))
pygame.draw.rect(screen, (255,0,0), rect1, 1)
pygame.draw.rect(screen, (0,0,255), rect2, 5)
pygame.display.update()
输出
以下是箭头键按下活动的屏幕截图 –
示例
为了通过检测MOUSEMOTION事件使矩形移动,我们需要先在原始矩形内按下鼠标。为了验证鼠标位置是否在矩形内,我们使用Rect对象的collidepoint()方法。当鼠标移动时,矩形对象将通过move_ip()方法移动到指定位置。当释放鼠标时,移动将停止。
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300))
rect = Rect(50, 60, 200, 80)
moving = False
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
elif event.type == MOUSEBUTTONDOWN:
if rect.collidepoint(event.pos):
moving = True
elif event.type == MOUSEBUTTONUP:
moving = False
elif event.type == MOUSEMOTION and moving:
rect.move_ip(event.rel)
screen.fill((127,127,127))
pygame.draw.rect(screen, (255,0,0), rect)
if moving:
pygame.draw.rect(screen, (0,0,255), rect, 4)
pygame.display.flip()
pygame.quit()
输出
示例
通过鼠标绘制矩形,捕获MOUSEBUTTONDOWN和MOUSEBUTTONUP事件中的鼠标指针坐标,计算左上角坐标、宽度和高度,并调用rect()函数。
import pygame
from pygame.locals import *
from sys import exit
pygame.init()
screen = pygame.display.set_mode((400,300))
pygame.display.set_caption("Draw Rectangle with Mouse")
screen.fill((127,127,127))
x=0
y=0
w=0
h=0
drawmode=True
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
if event.type == MOUSEBUTTONDOWN:
x,y = pygame.mouse.get_pos()
drawmode = True
if event.type == MOUSEBUTTONUP:
x1,y1 = pygame.mouse.get_pos()
w=x1-x
h=y1-y
drawmode= False
rect = pygame.Rect(x,y,w,h)
if drawmode == False:
pygame.draw.rect(screen, (255,0,0), rect)
pygame.display.flip()
pygame.quit()