python pygame事件与事件处理

本期是接上期python pygame库的略学内容最后一个步骤,游戏与玩家交互的内容。

一、什么是事件

游戏需要与玩家交互,因此它必须能够接收玩家的操作,并根据玩家的不同操作做出有针对性的响应。程序开发中将玩家会对游戏进行的操作称为事件(Event),根据输入媒介的不同,游戏中的事件分为键盘事件、鼠标事件和手柄事件等。

pygame.locals中常见事件的产生及参数:

事件产生途径参数解释
KEYDOWN键盘上的按键被按下unicode记录安静Unicode值
key按下或放开的键的键值
mod包含组合键信息
KEYUP键盘上的键被放开key
mod
MOUSEMOTION鼠标移动pos鼠标指针操作的位置,包含(x,y)
rel当前位置与上次鼠标事件时鼠标指针位置间的距离
buttons含有3个数字的元组,元组中数字的取值为(0,1,3),依次代表为左键、滚轮和右键
MOUSEUTTONDOWN鼠标键按下pos
button整型数值,1表示单击鼠标左键,2表示单击滚轮,3表示单击右键,4表示向上滑动滚轮,5表示向下滑动滚轮
MOUSEBUTTONUP鼠标键放开pos
button

代码演示:

# 导入模块
import pygame,time
from pygame.locals import *

# 定义窗口高度和宽度、颜色
WIN_WIDTH = 658
WIN_HEIGHT = 243
# 设置颜色变量
BG_COLOR = (125,125,0)
MS_COLOR=(95,200,255)
MSGBG_COLOR=(23,78,20)


FPS=60
def main():
    # 初始化模块
    pygame.init()
    # 创建窗体,即创建Surface
    WINSET=pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
    # 为窗口填充背景色
    WINSET.fill(BG_COLOR)
    # 设置窗口标题
    pygame.display.set_caption('小游戏')

    # 加载图片
    # image=pygame.image.load('D:/Software/pycharm/网页请求/小游戏/image/wallhaven-j5mj3w_1920x1080.png')
    # 绘制图片
    # WINSET.blit(image,(0,0))
    # 创建字体对象
    BASICFONT=pygame.font.Font("D:/Software/字体/思源黑体/字体文件/SourceHanSansCN-Bold.otf",25)
    # 渲染字体
    msg_surf=BASICFONT.render('初始化…',True,MS_COLOR,MSGBG_COLOR)
    # 绘制渲染到游戏窗口
    WINSET.blit(msg_surf,(0,0))
    # 制作背景副本
    base_surf=WINSET.copy()
    # 渲染字体
    auto_surf=BASICFONT.render('自动',True,MS_COLOR,MSGBG_COLOR)
    # 获取矩形属性
    auto_rect=auto_surf.get_rect()
    # 重设横坐标
    auto_rect.x=WIN_WIDTH-auto_rect.width-10
    # 重设纵坐标
    auto_rect.y=WIN_HEIGHT-auto_rect.height-10
    # 绘制字体
    WINSET.blit(auto_surf,auto_rect)
    # 设置游戏时间钟,创建Colock对象
    FPSCOLOCK = pygame.time.Clock()
    # 在背景的不同位置绘制方块,制造移动效果
    for i in range(0,WIN_HEIGHT,2):
        FPSCOLOCK.tick(FPS)
        # 绘制
        WINSET.blit(auto_surf,auto_rect)
        pygame.display.update()
        auto_rect.x-=10
        if i+2 <WIN_HEIGHT:
            WINSET.blit(base_surf,(0,0))
    # 刷新窗口
    pygame.display.update()
    # 睡眠十秒
    time.sleep(10)
    # 利用无线循环
    while True:
        # 控制帧率
        FPSCOLOCK.tick(FPS)
        for event in pygame.event.get():
            if event.type==MOUSEBUTTONUP:
                if auto_rect.collidepoint(event.pos):
                    print("单击了按钮")
                else:
                    print("单击了空白区域")
            elif event.type == KEYUP:
                if event.key in (K_LEFT,K_a):
                    print('向右键')
                elif event.key in (K_RIGHT,K_d):
                    print('向左键')
                elif event.key in (K_UP,K_w):
                    print('向上键')
                elif event.key in (K_DOWN,K_s):
                    print('向下键')
                elif event.key == K_ESCAPE:
                    print('退出游戏')
                    pygame.quit()


    # 卸载所有模块
    pygame.quit()

if __name__ =='__main__':
    main()

二、接苹果小游戏:

import random
from sys import exit
import pygame
from pygame.locals import *

# 屏幕宽度和高度
screen_width = 450
screen_height = 560

# 模块初始化
pygame.init()
# 绘制窗口
screen = pygame.display.set_mode((screen_width, screen_height), 0, 32)
# 游戏标题
pygame.display.set_caption("小人接苹果")
# 分数字体,字号
run_time_font = pygame.font.SysFont('D:/Software/字体/思源黑体/字体文件/SourceHanSansCN-Bold.otf', 48)

def game_start():
    # 加载图片
    peasant = pygame.image.load('peasant.png')
    apples = pygame.image.load('apples.png')
    game_background = pygame.image.load('background.png')
    # 苹果下落的速度
    speed = 1
    # 分数
    score = 0
    # 农民的位置信息
    peasant_x = 200
    peasant_y = 470
    # 设置移动速度
    peasant_x_speed = 1
    peasant_move = {K_LEFT: 0, K_RIGHT: 0}
    # 苹果坐标列表
    pos_list = []
    # 绘制初始化苹果
    for i in range(7):
        x = random.randint(0, 390)
        y = random.randint(0, 560)
        pos_list.append([x, y])
    # 帧率控制Clock对象
    clock = pygame.time.Clock()
    while True:
        screen.blit(game_background, (0, 0))
        # 接收信息处理
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            if event.type == KEYDOWN:
                if event.key in peasant_move:
                    peasant_move[event.key] = 1
            elif event.type == KEYUP:
                if event.key in peasant_move:
                    peasant_move[event.key] = 0
            # 距上次调用clock对象时间
            second_time_passed = clock.tick(60)
            # 定位农民移动后坐标
            peasant_x -= peasant_move[K_LEFT] * \
                         peasant_x_speed * second_time_passed
            peasant_x += peasant_move[K_RIGHT] * \
                         peasant_x_speed * second_time_passed
            # 判断农民边界条件
            if peasant_x > 450 - peasant.get_width():
                peasant_x = 450 - peasant.get_width()
            elif peasant_x < 0:
                peasant_x = 0

            screen.blit(peasant, (peasant_x, peasant_y))
            # 坐标循环,从y轴的上限往下限方向飘落
            for y in pos_list:
                y[1] = y[1] + speed
                # 打印苹果
                screen.blit(apples, (y[0], y[1]))
                if y[1] >= 560:
                    y[1] = -apples.get_height()
                # 碰撞检测
                if peasant_x < y[0] < peasant_x + peasant.get_width() and peasant_y - apples.get_height() < y[
                    1] < peasant_y:
                    score += 10
                    pos_list.remove([y[0], y[1]])
                    x, y = random.randint(0, 390), random.randint(0, 560)
                    if len(pos_list) <= 6:
                        pos_list.append([x, -y])
            screen_score = run_time_font.render(
                '分数:' + str(score), True, (255, 0, 0)
            )
            screen.blit(screen_score, (0, 0))
            # 刷新显示
            pygame.display.update()


if __name__ == '__main__':
    while True:
        game_start()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/532546.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rk3588开发板上安装ssh服务

目的&#xff1a;实现远程访问和控制&#xff0c;其他主机远程控制rk3588 方法及操作步骤&#xff1a; 1&#xff09;安装&#xff1a;sudo apt install openssh-server 2&#xff09; 查看运行状态 sudo systemctl status ssh 其它主机远程连接该开发板的ip和端口22即可

MVP模式

1、创建数据库表单对应的实体类。 package com.mvp.model; //Model(模型)&#xff0c;数据库表单对应的实体类。 public class Word {private int id;private String engName;private String chiVal;private String lastUsedTime;private int usedTimes;private String create…

【华为笔试题汇总】2024-04-10-华为春招笔试题-三语言题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

uniapp 轮播列表一排展示3个,左右滑动,滑动到中间放大

一、效果展示 二、代码实现 1.html代码&#xff1a; <!-- 轮播 --><view class"heade"><swiper class"swiper" display-multiple-items3 circulartrue previous-margin1rpx next-margin1rpxcurrent0 change"swiperChange">&l…

第 6 章 Gazebo仿真环境搭建(自学二刷笔记)

6.6.4 Gazebo仿真环境搭建 到目前为止&#xff0c;我们已经可以将机器人模型显示在 Gazebo 之中了&#xff0c;但是当前默认情况下&#xff0c;在 Gazebo 中机器人模型是在 empty world 中&#xff0c;并没有类似于房间、家具、道路、树木... 之类的仿真物&#xff0c;如何在 …

SQL注入sqli_labs靶场第三题

?id1and 11 and 11和?id1and 11 and 11进行测试如果11页面显示正常和原页面一样&#xff0c;并且12页面报错或者页面部分数据显示不正常&#xff0c;那么可以确定此处为字符型注入。 根据报错信息判断为单引号带括号注入 联合查询&#xff1a; 猜解列名 ?id1) order by 3-…

微服务项目sc2024第一个子项目

1. 第一个子项目 2.pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…

【测试开发学习历程】python迭代、可迭代对象、迭代器、生成器

1 迭代Iteration 迭代Iteration&#xff1a;所谓迭代就是重复运行一段代码语句块的能力&#xff0c;就好比在一个容器中进行一层一层遍历数据&#xff0c;在应用过程中for循环最为突出。迭代就是从某个容器对象中逐个地读取元素&#xff0c;直到容器中没有元素为止。迭代迭代&…

linux服务使用./xxx.sh执行脚本命令

设置脚本文件为全权限 chmod 777 xxx.sh直接使用./xxxx.sh即可

用dbms_shared_pool.purge清除执行计划

1.Oracle 11g如何清除share pool中某条SQL的执行计划 以前在Oracle 10g数据库上,如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法&#xff08;总不能alter system flush shared_pool&#xff09;,只能…

HTML+CSS+JS实现京东首页[web课设代码+模块说明+效果图]

系列文章目录 文章目录 系列文章目录前言一、HTML结构图二、CSS部分代码图三、每部分效果图展示3.1 导航栏、头部搜索栏效果图3.2 中心区域商品展示效果图3.3 秒杀区和特惠区域效果图3.4 页脚&#xff08;底部导航、版权信息、技术支持等内容&#xff09;效果图 总结 前言 用时…

【算法刷题 | 二叉树 06】4.10( 路径总和、路径总和 || )

文章目录 13.路径总和13.1问题13.2解法一&#xff1a;递归13.2.1递归思路&#xff08;1&#xff09;确定递归函数参数以及返回值&#xff08;2&#xff09;确定终止条件&#xff08;3&#xff09;确定递归逻辑 13.2.2代码实现 14.路径总和 ||14.1问题14.2解法一&#xff1a;递归…

CRM集成:解锁业务增长与客户关系管理的关键

预计从2021年至2028年&#xff0c;CRM领域的市场规模将大幅跃升&#xff0c;从约580亿美元增长至1290亿美元。这一显著的增长并非偶然&#xff0c;而是源于CRM平台为企业带来的巨大价值。客户关系管理平台助力销售高效开发潜在客户&#xff0c;客户成功经理有效支持客户&#x…

VRRP+MSTP+BFD

一、组网 二、要求 PC6&#xff08;vlan 10内PC&#xff09;访问1.1.1.1走JR-1——CORE1——MSR到1.1.1.1 PC7&#xff08;vlan 20内PC&#xff09;访问1.1.1.1走JR-2——CORE2——MSR到1.1.1.1 链路故障时切换路线&#xff0c;来回路径一致 三、配置步骤 SR bfd echo-sou…

30.WEB渗透测试-数据传输与加解密(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;29.WEB渗透测试-数据传输与加解密&#xff08;3&#xff09;-CSDN博客 加解密需要用到的源…

磁盘管理与文件管理

文章目录 一、磁盘结构二、MBR与磁盘分区分区的优势与缺点分区的方式文件系统分区工具挂载与解挂载 一、磁盘结构 1.硬盘结构 硬盘分类&#xff1a; 1.机械硬盘&#xff1a;靠磁头转动找数据 慢 便宜 2.固态硬盘&#xff1a;靠芯片去找数据 快 贵 硬盘的数据结构&#xff1a;…

InternVideo2重塑视频理解新标杆,多模态学习引领行业风向

引言&#xff1a;视频理解的新篇章——InternVideo2的介绍 随着视频内容在日常生活中的普及&#xff0c;视频理解技术的重要性日益凸显。视频不仅包含丰富的视觉信息&#xff0c;还蕴含着动态变化和多模态元素&#xff0c;如音频和文本。这些特性使得视频成为一个复杂的数据类型…

蓝桥杯-求阶乘

问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…

Leetcode算法训练日记 | day14

一、二叉树的前序遍历 1.题目 Leetcode&#xff1a;第 144 题 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#…

wps可以打钩的框框

方法一&#xff1a; 输入2611&#xff0c;按下altx 方法二&#xff1a; R 选中后->开始->字体wingdings字体