逻辑上pygame提供了一个结构叫做事件队列
,无论这个事件来自哪里
然后用户编写事件处理程序对队列中的事件进行处理
事件处理遵循先到先处理的原则。
属性是一个类的静态参数
EventType只包含属性
方法是一个类的可操作的内容
事件发生之后,我们可以通过这个类获得事件的一些还原参数。
一个事件可以理解为一个对象,一个对象就有多个属性
按键的修饰符指的就是当按a的时候加个修饰符说不定就变成大a了.
获得按键信息
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()
https://www.zhihu.com/video/1193584810533146624