鱼C论坛

 找回密码
 立即注册

2016-12-30 看我怎样取下小甲鱼的龟头---代码分析

已有 583 次阅读2016-12-30 13:09


首先这份代码的基本结构是这样的,如下:


这样乌龟就能显示到屏幕上,接下来要响应各个事件,而我要一段一段的来写代码

注:上面代码中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)

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 11:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部