## 定義子彈類
完成對飛機的控制后,我們來增加子彈類。在src目錄下新增bullet.py文件,定義Bullet類,代碼如下:
```
import pygame
class Bullet(pygame.sprite.Sprite):
def __init__(self):
super(Bullet, self).__init__()
self.image = pygame.image.load('../assets/missile.png')
self.rect = self.image.get_rect()
self.speed = 1
def update(self):
self.rect.y -= self.speed
```
修改我們的Main.py
1)引入Bullet:`from src.bullet import Bullet`
2)定義Bullet角色:
```
bullet_sprites = pygame.sprite.Group()
bullet = Bullet()
bullet_sprites.add(bullet)
all_sprites.add(bullet)
```
這里需要注意:bullet同時加到了 bullet_sprites和all_sprites
此時游戲效果如下:

## 發射子彈
接下來,我們來用空格鍵來控制子彈的發射。首先,我們修改Bullet類,在子彈被創建的時候需要指定子彈的位置:
```
def __init__(self, position):
super(Bullet, self).__init__()
self.image = pygame.image.load('../assets/missile.png')
self.rect = self.image.get_rect()
self.speed = 1
self.rect.x = position[0]
self.rect.y = position[1]
```
接著,我們來修改Main類。子彈需要在空格鍵被按下時初始化,我們把原來子彈初始化的代碼,移動到空格被按下的位置:
```
if key_pressed[K_SPACE]:
bullet = Bullet((plane.rect.x, plane.rect.y))
bullet_sprites.add(bullet)
all_sprites.add(bullet)
```
此時游戲效果如下:

so far so good,仔細觀察游戲,現在子彈發射的好快。我們需要降低子彈發射的速度。
首先,我們在bullet增加兩個類屬性和一個類方法:
```
# 注意,這里定義的是類屬性
# 子彈發射間隔,毫秒單位
shoot_delay = 250
# 上次子彈發射時間
last_shoot_time = 0
# 類方法,增加子彈,這里會根據上次發射時間來決定是否能構建新子彈
@classmethod
def new_bullet(cls, position):
if pygame.time.get_ticks() - cls.last_shoot_time > cls.shoot_delay:
cls.last_shoot_time = pygame.time.get_ticks()
return Bullet(position)
```
然后,在main.py里修改空格被按下時的代碼:
```
if key_pressed[K_SPACE]:
bullet = Bullet.new_bullet((plane.rect.x, plane.rect.y))
if bullet:
bullet_sprites.add(bullet)
all_sprites.add(bullet)
```
此時,游戲就合理多了:

## 定義敵艦
子彈定義好后,我們來增加敵艦。在src目錄里新增enemy.py文件,代碼如下:
```
import pygame
class Enemy(pygame.sprite.Sprite):
def __init__(self, position):
super(Enemy, self).__init__()
self.image = pygame.image.load('../assets/enemy1.png')
self.rect = self.image.get_rect()
self.rect.x = position[0]
self.rect.y = position[1]
self.speed = 1
def update(self):
self.rect.y += self.speed
```
在main.py中通過`from src.enemy import Enemy`引入Enemy,初始化6個敵艦:
```
enemy_sprites = pygame.sprite.Group()
for i in range(6):
enemy = Enemy((random.randrange(0, WIDTH), random.randrange(0, 50)))
enemy_sprites.add(enemy)
all_sprites.add(enemy)
```
此時,游戲效果如下:

下節課,我們來完成擊落敵艦。
- 課程介紹
- 搭建環境
- 什么是計算機
- 程序是怎么運行的
- 安裝python
- 項目實例-安裝IDE
- 變量和簡單數據類型
- 數據&變量
- 數字
- 字符串
- 布爾類型
- 項目實例
- 容器-列表
- 容器
- 列表
- 項目實例
- 容器-字典
- 定義字典
- 項目實例
- 數據類型總結
- 條件語句
- python條件語句
- 項目實例
- 循環語句
- for循環
- while循環
- 項目實例
- 函數
- 5.0函數定義
- 5.2函數實戰
- 6.文件系統
- 6.1 文件系統介紹&python查找文件
- 6.2 用python讀寫文件
- 7. python操作時間
- 8.面向對象
- 8.1 類和對象
- 8.2 繼承和重寫
- 8.3 面向對象項目實戰
- 9 GUI編程
- 9.1 GUI基礎
- 9.2 備忘清單GUI版
- 10.網絡
- 10.1 網絡的發展
- 10.2 python http
- 11.web開發
- 11.1 web基礎&HTML
- 11.2 CSS&JavaScript
- 11.3 網頁計算器
- 11.3 網站開發實戰-播客搭建
- 11.3 python-web
- 12. 項目實戰-數據處理
- 13. 項目實戰-AI入門
- 13.1 環境搭建
- 心得
- 13.2 Tensorflow的瓜怎么吃
- 14 pygame
- 14.1 pygame Helloworld
- 14.4 pygame 動畫基礎 Animation
- 從0開始學python第14.5節 pygame 加載圖片和聲音
- 從0開始學python第14.6節 pygame.sprite(上)
- 14.7 pygame.sprite模塊(下)
- 14.8 pygame射擊游戲(一)
- pygame射擊游戲(二)
- 14.8 pygame射擊游戲(三)
- 14.8 pygame射擊游戲(四)
- 14.8 pygame射擊游戲(五)