练习 12-6:侧面射击 编写一个游戏,将一艘飞船放在屏幕左侧,并允许玩家上下移动飞船。在玩家按空格键时,让飞船发射一颗在屏幕中向右飞行的子弹,并在子弹从屏幕中消失后将其删除。
主打一个功能实现,但不切题,这次做一个郭芙蓉的排山倒海~
效果图如下:
代码如下:
1.kung_fu.py
import sys
import pygame
from settings import Settings
from furong import Furong
from attack import Attack
class Kungfu:
def __init__(self):
pygame.init()
self.settings = Settings()
self.screen = pygame.display.set_mode(
(self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption('排山倒海')
self.furong = Furong(self)
self.attack = pygame.sprite.Group()
def run_game(self):
while True:
self._check_events()
self.furong.update()
self._upadte_attack()
self._update_screen()
def _check_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_keydown_events(event)
elif event.type == pygame.KEYUP:
self._check_keyup_events(event)
def _check_keydown_events(self, event):
if event.key == pygame.K_UP:
self.furong.moving_top = True
elif event.key == pygame.K_DOWN:
self.furong.moving_bottom = True
elif event.key == pygame.K_SPACE:
self._fire_attack()
def _check_keyup_events(self, event):
if event.key == pygame.K_UP:
self.furong.moving_top = False
elif event.key == pygame.K_DOWN:
self.furong.moving_bottom = False
def _fire_attack(self):
if len(self.attack) < self.settings.attack_allowed:
new_attack = Attack(self)
self.attack.add(new_attack)
def _update_screen(self):
self.screen.fill(self.settings.bg_color)
self.furong.blitme()
for attack in self.attack.sprites():
attack.draw_attack()
pygame.display.flip()
def _upadte_attack(self):
self.attack.update()
for attack in self.attack.copy():
if attack.rect.left >= self.screen.get_rect().right:
self.attack.remove(attack)
# print(len(self.attack))
if __name__ == '__main__':
ai = Kungfu()
ai.run_game()
2.furong.py
import pygame
class Furong:
def __init__(self, ai_game):
self.screen = ai_game.screen
self.settings = ai_game.settings
# 使用方法get_rect()访问屏幕的属性rect,并将其赋予self.screen_rect,这让我们能够将飞船放到屏幕的正确位置
self.screen_rect = ai_game.screen.get_rect()
self.image = pygame.image.load('images/furong.bmp')
self.rect = self.image.get_rect()
self.rect.midleft = self.screen_rect.midleft
self.y = float(self.rect.y)
self.moving_top = False
self.moving_bottom = False
def update(self):
if self.moving_top and self.rect.top > 0:
self.y -= self.settings.furong_speed
if self.moving_bottom and self.rect.bottom < self.screen_rect.bottom:
self.y += self.settings.furong_speed
self.rect.y = self.y
def blitme(self):
self.screen.blit(self.image, self.rect)
3.settings.py
class Settings:
def __init__(self):
self.screen_width = 400
self.screen_height = 300
self.bg_color = (226, 225, 228)
# 设置芙蓉移动速度
self.furong_speed = 0.1
# 攻击设置
self.attack_speed = 0.01
self.attack_width = 50
self.attack_height = 20
self.attack_color = (102, 169, 201)
self.attack_allowed = 2
4.attack.py
import pygame
from pygame.sprite import Sprite
class Attack(Sprite):
def __init__(self, ai_game):
super().__init__()
self.screen = ai_game.screen
self.settings = ai_game.settings
self.color = self.settings.attack_color
self.rect = pygame.Rect(0, 0, self.settings.attack_width, self.settings.attack_height)
self.rect.midleft = ai_game.furong.rect.midright
self.x = float(self.rect.x)
def update(self):
self.x += self.settings.attack_speed
self.rect.x = self.x
def draw_attack(self):
pygame.draw.rect(self.screen, self.color, self.rect)