从pygame首发中我们看见完成的只是一个会动的界面而已,还不能算是一个游戏。对于一个游戏,做的再好,若玩家只能欣赏而无法参与的最"无聊"的,对此,来修善一下上一篇的代码,让玩家能够参与其中。
程序效果图:
pygame首发中已经用过QUIT事件来退出程序,现在再来运用KEYDOWN、KEYUP、MOUSEBUTTONDOWN、MOUSEBUTTONUP事件使用来完善程序代码,使其能让玩家来操作。
事件一览表:
核心代码添加的分析,完整代码、图像素材及打包文件见文末:
SY1:
在游戏主循环添加KEYDOWN键盘按下事件来控制角色上下左右移动
K_LEFT: 键盘方向左键
K_RIGHT: 键盘方向右键
K_UP: 键盘方向上键
K_DOWN: 键盘方向下键
#键盘控制事件:上下左右移动
if event.type == KEYDOWN:
if event.key == K_LEFT:
SPEED = [-2,0]
elif event.key == K_RIGHT:
SPEED = [2,0]
elif event.key == K_UP:
SPEED = [0,-2]
elif event.key == K_DOWN:
SPEED = [0,2]
现在键盘方向键是可以使用来操作图像角色的移动方向,但却无法控制其转向,对此,SY3处使用transfore方法来控制图像的上下、左右翻转以及缩放操作。
SY2:
在游戏主循环添加"MOUSEBUTTONDOWN"和"MOUSEKEYBUTTONUP"来设定鼠标按住时图像角色进行倍速运动,松开鼠标恢复原速(此处若要多次加速可用一个循环操作)
#按住鼠标进行加速运动,松开鼠标恢复原速
if event.type==MOUSEBUTTONDOWN:
if SPEED[0] != 0:
SPEED[0] *= 2
else:
SPEED[1] *= 2
elif event.type==MOUSEBUTTONUP:
if SPEED[0] != 0:
SPEED[0] /= 2
else:
SPEED[1] /= 2
由于按下键盘方向键会改变SPEED的参数(可能出现零),对此加速时需要做判断。
SY3:
transfore方法一览表:
flip方法:
加载图像后设置图像的翻转情况,pygame.transform.flip(Surface,xbool,ybool) - > Surface 包含三个参数,
参数1:返回surface对象;
参数2:设置是否水平翻转;
参数3:设置是否垂直翻转
pygame首发代码处有备注
ori_role = pygame.image.load("role.png") #加载原始图像
role = pygame.transform.flip(ori_role,True,False) #翻转图像
设置左右翻转情况并判断角色的头朝向
face_left = ori_role
face_right = role
walk_head = True #判断头的朝向
smoothscale方法:
设置图像放大缩小的比率: ratio = 1.0 并在游戏主循环内添加 放大、缩小的键并实现其功能。
K_EQUALS: 键盘左上+ 左下= 键
K_MINUS: 键盘左上—— 左下- 键
K_SPACE: 空格键
pygame.transform.smoothscale(Surface,(width,height),DestSurface = None) - > Surface包含三个参数,
参数1:数据,返回surface对象;
参数2:大小(宽度,高度);
参数3:模式
此处使用scale方法也是可以的,参数和使用方法基本一样,就是图像放大后的显示效果有点偏差
#放大、缩小的角色(=\-),空格键恢复原始尺寸
if (event.key == K_EQUALS) or (event.key == K_MINUS) or (event.key == K_SPACE):
#最大只能:放大一倍,缩小50%
if event.key == K_EQUALS and ratio < 2.0:
ratio += 0.1
if event.key == K_MINUS and ratio > 0.5:
ratio -= 0.1
if event.key == K_SPACE:
ratio = 1.0
#转化后的赋值给role
role = pygame.transform.smoothscale(ori_role,(int(ori_position.width*ratio),int(ori_position.height*ratio))) #数据,大小(宽度,高度),模式
face_left = role
face_right = pygame.transform.flip(role,True,False)
position.size=(int(ori_position.width*ratio), int(ori_position.height*ratio)) #改变rect对象尺寸使其不出界
注意:完成图像的放大缩小后还需要处理一下细节:图像角色的头朝向,在放大或缩小时图像会产生自动翻转现象,对此,需要设定头方向并做相应的判断,详细见下文完整代码:
import pygame
from pygame.locals import*
from sys import exit
pygame.init() #初始化pygame
pygame.display.set_caption("锁钥 の Hello World !!!") #设置窗口标题
width,height = 640,480
SPEED = [2,1] #定义速度
background_image = 'bg.jpg' #指定背景图像文件名称
screen = pygame.display.set_mode((width,height),0,32) #创建窗口
background = pygame.image.load(background_image).convert() #加载背景图
ori_role = pygame.image.load("role.png") #加载原始图像
role = pygame.transform.flip(ori_role,True,False) #翻转图像
ori_position = position = ori_role.get_rect() #获得图像的原始位置矩形和位置矩形
face_left = ori_role
face_right = role
walk_head = True #判断头的朝向
ratio = 1.0 #设置图像放大缩小的比率
#游戏主循环
while True:
for event in pygame.event.get():
#接收到退出事件后退出程序
if event.type == pygame.QUIT:
exit()
#键盘控制事件:上下左右移动
if event.type == KEYDOWN:
if event.key == K_LEFT:
role = face_left
SPEED = [-2,0]
elif event.key == K_RIGHT:
role = face_right
SPEED = [2,0]
elif event.key == K_UP:
SPEED = [0,-2]
elif event.key == K_DOWN:
SPEED = [0,2]
#放大、缩小的角色(=\-),空格键恢复原始尺寸
if (event.key == K_EQUALS) or (event.key == K_MINUS) or (event.key == K_SPACE):
#最大只能:放大一倍,缩小50%
if event.key == K_EQUALS and ratio < 2.0:
ratio += 0.1
if event.key == K_MINUS and ratio > 0.5:
ratio -= 0.1
if event.key == K_SPACE:
ratio = 1.0
#转化后的赋值给role
role = pygame.transform.smoothscale(ori_role,(int(ori_position.width*ratio),int(ori_position.height*ratio))) #数据,大小(宽度,高度),模式
face_left = role
face_right = pygame.transform.flip(role,True,False)
position.size=(int(ori_position.width*ratio), int(ori_position.height*ratio)) #改变rect对象尺寸使其不出界
if walk_head:
role = face_right
else:
role = face_left
#按住鼠标进行加速运动,松开鼠标恢复原速
if event.type==MOUSEBUTTONDOWN:
if SPEED[0] != 0:
SPEED[0] *= 2
else:
SPEED[1] *= 2
elif event.type==MOUSEBUTTONUP:
if SPEED[0] != 0:
SPEED[0] /= 2
else:
SPEED[1] /= 2
#判断运动方向
if SPEED[0]<0:
walk_head = False
if SPEED[0]>0:
walk_head = True
#将图像限制在屏幕中运动
if position.left<0 or position.right>width: #左右边界判断
role = pygame.transform.flip(role,True,False)
SPEED[0] = -SPEED[0] #反方向移动
if position.top<0 or position.bottom>height: #上下边界判断
SPEED[1] = -SPEED[1]
position = position.move(SPEED) #移动图像
screen.blit(background,(0,0)) #将背景图画上
screen.blit(role,position) #更新图像
pygame.display.flip() #更新界面
pygame.time.delay(5) #延迟10毫秒
适时更新请关注微信公众“百里锁钥”,公众号后台回复“pygame第二弹”获取程序源码、图片和打包后的可执行文件