首先这份代码的基本结构是这样的,如下:
这样乌龟就能显示到屏幕上,接下来要响应各个事件,而我要一段一段的来写代码
注:上面代码中position = width//2, height//2 应改为 position.center = width//2,height//2才对,居中显示
# select=0 and drag=0 初始状态
# select=1 and drag=0 第一次按下鼠标左键
# select=2 and drag=0 第一次释放鼠标左键
# select=2 and drag=1 第二次按下鼠标左键
# select=2 and drag=2 第二次释放鼠标左键
响应鼠标的左键第一次被按下select=0,drag=0事件代码
elif event.type == MOUSEBUTTONDOWN:
if event.button == 1:
if select == 0 and drag == 0: # 鼠标的左键第一次被按下
pos_start = event.pos # 获取待截取矩形的左上角坐标(left, top)
select = 1 # 标记正在选取矩形
因为鼠标释放的时候会有select=1,drag=0事件发生,直接写响应第一次释放鼠标的的事件代码
elif event.type == MOUSEBUTTONUP:
if event.button == 1:
if select == 1 and drag == 0: # 鼠标的左键第一次被释放
pos_stop = event.pos # 获取待截取矩形的右下角坐标(width, height)
select = 2 # 标记选取矩形结束
经过一次鼠标的按下与释放,我们就可以得到一个矩形select_rect坐标,不过还没有写生成矩形的代码,
但不管怎样,我们在此时假设已经生成矩形select_rect.
那么因为上面标记了选取矩形结束,所以直接响应第二次鼠标左键被按下select=2,drag=0事件
elif event.type == MOUSEBUTTONDOWN:
if event.button == 1:
if select == 0 and drag == 0: # 鼠标的左键第一次被按下
pos_start = event.pos # 获取待截取矩形的左上角坐标(left, top)
select = 1 # 标记正在选取矩形
if select == 2 and drag == 0: # 第二次按下鼠标的左键
capture = screen.subface(select_rect).copy() # 得到由pos_start和pos_stop截取到矩形区域的拷贝
cap_rect = capture.get_rect() # 得到capture矩形区域的坐标(left,top)(width,height)
drag = 1 # 标记正在拖拽矩形
因为鼠标的左键释放的时候,即拖拽结束,产生 select=2,drag=1事件发生,直接响应它
elif event.type == MOUSEBUTTONUP:
if event.button == 1:
if select == 1 and drag == 0: # 鼠标的左键第一次被释放
pos_stop = event.pos # 获取待截取矩形的右下角坐标(width, height)
select = 2 # 标记选取矩形结束
if select == 2 and drag == 1: # 第二次释放鼠标左键
drag = 2 # 标记拖拽结束矩形
由于上面的drag标记拖拽矩形结束,那么会有鼠标左键第三次被按下select=2,drag=2事件产生
elif event.type == MOUSEBUTTONDOWN:
if event.button == 1:
if select == 0 and drag == 0: # 鼠标的左键第一次被按下
pos_start = event.pos # 获取待截取矩形的左上角坐标(left, top)
select = 1 # 标记正在选取矩形
if select == 2 and drag == 0: # 第二次按下鼠标的左键
capture = screen.subface(select_rect).copy() # 得到由pos_start和pos_stop截取到矩形区域的拷贝
cap_rect = capture.get_rect() # 得到capture矩形区域的坐标(left,top)(width,height)
drag = 1 # 标记正在拖拽矩形
if select == 2 and drag == 2:
select = 0 # 鼠标左键第三次被按下
drag = 0 # 重置select, drag
我之所以这样写代码是因为想让你看到判断是如何写出来,我也是初学python,很多都不懂的,但我觉得这样逻辑更加清晰
现在你得到的代码应该是这样的
####################### select 与 drag 的代码处理 ############################
首先 select为 1 就是第一次按下鼠标的左键,同时drag会被标记为拖拽中,也就是说
矩形的右下角还没有获取到,但我们必须要给它一个右下角才能够实时画出矩形,所以
右下角就为鼠标所在点的坐标
select为 2 就是选取矩形结束直接得到矩形,无须鼠标所在点作为矩形右下角的坐标
if select: # 1, 2
mouse_pos = pygame.mouse.get_pos()
if select == 1:
pos_stop = mouse_pos
# 获取截取矩形的(left,top)与(width,height)
select_rect.left, select_rect.top = pos_start
select_rect.width,select_rect.height = pos_stop[0]-pos_start[0], pos_stop[1]-pos_start[1]
# 在screen这个surface对象上画出矩形的边框
pygame.draw.rect(screen, (0,0,0), select_rect, 1)
drag 为 1 表示用户正在拖拽截取到的矩形,所以矩形的中心为鼠标所在点的坐标
drag 为 2 表示用户拖拽截取到的矩形结束,此时无须鼠标的中心作为矩形中心
if drag: # 1, 2
# 鼠标左键第二次被按下,即还在拖拽中,此时矩形的中心为鼠标的坐标
if drag == 1:
cap_rect.center = mouse_pos
# 在screen这个surface对象上画出矩形
screen.blit(capture, cap_rect)