今天詳細(xì)的講一下英雄的出場 和位置累贤,我們先定義需求:
1:游戲啟動后,英雄出現(xiàn)在屏幕的中間位置,距離屏幕底部120像素
2:英雄每隔0.5秒發(fā)射一個子彈老赤,每次連發(fā)三枚子彈
3:默認(rèn)不會移動,需要左/右方向鍵源葫,控制英雄在水平方向移動
子彈需求:
1:子彈從英雄的正上方沿直線向上方飛行
2:子彈飛出屏幕后需要從精靈租中刪除
Hero-----英雄
~初始化方法
? ? ? ? ? ? ·指定英雄圖片 ? 诗越,? ·定義初始速度 =0(英雄靜止不動)
·定義 bullets子彈精靈組保存子彈精靈
`重寫 update()方法
`英雄需要水平移動
并且需要保證不能移出屏幕
增加bullets屬性,記錄所有子彈精靈
增加fire方法息堂,用于發(fā)射子彈
Bullet —— 子彈
初始化方法
指定子彈圖片
初始速度 = -2—— 子彈需要向上方飛行
重寫update()方法
判斷是否飛出屏幕嚷狞,如果是,從精靈組刪除
2:創(chuàng)建英雄
2.1 準(zhǔn)備英雄類
在plane_sprites新建Hero類
重寫初始化方法荣堰,直接指定圖片名稱床未,并且將初始速度設(shè)置為0
設(shè)置英雄的初始位置
class ? Hero ? (GameSprite):
"""英雄精靈"""
def__init__(self):
super().__init__("./images/me1.png",0)
# 設(shè)置初始位置
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.bottom -120
2.2 繪制英雄
1:在__create_sprites,添加英雄精靈和英雄精靈組
后續(xù)要針對英雄做碰撞檢測以及發(fā)射子彈
所以英雄需要單獨定義成屬性
2:在__update_sprites振坚,讓英雄精靈組調(diào)用update和draw方法
代碼實現(xiàn)
修改__create_sprites方法如下:
# 英雄組
self.hero = Hero()
self.hero_group = pygame.sprite.Group(self.hero)
修改__update_sprites方法如下:
self.hero_group.update()
self.hero_group.draw(self.screen)
03. 移動英雄位置
在pygame中針對鍵盤按鍵的捕獲薇搁,有兩種方式
第一種方式判斷event.type == pygame.KEYDOWN
第二種方式
1:首先使用pygame.key.get_pressed()返回所有按鍵元組
2:通過鍵盤常量,判斷元組中某一個鍵是否被按下—— 如果被按下渡八,對應(yīng)數(shù)值為1
提問這兩種方式之間有什么區(qū)別呢啃洋?
第一種方式
elif ? event.type == pygame.KEYDOWNandevent.key == pygame.K_RIGHT:
print("向右移動...")
第二種方式
# 返回所有按鍵的元組,如果某個鍵被按下屎鳍,對應(yīng)的值會是1
keys_pressed = pygame.key.get_pressed()
# 判斷是否按下了方向鍵
if? keys_pressed [pygame.K_RIGHT]:
print("向右移動...")
結(jié)論
第一種方式event.type用戶必須要抬起按鍵才算一次按鍵事件宏娄,操作靈活性會大打折扣
第二種方式用戶可以按住方向鍵不放,就能夠?qū)崿F(xiàn)持續(xù)向某一個方向移動了逮壁,操作靈活性更好
3.1 移動英雄位置
演練步驟
1.在Hero類中重寫update方法
用速度speed和英雄rect.x進行疊加
不需要調(diào)用父類方法—— 父類方法只是實現(xiàn)了單純的垂直運動
2.在__event_handler方法中根據(jù)左右方向鍵設(shè)置英雄的速度
向右=>speed = 2
向左=>speed = -2
其他=>speed = 0
代碼演練
在Hero類孵坚,重寫update()方法,根據(jù)速度水平移動英雄的飛機
def? update (self):
# 飛機水平移動
self.rect.x += self.speed
調(diào)整鍵盤按鍵代碼
# 獲取用戶按鍵
keys_pressed = pygame.key.get_pressed()
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()方法判斷英雄是否超出屏幕邊界
right = x + width利用rigth屬性可以非常容易的針對右側(cè)設(shè)置精靈位置
def ? update(self):
# 飛機水平移動
self.rect.x += self.speed
# 判斷屏幕邊界
if? self.rect.left <0:
self.rect.left =0
if ? self.rect.right > SCREEN_RECT.right:
self.rect.right = SCREEN_RECT.right
注意:我們在pygame中使用的圖片格式為.png格式窥淆,如果想要添加自己的圖片要注意格式