作业:侧面射击之排山倒海

练习 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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值