星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来

news2024/11/18 9:25:51

目录

前言

一、监听按键并作出判断

 二、持续移动

 三、左右移动

 总结:


前言

今天开始正式操控我们的小蜜蜂了,之前学java的时候是有一个函数监听鼠标和键盘的操作,我们通过传过来不同的值进行判断,现在来看看python是否一样的实现。

一、监听按键并作出判断

 以我浅薄的知识判断,流程应该为时刻监听键盘或者鼠标的操作,然后判断键盘是否点击的方向键,假如点击一下向左移动,那么我们就将小蜜蜂的位置向左移动一个设定好的距离,然后再显示在屏幕上。我们专门创建了一个模块game_functions来存放游戏操作的代码,那么我们在game_functions模块里面编写就性,下面我们看看代码:

import sys
import pygame

def check_events(ship):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                ship.rect.centerx += 1
def update_screen(new_setting,screen,ship):
    screen.fill(new_setting.bg_color)
    ship.blitme()

    pygame.display.flip()

可以看出,我们将check_events()函数进行了补充,增加了判断,之前只是判断是否点击了关闭,现在增加了对键盘输入的判断,我们详细分析一下:

1、首先判断事件类型是否为键盘事件KEYDOWN。pygame.KEYDOWN是一个事件类型,指的是键盘上某个键被按下的事件。当键盘上的某个键被按下时,pygame会生成一个KEYDOWN事件,程序可以通过检测这个事件来获取键盘按键的信息,如按下的是哪个键、是否同时按下了Shift、Ctrl等修饰键。

2、当判断我们确实是在键盘按下某个键后,进入下一步判断,判断到底是按了哪个键,代码中我们目前只写的按向右移动的键。常见的event.key值包括:

  • pygame.K_UP/K_DOWN/K_LEFT/K_RIGHT表示方向键上下左右
  • pygame.K_SPACE表示空格键
  • pygame.K_ESCAPE表示Esc键
  • pygame.K_RETURN表示回车键
  • pygame.K_a到pygame.K_z表示26个字母键

3、当我们判断匹配后,我们需要将小蜜蜂位置向右移动一格,那么我们需要改变Ship模块里面的rect.centerx值,将它加1,那么我们就需要传入ship,因此在定义check_events()是要设置参数,将ship传进来。

 我们将check_events()函数修改好以后,那么我们就需要在主函数里调用它,之前我们已经调用了check_events()函数用来判断程序的关闭,但是现在因为要加传参进去,所以略加修改,增加传参ship就行。

import pygame
import settings
from ship import Ship
import game_functions as gf

def run_game():
    pygame.init()
    new_setting=settings.Settings()
    screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height))
    ship = Ship(screen)
    pygame.display.set_caption("Alien Invasion")

    while True:
        gf.check_events(ship)
        gf.update_screen(new_setting,screen,ship)


run_game()

 

 

 通过运行程序,点击右方向键,我们可以看出,小蜜蜂向右进行了移动。

 二、持续移动

 在操作的过程中,我发现我需要不停的点击右移动键才能实现小蜜蜂不断右移动,这是反人性的,以我多年打cs、街头篮球、QQ飞车、泡泡堂的经验来说,人类更习惯于点着不放实现持续移动,喜欢连发,而不喜欢点射。“大蟒蛇”很贴心的告诉我们下一步该怎么实现持续功能。

 “大蟒蛇”提供的思路是:不再以按下向右移动键为判断小蜜蜂向右移动的条件,而是设置另一个变量(比如m),m初始值为0,如果按下右移动键,m为1,只要m等于1,小蜜蜂就向右移动,如果m等于0,小蜜蜂就不动。个人觉得思路可行,只需要再加一个判断,判断松开右移动键时,将0赋值给m。下面我们来看代码

import pygame

class Ship():
    def __init__(self,screen):
        self.screen = screen
        self.image = pygame.image.load('cat.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom=self.screen_rect.bottom

        self.moving_right = False
        
        
    def update(self):
        if self.moving_right:
            self.rect.centerx += 1
        
        

    def blitme(self):
        self.screen.blit(self.image,self.rect)

 我们看到,我们重写了Ship模块,不仅是增加了一个变量(moving_right就相当于我之前说的m,True和False就相当于1和0),还增加了函数update,将小蜜蜂的移动写到了这里,那么我们的主函数和game_functions也要作出相应修改(为什么不写在game_functions里?)

import sys
import pygame

def check_events(ship):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                ship.moving_right = True
                
        elif event.type==pygame.KEYUP:
            if event.key == pygame.K_RIGHT:
                ship.moving_right = False
                
                
def update_screen(new_setting,screen,ship):
    screen.fill(new_setting.bg_color)
    ship.blitme()

    pygame.display.flip()

我们可以看出,在game_functions模块里面,我们只需要将moving_right变量进行修改,就能控制小蜜蜂的移动。如果能理解前面我们的思路,那么KRYUP状态就很好理解了,就是弹起或者说松开按键的意思。下面我们再在主程序对我们新建立的update函数调用就行了。

import pygame
import settings
from ship import Ship
import game_functions as gf

def run_game():
    pygame.init()
    new_setting=settings.Settings()
    screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height))
    ship = Ship(screen)
    pygame.display.set_caption("Alien Invasion")

    while True:
        gf.check_events(ship)
        ship.update()
        gf.update_screen(new_setting,screen,ship)


run_game()

 三、左右移动

 上面我们已经实现了向右移动,那么向左移动就变得十分简单,只需要在同样的地方加一个判断就行,这里建议大家自己写,我们只需要在ship和game_functions模块添加代码就行。

 ship:

import pygame

class Ship():
    def __init__(self,screen):
        self.screen = screen
        self.image = pygame.image.load('cat.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom=self.screen_rect.bottom

        self.moving_right = False
        self.moving_left = False


    def update(self):
        if self.moving_right:
            self.rect.centerx += 1

        if self.moving_left:
            self.rect.centerx -= 1


    def blitme(self):
        self.screen.blit(self.image,self.rect)

 game_functions:

import sys
import pygame

def check_events(ship):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                ship.moving_right = True

            elif event.key == pygame.K_LEFT:
                ship.moving_left = True

        elif event.type==pygame.KEYUP:
            if event.key == pygame.K_RIGHT:
                ship.moving_right = False

            if event.key == pygame.K_LEFT:
                ship.moving_left = False

def update_screen(new_setting,screen,ship):
    screen.fill(new_setting.bg_color)
    ship.blitme()

    pygame.display.flip()

  

 总结:

 今天我们完成了小蜜蜂的左右移动,由点及面,窥一斑可见全豹,我们可以整理一下思路,之后我们只需要建立大黄蜂模块和子弹模块,然后在那两个模块里设置变量控制他们的移动和消失,就可以初步完成游戏的基本功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

框架分析(1)-IT人必须会

框架分析(1)-IT人必须会 专栏介绍当今主流框架前端框架后端框架移动应用框架数据库框架测试框架 Angular关键特点和功能:组件化架构双向数据绑定依赖注入路由功能强大的模板语法测试友好 优缺点分析优点缺点 总结 专栏介绍 link 主要对目前市…

计算机竞赛 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

Datawhale 北邮分部成立了!

Datawhale分部 联合发起:陈玉立、陈逸涵、夏镇、李泽钜、邢植尧 蓟门以南,明光之北。杏坛向西,城垣东望。厚德博学,敬业乐群。 BYR,Datawhale北京邮电大学分部(北邮AI俱乐部)来啦! …

微信好友恢复大师两招教你找回微信好友

在使用微信的时候,一些小伙伴可能没有给好友备注的习惯,所以很容易在清理“僵尸好友”时会不小心误删。如果您没有保存对方的联系方式,并且你们之间也没有共同好友,那么该如何重新加回好友呢?今天,小编就要…

Springboot 自定义 Mybatis拦截器,实现 动态查询条件SQL自动组装拼接(玩具)

前言 ps:最近在参与3100保卫战,战况很激烈,刚刚打完仗,来更新一下之前写了一半的博客。 该篇针对日常写查询的时候,那些动态条件sql 做个简单的封装,自动生成(抛砖引玉,搞个小玩具&a…

【已解决】Please install Node.js and npm before continuing installation.

给juopyter lab安装插件时报这个错 原因是,conda本身有nodejs,但是版本很低,只有0.几 所以需要卸载掉原来的nodejs,重新安装10版本以上的nodejs # 卸载命令 pip uninstall nodejs # 安装命令 conda install nodejs14.7.0 -c cond…

从入门到精通:微信小程序跳转页面的实用指南

前言 微信小程序中页面跳转方法的灵活运用不仅可以提升用户体验,还能为应用增添更多创意和吸引力。本文将为大家详细介绍微信小程序跳转页面的方法,让你的应用与众不同,为用户带来全新的体验。 方式一:wx.navigateTo 保留当前页面…

第1步---MySQL安装和配置

第1步---MySQL安装和配置 1.下载地址 MySQL :: Download MySQL Community Server (Archived Versions) 直接下载zip形式的就可以。 2.在bin的同级目录下常见my.ini文件。 输入下面的内容 my.ini中的文本: [mysqld] #设置3306端口 port3306 character-set-server…

DELL R740 R750服务器安装Windows 11

正常安装出现如下 2、同时按下ShiftF10组合键调出管理员命令提示符窗口,依次执行下面命令,输入命令,按Enter键执行,提示操作成功完成,才可以。这些命令可以添加注册表项,绕过TPM、安全启动、CPU、内存和硬盘…

Linux常用命令——diffstat命令

在线Linux命令查询工具 diffstat 显示diff命令输出信息的柱状图 补充说明 diffstat命令用来显示diff命令输出信息的柱状图,用以显示diff命令比较两个文件的不同统计信息。用户也可以直接使用|将diff命令所输出的结果直接送给diffstat命令进行统计结果的显示。使…

如何编写一个通用的函数?

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 金句分享:…

微信个人号开发,实现机器人辅助社群操作

微信 iPad 协议是指用于在 iPad 设备上使用微信应用的技术协议。一般来说,通过该协议可以将微信账号同步到 iPad 设备上,并且可以在 iPad 上发送和接收微信消息,查看好友列表、聊天记录等功能。微信 iPad 协议是通过私有API实现的。 需要一定…

图片转文字生成器分享,再也不用担心转换麻烦

在现今社交媒体时代,图片已经成为人们传递信息的重要方式之一。但是,由于有些图片可能不易于理解或者文字更能够准确表达内容,将图片转换为文字已经成为了一种常见的需求。在本文中,我们将分享一些将图片转换为文字的方法以及需要…

SIP桌面式对讲主机 井下通信广播sip寻呼话筒

SV-8003VP是我司的一款SIP桌面式对讲主机,具有10/100M以太网接口,配置了麦克风输入和扬声器输出,还配置多达22个按键和2.8英寸液晶显示屏,可以配合SIP服务器使用。SV-8003VP网路寻呼话筒可以通过麦克风或者本地线路输入对SIP终端进…

Java-异常分析和处理

Java异常处理 在Java中,将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的: 算术异常 数组越界异常 空指针异常 异常的体系结构 Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Except…

AgentBench:AI智能体对AI行业发展的意义

自从今年年初ChatGPT引爆了生成式AI的概念之后,就有大量的企业和投资人宣布要进入AI行业,一场轰轰烈烈的“百模大战”由此展开。然而,在短短半年之后,当初高调下场的大多数企业再也没有了相关声音。 如果我们对这场“百模大战”进行复盘,就会发现很多企业的失败其实从一…

C++ 11 实现简单线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲&…

新版QQ NT 桌面版如何实现内存优化

一、背景 QQ 作为国民级应用,从互联网兴起就一直陪伴着大家,是很多用户刚接触互联网就开始使用的应用。而 QQ 桌面版最近一次技术架构升级还是在移动互联网兴起之前,在多年迭代过程中,QQ 桌面版也积累了不少技术债务,随着业务的发展和技术的进步,当前的架构已经无法很好…

[git]gitpush提示remote: Permission to xxx.git denied to xxx

错误原因:git客户端你先前登录过其他用户导致,你用另一个账号push的时候用的先前用户 解决方法:删除先前用户用你想push用户重新登录 解决步骤: 打开控制面板-->查看方式选择大图标-->然后打开凭据管理器 找到github相关…

Mybatis的环境搭建

目录 一.Mybatis的环境搭建 1.创建项目 2.进行相关配置 3.安装插件 4.插件的使用 一.Mybatis的环境搭建 1.创建项目 1.1 创建Maven项目,配置好相应的JDK和archetype 1.2 给项目命名和创建目录结构 1.3 添加自定义Property自定义属性 2.进行相关配置 2.1 导入p…