系列文章目录
目标
·设计英雄
·使用pygame.key.get_pressed()移动英雄
一、设计英雄
英雄需求
- 游戏启动后,英雄出现在屏幕的水平中间位置,距离屏幕底部120像素
- 英雄默认不会移动,需要通过左/右方向键移动,控制在水平方向移动
思路:
Hero——英雄
·初始化方法
??指定英雄图片
??初始速度 = 0——英雄默认静止不动
??
·重写update方法
??英雄需要水平移动
??并且需要保证不能移出屏幕
1.1? ?准备英雄类
·在plane_sprites新建Hero类
·重写初始化方法,指定图片名称,并且将初始速度设置为0
·设置英雄的初始位置
·centerx = x + 0.5 * width
·centery = y + 0.5 * height
·bottom = y + height
操作:
?代码:
class Hero(GameSprite):
"""英雄精灵"""
def __init__(self):
# 1. 调用父类方法设置image和speed
super().__init__("./images/me1.png", 0)
# 2. 设置英雄的初始位置
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.bottom - 120
1.2??? 绘制英雄
①, 在__create_sprites,添加英雄精灵和英雄精灵组
??·后续要针对英雄做碰撞检测以及发射子弹
??·所以英雄需要单独定义成属性
?
②,??在__update_sprites,让英雄精灵组调用update和draw方法
?运行结果:
二、移动英雄的位置
?在pygame中针对键盘按键的捕获,有两种方式
·第一种 判断 event.type == pygame.KEYDOWN
操作:
?代码:
elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT
print(“向右移动”)
·第二种
- 首先使用pygame.key.get_pressed()返回所有按键元组
- 通过按键常量,判断元组中某一个键是否被按下——如果被按下,对应的数值为 1
操作:
?代码:
# 返回所有按键的元组,如果某一个键被按下,对应的数字位置1
keys_pressed = pygame.key.get_pressed()
#判断是否按下了方向键
if keys_pressed [pygame.K_RIGHT]:
print(“向右移动”)
(结论:使用第二种键盘模块的好处可以一直按住右键让英雄持续移动,操作灵活性更加好。而第一种是按一下动一下)
2.1? ?移动英雄位置
演练步骤
1.? ?在Hero类中重写update方法
??·用速度 speed和英雄rect.x进行叠加
??·不需要调用父类方法——父类方法只是实现了单纯的垂直运动
2.? ?在__event_handler方法中根据左右方向键设置英雄的速度
??·向右->speed =2
??·向左->speed = -2
??·其他->speed = 0
?
?程序运行结果:
飞机可以左右移动操作了,如果想飞机移动快一点,可以把飞机移动的速度调快就行
2.2? ?控制英雄的运动边界
·在Hero 类的update() 方法判断 英雄是否超出屏幕边界
?·right = x + width 利用right属性可以非常容易的针对右侧设置精灵位置
?
?这样之后,飞机就不会从屏幕的左右两边移动出去了
总结
英雄飞机设计就已经完成了。其实飞机和子弹一起做文章发出来比较好,但是因为最近白天要工作,只有晚上抽空学习,所以学习的进度比较慢。实在抱歉。
|