python飞机大战系列文章(按顺序)
(一)通过pygame 将自己的图像添加到游戏中
(二)通过pygame让游戏人物 动起来
(三)通过pygame处理用户的鼠标键盘操作(事件和监听
(四)详解pygame中的精灵和精灵组
(五)通过pygame搭建游戏框架
(六)通过pygame让游戏背景图像实现交替滚动
(七)通过pygame来设置飞机大战中 敌机 的速度、位置等
(八)通过pygame来操控游戏人物的移动
(九)通过pygame使游戏人物发射子弹
(十)通过pygame来进行碰撞检测


文章目录

  • 需求分析
  • 创建英雄人物
  • 移动英雄位置

在游戏中,如何操控人物??

  • 使用pygame.key.get_pressed()来移动英雄人物

那移动人物之前,应该先把英雄人物(也就是英雄飞机)绘制到屏幕上。

需求分析

在写代码之前,先进行需求分析,要分析英雄的需求和子弹的需求

英雄需求

  1. 游戏启动后,英雄出现在屏幕的水平中间的位置,距离屏幕底部120像素
  2. 英雄每隔0.5秒发射一次子弹,每次连发三枚子弹
  3. 英雄默认不会移动,需要通过 左/右 方向键,控制英雄在水平方向上的移动

子弹需求

  1. 子弹从英雄的正上方发射,沿直线向上方飞行
  2. 飞出屏幕后,需要从精灵组中删除


英雄类:
①初始化方法:指定英雄图片;设置初始速度为0,英雄默认不动;定义bullets子弹精灵组,来保存子弹精灵

②重写update()方法:英雄需要水平移动,并且要保证不能移出屏幕

③增加fire方法,用于发射子弹

子弹类:
①初始化方法:指定子弹图片;子弹需要向上飞行,所以设置初始速度为-2
②重写update()方法:判断是否飞出屏幕,如果是,从精灵组删除

创建英雄人物

在plane_sprites.py中创建Hero类

class Hero(GameSprite):"""英雄精灵"""def __del__(self):#调用父类方法,设置image和speedsuper().__init__("./images/me1.png",0)#设置英雄的初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120

接下来就在__create_sprites,添加英雄精灵和英雄精灵组,因为后续要针对英雄做碰撞检测以及发射子弹,所以英雄需要单独定义成属性

#创建英雄的精灵和精灵组
self.hero = Hero()
self.hero_group = pygame.sprite.Group(self.hero)

再在__update_sprites中,让英雄精灵组调用update和draw方法

self.hero_group.update()
self.hero_group.draw(self.screen)

移动英雄位置

在移动英雄位置前,先要知道在pygame中,如何捕获键盘的按键

  • 方法一:遍历事件列表,判断event.type == pygame.KEYDOWN,特点:若想再次触发事件,用户需要抬起手指,再按下按键
  • 方法二:先使用pygame.key.get_pressed()返回所有按键元祖,再通过键盘常量,来判断元祖中某一个键是否被按下,如果被按下,对应数值为1,特点:可以按下某个键不放,让人物持续移动,操作灵活性更好

【这里我们就用方法二】

#使用键盘提供的方法获取键盘按键 --按键元组
keys_pressed = pygame.key.get_pressed()
#判断元组中对应的按键索引值 1
if keys_pressed[pygame.K_RIGHT]:print("向右移动")

步骤

  1. 在Hero类中重写update方法:①用速度speed和英雄rect.x进行叠加 ②不需要调用父类方法—父类方法只是实现了单纯的垂直运动
  2. 在__event_handler方法中根据左右方向键设置英雄的速度:向右:speed = 2;向左:speed=-2;其他:speed=0

英雄类中update方法为:

def update(self):#英雄在水平方向移动self.rect.x += self.speed

在__event_handler方法中增添以下代码:

#使用键盘提供的方法获取键盘按键 --按键元组
keys_pressed = pygame.key.get_pressed()
#判断元组中对应的按键索引值 1
if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2
elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2
else:self.hero.speed = 0

以上代码 英雄人物是可以飞出屏幕的,所以接下来再控制英雄,使其不让飞出屏幕
我们在Hero类的update方法里修改,判断是否飞出屏幕
代码如下:

#控制英雄不能离开屏幕
if self.rect.x < 0:self.rect.x = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.right

至此,plane_sprites.py的代码为:

import random
import pygame#屏幕大小的常量
SCREEN_RECT = pygame.Rect(0,0,480,700)
#刷新的帧率
FRAME_PER_SEC = 60
#创建敌机的定时器常量
CREATE_ENEMY_EVENT = pygame.USEREVENTclass GameSprite(pygame.sprite.Sprite):"""飞机大战游戏精灵"""def __init__(self, image_name, speed=1):#调用父类的初始化方法super().__init__()#定义对象属性self.image = pygame.image.load(image_name)self.rect = self.image.get_rect()self.speed = speeddef update(self):#在屏幕垂直方向上移动self.rect.y += self.speedclass Background(GameSprite):"""游戏背景精灵"""def __init__(self, is_alt=False):# 调用父类方法实现精灵的创建(image/rect/speed)super().__init__("./images/background.png")# 判断是否是交替图像,如果是,需要设置初始位置if is_alt:self.rect.y = -self.rect.heightdef update(self):#调用父类的方法实现:垂直移动super().update()#判断是否移出屏幕,若移出屏幕,应该将图像设置到图像上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.heightclass Enemy(GameSprite):"""敌机精灵"""def __init__(self):#调用父类方法,创建敌机精灵,同时指定敌机图片super().__init__("./images/enemy1.png")#指定敌机的初始随机速度self.speed = random.randint(1,3)#指定敌机的初始随机位置max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0,max_x)def update(self):#调用父类方法,保持垂直方向上的飞行super().update()#判断是否飞出屏幕,如果是,需要从精灵组删除敌机if self.rect.y >= SCREEN_RECT.height:#print("飞出屏幕,需要从精灵组删除")#kill 方法可以将精灵从所有精灵组中移出,精灵就会被自动销毁self.kill()def __del__(self):# print("敌机挂了 %s" %self.rect)passclass Hero(GameSprite):"""英雄精灵"""def __init__(self):#调用父类方法,设置image speedsuper().__init__("./images/me1.png", 0)#设置英雄初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120def update(self):#英雄在水平方向移动self.rect.x += self.speed#控制英雄不能离开屏幕if self.rect.x < 0:self.rect.x = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.right

plane_main.py的代码为:

import pygame
from plane_sprites import *class PlaneGame(object):"""飞机大战主游戏"""def __init__(self):print("游戏初始化")#创建游戏窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)#创建游戏的时钟self.clock = pygame.time.Clock()#调用私有方法,精灵和精灵组的创建self.__create_sprites()#设置定时器事件:创建敌机事件pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)def __create_sprites(self):#创建背景精灵和精灵组bg1 = Background()bg2 = Background(is_alt=True)self.back_group = pygame.sprite.Group(bg1, bg2)#创建敌机的精灵组self.enemy_group = pygame.sprite.Group()#创建英雄的精灵和精灵组self.hero = Hero()self.hero_group = pygame.sprite.Group(self.hero)def start_game(self):print("游戏开始")while True:#设置刷新帧率self.clock.tick(FRAME_PER_SEC)#事件监听self.__event_handler()#碰撞检测self.__check_collide()#更新/绘制精灵组self.__update_sprites()#更新显示pygame.display.update()def __event_handler(self):for event in pygame.event.get():#判断是否退出游戏if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:print("敌机出场")#创建敌机精灵enemy = Enemy()#将敌机精灵添加到敌机精灵组self.enemy_group.add(enemy)#使用键盘提供的方法获取键盘按键 --按键元组keys_pressed = pygame.key.get_pressed()#判断元组中对应的按键索引值 1if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2else:self.hero.speed = 0def __check_collide(self):passdef __update_sprites(self):self.back_group.update()self.back_group.draw(self.screen)self.enemy_group.update()self.enemy_group.draw(self.screen)self.hero_group.update()self.hero_group.draw(self.screen)#没有使用对象属性和类属性,所以定义为静态方法@staticmethoddef __game_over():print("游戏结束")pygame.quit()exit()if __name__ == '__main__':#创建游戏对象game = PlaneGame()#启动游戏game.start_game()

至此,我们可以通过键盘的方向键来操控我们的英雄飞机左右移动,并且不飞出屏幕了

(八)通过pygame来操控游戏人物的移动相关推荐

  1. (二)通过pygame让游戏人物 动起来

    python飞机大战系列文章(按顺序) (一)通过pygame 将自己的图像添加到游戏中 (二)通过pygame让游戏人物 动起来 (三)通过pygame处理用户的鼠标键盘操作(事件和监听 (四)详解 ...

  2. (九)通过pygame使游戏人物发射子弹

    python飞机大战系列文章(按顺序) (一)通过pygame 将自己的图像添加到游戏中 (二)通过pygame让游戏人物 动起来 (三)通过pygame处理用户的鼠标键盘操作(事件和监听 (四)详解 ...

  3. (五)通过pygame搭建游戏框架

    python飞机大战系列文章(按顺序) (一)通过pygame 将自己的图像添加到游戏中 (二)通过pygame让游戏人物 动起来 (三)通过pygame处理用户的鼠标键盘操作(事件和监听 (四)详解 ...

  4. (七)通过pygame来设置飞机大战中 敌机 的速度、位置等

    python飞机大战系列文章(按顺序) (一)通过pygame 将自己的图像添加到游戏中 (二)通过pygame让游戏人物 动起来 (三)通过pygame处理用户的鼠标键盘操作(事件和监听 (四)详解 ...

  5. (六)通过pygame让游戏背景图像实现交替滚动

    python飞机大战系列文章(按顺序) (一)通过pygame 将自己的图像添加到游戏中 (二)通过pygame让游戏人物 动起来 (三)通过pygame处理用户的鼠标键盘操作(事件和监听 (四)详解 ...

  6. 第二次力扣周赛:排名149 / 2046;在完赛边缘打转(总结了5点,实力还不够)

    前言: 上午10:30 - 12:00 第二次力扣周赛,最后一题也写完了,但是没有通过.完成了 3 / 4 的题,排名 149 / 2046. 赛题:https://leetcode-cn.com/c ...

  7. 编程自学网站(赶紧收藏)

    慕课网 网址:http://www.imooc.com 慕课网是一个在线学习网站,不过形式是视频,视频的形式呢,开始入门还是挺不错的,不过后来就转战到实验楼了,因为发现看再多也不如动手去操作,不过慕课 ...

  8. 佳能eosr控制环能否计算机控制,关于全画幅微单相机 你可能不知道的十件事

    01关于微单相机你不知道的十件事 2018年之前,全画幅微单领域没有竞争,索尼一家独大,徕卡只走奢侈路线.为了满足专业摄影师和资深发烧玩家更多的使用需求,佳能.尼康和松下纷纷加入战局,在2018年开启 ...

  9. 第二证券|监管层紧盯内幕交易 市场生态持续改善

    日前,昊志机电.弘亚数控两家公司高管均因涉嫌内情买卖被立案查询.同花顺数据显现,本年以来,已有八家公司实践操控人.高管.股东等涉嫌内情买卖被立案查询.近年来,监管层"零忍受"立体法 ...

最新文章

  1. spring ioc原理分析
  2. 土木工程计算机仿真学科未来前景,土木工程的发展现状与未来发展趋势
  3. Laravel深入学习5 - 应用架构
  4. Redis安装配置和介绍
  5. hdu 1251统计难题
  6. 收藏!史上最全的30个生物实验技术及原理
  7. pic单片机低电压检测_pic单片机汇编语言讲解(上)
  8. VMware License Server使用经验
  9. spring配置讲解
  10. spark 把一列数据合并_Spark DataFrame列的合并与拆分
  11. PRINCE2认证的优势是什么?
  12. 想定制Android系统实现改机?看完我也会了
  13. 高度的思想境界的几个特征
  14. PS4 自建HEN服务器 | 使用IDM 克隆整个网站
  15. c++:std::dec, std::hex, std::oct
  16. 蛤蟆 Oracle,19.蛤蟆的Oracle杂记——数据字典dba_views
  17. S3Browser配置、使用与允许跨域设置
  18. Anybackup-7.0.8.0系统配置-授权管理
  19. Java化小数为分数_杭电oj1717——小数化分数(java实现)
  20. 【剁手】科技发烧友最爱的产品,光是看看就想剁手!

热门文章

  1. java comparable方法_JAVA 泛型 - ComparableT
  2. 新库上线 | CnOpenData舆情云数据
  3. 微信小程序的事件处理,附面试题答案
  4. Android 获取便携式热点开关状态、热点开启与关闭
  5. torch.nn模块之池化层详解
  6. 将stdout重定向到Python中的文件?
  7. OpenAI发布新一代大型多模态模型 GPT-4
  8. 回收站的文件删除了怎么恢复
  9. 分析如何用金融学的知识促进修真世界、末日世界、游戏世界等世界的社会进步
  10. JVM原理(一)JVM通识、JVM架构