pygame判断鼠标左键_pygame的事件处理机制

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-28 17:44   11   0

c4f1574bd855388f8e90d355c546d3c0.png

逻辑上pygame提供了一个结构叫做事件队列

31927181ab66cd70788b977d3a004e2c.png

,无论这个事件来自哪里

然后用户编写事件处理程序对队列中的事件进行处理

事件处理遵循先到先处理的原则。

属性是一个类的静态参数

EventType只包含属性

方法是一个类的可操作的内容

事件发生之后,我们可以通过这个类获得事件的一些还原参数。

15e08d780e869bfb8a10c2fc986b7943.png

8a1f2611c51028bb5be31e3c182e20c1.png

78874c306532532a602756eecda8a94b.png

776d1b655fbbf0a06f022c70777e209b.png

1191058713c0dabd317d50904a5c08c7.png

一个事件可以理解为一个对象,一个对象就有多个属性

按键的修饰符指的就是当按a的时候加个修饰符说不定就变成大a了.

获得按键信息

79ce55c0f7c1aca03803ffe4bc2e787e.png

d2fe9fb61ff94f51a48c27ac1b8fb0cf.png

31927181ab66cd70788b977d3a004e2c.png

779b32de84341de7a4f40610a78a0d23.png

638ec60410faa6aef5dc1cdf59c73eea.png

12c40c1ec291be29226273de3006b5e1.png
import sys
import pygame
pygame.init()
size=width,height=640,480  # 设置窗口的大小
# print(pygame.display.Info())
screen=pygame.display.set_mode(size)   # 将窗口显示到屏幕上
# print(pygame.display.Info())        # 在set_mode前后调用是有区别的
pygame.display.set_caption("Pygame壁球")   # 设置壁球
# color=(0,0,0)     # 设置刷新的颜色
black=0,0,0
ball=pygame.image.load("ball.png")     # 加载图片
"""
这里的ball可以理解为surface对象,对象.get_rect()可以形成一个和对象内切的一个对象
这样就可以方便的使用坐标了
"""
ballrect=ball.get_rect()    # 获取矩形区域
fps=300                     # 1秒钟小球运行300个像素
fclock=pygame.time.Clock()
speed=[1,1]    # 设置移动的X轴,Y轴的矩形     左上角的坐标是(0,0)
still=False    # 小球一直移动这个事件是错的,所以默认小球不会一直移动
# clock=pygame.time.Clock()     # 设置时钟
"""
运行上述代码,会出现一个一闪而过的黑色窗口,这是因为程序执行完成后,会自动关闭,如果让窗口一直显示,需要
使用while True让程序一直执行,此外,还需要设置关闭按钮
"""
while True:
     # clock.tick(60)         # 每秒执行60次
    # 检查事件
    for event in pygame.event.get():
        if event.type==pygame.QUIT:  # 如果单机关闭窗口,则退出
            sys.exit()
        # 按比例缩放窗口
        elif event.type==pygame.VIDEORESIZE:
            size=width,height=event.size[0],event.size[1]      # 这里的0,1代表的是索引
            screen=pygame.display.set_mode(size,pygame.RESIZABLE)
        elif event.type==pygame.KEYDOWN:
            if event.key==pygame.K_LEFT:
                speed[0]=speed[0] if speed[0]==0 else(abs(speed[0]))
            elif event.key==pygame.K_RIGHT:
                speed[0]=speed[0]+1 if speed[0]>0 else speed[0]-1
            elif event.key==pygame.K_DOWN:
                speed[1]=speed[1] if speed[1]==0 else(abs(speed[1]))
            elif event.key==pygame.K_ESCAPE:
                sys.exit()
        # 鼠标按下
        elif event.type==pygame.MOUSEBUTTONDOWN:
            if event.button==1:    # 1代表的是鼠标左键
                still=True
        # 鼠标释放
        elif event.type==pygame.MOUSEBUTTONUP:
            still=False
            if event.button==1:
                ballrect=ballrect.move(event.pos[0]-ballrect.left,event.pos[1]-ballrect.top)
        elif event.type==pygame.MOUSEMOTION:
            if event.buttons[0]==1:
                ballrect=ballrect.move(event.pos[0]-ballrect.left,event.pos[1]-ballrect.top)
    # 设置图标最小化
    if pygame.display.get_active()and not still:
        ballrect=ballrect.move(speed[0],speed[1])    # 移动小球
    # 碰到左右边缘
    if ballrect.left<0 or ballrect.right>width:
        speed[0]=-speed[0]                            # 这里的0代表的是第一个索引,不是速度为0
        if ballrect.right>width and ballrect.right+speed[0]>ballrect.right:
            speed[0]=-speed[0]

    # 碰到上下边缘
    if ballrect.top<0 or ballrect.bottom>height:
        speed[1]=-speed[1]
        if ballrect.bottom>height and ballrect.bottom+speed[1]>ballrect.bottom:
             speed[1]=-speed[1]
    screen.fill(black)        # 填充颜色
    screen.blit(ball,ballrect)   # 将图片画到那个矩形区域里面
    fclock.tick(fps)
    pygame.display.update()     # 更新全部显示


# pygame.quit()
076fd7d6276826f9565a7b59fcd0ce78.png
https://www.zhihu.com/video/1193584810533146624
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP