Python飞机大战

 GameSprite:

import sys

import pygame

SCREEN_SIZE = pygame.rect.Rect(0, 0, 400, 700)


class GameObject(pygame.sprite.Sprite):
    def __init__(self, path, speed_x=0, speed_y=0):
        super().__init__()
        # 控制游戏对象的图片
        self.img = pygame.image.load(path)
        self.rect = self.img.get_rect()
        self.speed_x = speed_x
        self.speed_y = speed_y

    # 游戏对象的位移函数
    def update(self, window):
        # 控制游戏对象的位移
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y
        window.blit(self.img, self.rect)


class Background(GameObject):
    def __init__(self, path, is_first):
        super().__init__(path)
        # 初始位置
        # 如果是第一个图片
        if is_first:
            self.rect.left = SCREEN_SIZE.left
            self.rect.top = SCREEN_SIZE.top
        # 如果不是第一个图片
        else:
            self.rect.bottom = SCREEN_SIZE.top
            self.rect.left = SCREEN_SIZE.left

        # 初始化移动速度
        self.speed_y = 1

    def update(self, window):
        super().update(window)
        # 边界检测
        if self.rect.top >= SCREEN_SIZE.bottom:
            self.rect.bottom = SCREEN_SIZE.top


class Hero(GameObject):
    def __init__(self, path):
        super().__init__(path)
        # 初始化位置
        self.me1 = pygame.image.load("images/images/me1.png")
        self.me2 = pygame.image.load("images/images/me2.png")
        self.rect.bottom = SCREEN_SIZE.bottom
        self.rect.centerx = SCREEN_SIZE.centerx
        self.count = 0
        self.bullets = []

    def update(self, window):
        super().update(window)
        if self.count < 20:
            self.img = self.me2
        elif 40 > self.count >= 20:
            self.img = self.me1
        else:
            self.count = 0
        # 边界检测
        # 左右
        if self.rect.left <= SCREEN_SIZE.left:
            self.rect.left = SCREEN_SIZE.left
        elif self.rect.right >= SCREEN_SIZE.right:
            self.rect.right = SCREEN_SIZE.right
        # 上下
        if self.rect.top <= SCREEN_SIZE.top:
            self.rect.top = SCREEN_SIZE.top
        elif self.rect.bottom >= SCREEN_SIZE.bottom:
            self.rect.bottom = SCREEN_SIZE.bottom

        self.count += 1
        # if self.fire_status:
        #     if self.count % 10 == 0:
        #         b = HeroBullet("images/bullet1.png", self)
        #         self.bullets.append(b)

    # 通过键盘来控制飞机移动
    def event_handler(self, even_list: list[pygame.event.Event]):
        for e in even_list:
            # 按下
            if e.type == pygame.KEYDOWN:
                if e.key == pygame.K_DOWN:
                    self.speed_y = 2
                elif e.key == pygame.K_UP:
                    self.speed_y = -2

                if e.key == pygame.K_LEFT:
                    self.speed_x = -2
                elif e.key == pygame.K_RIGHT:
                    self.speed_x = 2
                # if e.key == pygame.K_SPACE:
                #     self.fire_status = True
            # 抬起
            elif e.type == pygame.KEYUP:
                if e.key == pygame.K_DOWN or e.key == pygame.K_UP:
                    self.speed_y = 0
                if e.key == pygame.K_LEFT or e.key == pygame.K_RIGHT:
                    self.speed_x = 0
            elif e.type == pygame.QUIT:
                sys.exit()
                # if e.key == pygame.K_SPACE:
                #     self.fire_status = False
        # 获取按键状态的函数会返回一个元组,元组序号对应的就是按键id
        tp = pygame.key.get_pressed()
        if tp[32]:
            if self.count % 10 == 0:
                b = HeroBullet("images/images/bullet1.png", self)
                self.bullets.append(b)


class HeroBullet(GameObject):
    def __init__(self, path, hero: Hero):
        super().__init__(path)
        # 初始化子弹的位置
        self.rect.bottom = hero.rect.top
        self.rect.centerx = hero.rect.centerx
        # 初始化子弹速度
        self.speed_y = -5

GameMain:

from GameSprite import *


class GameMain:
    def __init__(self):
        pygame.init()
        self.window = pygame.display.set_mode(SCREEN_SIZE.size)
        self.clock = pygame.time.Clock()
        self.BG1 = Background("images/images/background.png", True)
        self.BG2 = Background("images/images/background.png", False)
        self.Hero = Hero("images/images/me1.png")

    def game_loop(self):
        while True:
            self.clock.tick(120)
            # 绘制游戏对象
            self.__draw()
            # 事件处理函数
            self.__event_handler()

    def __draw(self):
        # 先计算背景位置
        self.BG1.update(self.window)
        # 再将背景图片画到该位置上
        self.BG2.update(self.window)
        self.Hero.update(self.window)
        for b in self.Hero.bullets:
            b.update(self.window)
        pygame.display.update()

    def __event_handler(self):
        event_list = pygame.event.get()
        self.Hero.event_handler(event_list)


gm = GameMain()
gm.game_loop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值