(PS:几经修改,终于完善.最后附上了此游戏终极完善版,带全屏\拖屏,键盘控制,无BUG版)
小甲鱼python第81期讲述pygame事件时,做了一个小游戏,乌龟上下左右移动,按下对应按键可以调整其运动方向.
不过甲鱼哥的代码有一个BUG当时没有发现:当乌龟碰到左边界的瞬间按下⬅时, 有时会出发一个BUG,导致甲鱼以非常高的频率来回撞墙,图像高频率来回翻转,乌龟仿佛变成了一只蝴蝶.... 女儿乱按键盘,不经意间出发了此BUG,天生的测试员啊,😂😂😂😂.
用面向对象的思维方法理解下述代码有两点还是困扰
1.pygame.event.get()到底是个什么?
2.为什么有的event有key属性,有的有size属性,有的什么都没有???他们不是同一个类的实例吗?
源代码如下(含BUG)
import pygame
import sys
pygame.init()
size=width,height= 600,400
speed=[6,3]
bg=(0,0,0)
screen=pygame.display.set_mode(size)
#用pygame.display模块里面的set_mode()方法返回一个Surface对象 贴给screen.
#screen是游戏内容的显示区域,Surface是"表现类"对象
pygame.display.set_caption("hello!anny!")
调用pygame.display模块里面的set_caption()方法将游戏框架(非screen)的标题设为"..."
anny=pygame.image.load("sheep.png")
#调用pygame.image.模块里面的load()方法缓存图片,返回一个Surface表现对象给anny
position=anny.get_rect()#获得Surface表现对象的轮廓矩形,每个Surface表现对象都有一个Rect对象
l_head=anny
r_head=anny = pygame.transform.flip(anny, True, False)
#调用pygame.transform模块里面的flip()方法翻转Surface表现对象并重新贴给anny
while 1:
for event in pygame.event.get():
#调用pygame.event模块里面的get()方法,返回Event事件对象列表,列表中每个元素都是Event类型
#用for遍历此表
if event.type== pygame.QUIT:#这些大写字母其实是Event的特定type时的属性,类型为INT
#每个event都有type属性,来确定事件类型,type不同,其他属性也不同,
#这个地方用面向对象的思维方法该怎么理解?例如type=2时(也就是pygame.QUIT),Event没有key属性,
#会报AttributeError: 'Event' object has no attribute 'key'.type=4时又有????
#难道是如果type不对主动抛出异常?
sys.exit()
if event.type== pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
anny = l_head
speed=[-6,0]
if event.key == pygame.K_RIGHT:
anny = r_head
speed = [6, 0]
if event.key == pygame.K_UP:
speed=[0,-3]
if event.key == pygame.K_DOWN:
speed = [0, 3]
position=position.move(speed)
#position是Surface类的Rect嵌套类(类种类),其中有move方法,移动自己位置.
if position.left < 0 or position.right > width:
anny=pygame.transform.flip(anny,True,False)
调用pygame.transform模块里的flip()方法处理图像并返回Surface对象,重新贴上anny
speed[0]=-speed[0]
if position.top < -50 or position.bottom > height+20:
speed[1] = -speed[1]
screen.fill(</