Pygame(二)游戏编程,一触即发,第二弹——事件响应

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/suoyue_py/article/details/99172006

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第二弹”获取程序源码、图片和打包后的可执行文件

附上前面相关知识:
入坑Python
Pygame第一弹

猜你喜欢

转载自blog.csdn.net/suoyue_py/article/details/99172006