設(shè)計(jì)英雄和子彈類
英雄需求:
- 游戲啟動(dòng)后窥淆,英雄出現(xiàn)再屏幕的水平中間位置,距離屏幕底部120像素
- 英雄每隔0.5秒發(fā)射一次子彈,每次連發(fā)三枚子彈
- 英雄默認(rèn)不會(huì)移動(dòng)替饿,需要通過(guò)左/右方向鍵控制英雄在水平方向的移動(dòng)
子彈需求
- 子彈從英雄的正上方沿直線向上方飛行
- 飛出屏幕后责球,需要從精靈組中刪除
Hero——英雄
1. 初始化方法
- 指定英雄圖片
- 初始速度 = 0——英雄默認(rèn)靜止不動(dòng)
- 定義
bullets
子彈精靈組保存子彈精靈
2. 重寫update方法 - 英雄需要水平移動(dòng)
- 并且保證不能移出屏幕
3. 增加bullets
屬性焦履,記錄所有子彈精靈
4. 增加fire
方法,用于發(fā)射子彈
創(chuàng)建英雄
準(zhǔn)備英雄類
- 在
plane_sprites
中新建Hero
類 - 重寫初始化方法雏逾,直接指定圖片路徑嘉裤,并且將初始速度設(shè)置為0
- 設(shè)置英雄的初始位置
代碼實(shí)現(xiàn):
繪制英雄
- 在
__create_sprites
,添加英雄精靈和英雄精靈組
- 后續(xù)要針對(duì)英雄做碰撞檢測(cè)以及發(fā)射子彈
- 所以英雄需要單獨(dú)定義成屬性
- 在
__update_sprites
栖博,讓英雄精靈組調(diào)用update
和draw
方法
移動(dòng)英雄位置
在python中針對(duì)鍵盤按鍵的捕獲屑宠,有兩種方式:
- 判斷
event.type == pygame.KEYDOWN
- 1) 首先使用
pygame.key.get.pressed()
返回所有按鍵元素
2) 通過(guò)鍵盤常量,判斷元組中某一個(gè)鍵是否被按下——如果被按下對(duì)應(yīng)數(shù)值為1
提問(wèn):這兩種方式有什么區(qū)別呢仇让?
答:第一種方式用戶必須要抬起按鍵才算一次按鍵事件典奉,操作靈活性大打折扣;第二種方式用戶可以按住方向鍵不放丧叽,就能夠?qū)崿F(xiàn)持續(xù)向某一個(gè)方向移動(dòng)卫玖,靈活性更好
移動(dòng)實(shí)現(xiàn)
- 在
Hero
類中重寫update
方法
- 用速度
speed
和英雄rect.x
進(jìn)行疊加 - 不需要調(diào)用父類方法——因?yàn)楦割惙椒ㄖ皇菃渭兊膶?shí)現(xiàn)了垂直運(yùn)動(dòng)
- 在
__event_handler
方法中根據(jù)左右方向鍵設(shè)置英雄的速度
- 向右——
speed = 2
- 向左——
speed = -2
‘ - 其他——
speed = 0
控制英雄的運(yùn)動(dòng)邊界
在Hero
類的update()
方法判斷英雄是否超出屏幕邊界
right = x + width
利用right
屬性可以非常容易的針對(duì)右側(cè)設(shè)置精靈位置
發(fā)射子彈
添加發(fā)射子彈事件
pygame的定時(shí)器使用套路非常固定:
- 定義定時(shí)器常量——
eventid
- 在初始化方法中,調(diào)用
set_timer
方法設(shè)置定時(shí)器事件
- 在游戲循環(huán)中踊淳,監(jiān)聽定時(shí)器事件
定義子彈類
Bullet——子彈
- 初始化方法
- 指定子彈圖片
- 初始速度 = -2——子彈需要向上方飛行
- 重寫
update()
方法
- 判斷是否飛出屏幕假瞬,如果是,從精靈組中刪除
發(fā)射子彈
- 在
Hero
的初始化方法中創(chuàng)建子彈精靈組屬性
- 修改
plane_main.py
的__update_sprites
方法迂尝,讓子彈精靈組調(diào)用update
和draw
方法
- 實(shí)現(xiàn)
fire()
方法
- 創(chuàng)建子彈精靈
- 設(shè)置初始位置——在英雄的正上方
- 將子彈添加到精靈組
一次發(fā)射三枚子彈
修改
fire()
方法
2020.9.4