Exemple #1
0
class Game(object):
    def __init__(self):
        pygame.init()   # 初始化pygame库
        self.score = 0
        self.window = pygame.display.set_mode([WIN_X, WIN_Y])  # 绘制游戏窗口(为了以后修改将窗口数据用常量)
        pygame.display.set_caption("飞机大战")  # 设置窗口标题
        # 设计游戏图标步骤1 加载图片(凡是涉及到添加图形,音乐的都要先把内容加载都内存)  2 调用set_icon()
        img = pygame.image.load("res/app.ico")  # 因为这个img只在__init__函数里面使用故不加self
        pygame.display.set_icon(img)
        self.map = Map(self.window)
        self.hero = Hero(self.window)
        self.enemys_list = [Enemy(self.window) for _ in range(4)]
        pygame.mixer.music.load("res/bg2.ogg")  # 加载背景音乐
        pygame.mixer.music.play(-1)      # 循环播放背景音乐
        self.f = pygame.font.SysFont("宋体", 36)

    def inputOrder(self):
        # 获得所有事件的列表
        event_list = pygame.event.get()
        for event in event_list:
            # 1. 鼠标点击关闭窗口事件
            if event.type == pygame.QUIT:
                print("关闭了窗口")
                sys.exit()
                # 2. 键盘按下事件
            if event.type == pygame.KEYDOWN:   # 现有键盘按下时间才能对按下那个键进行判断,这个容易忘
                # 判断用户按下的键是否是空格键
                if event.key == pygame.K_SPACE:
                    self.hero.shot()

    def is_bullet_hit_enemy(self):
        for i in self.enemys_list:
            for j in self.hero.bullets_list:
                if pygame.Rect.colliderect(i.rect, j.rect):
                    self.score += 1
                    i.reserve()

    def is_hero_hit_enemy(self):
        for i in self.enemys_list:
            if pygame.Rect.colliderect(i.rect, self.hero.rect):
                return True
            else:
                return False

    def move(self):
        self.map.move()
        self.hero.move()
        for i in self.enemys_list:
            i.move()
        self.is_bullet_hit_enemy()

    def blited(self):
        self.text_surface = self.f.render("SCORE: %s" % self.score, True, (0, 0, 255))
        self.map.blited()
        self.hero.blited()
        self.window.blit(self.text_surface, (340, 10))
        for i in self.enemys_list:
            i.blited()

    @staticmethod       # 因为图片更新方法不需要任何参数所以设置成静态方法
    def update():
        pygame.display.update()

    def run(self):
        # 游戏运行时主要有下面四件事
        self.inputOrder()     #1 接受外界输入指令
        self.move()         #2 接受命令后导致图片移动
        if self.is_hero_hit_enemy():      # 如果飞机被撞结束游戏
            self.is_over()
        self.blited()       #3 图片重新绘制
        self.update()       #4 图片更新

    def is_over(self):
        pygame.mixer.music.stop()  # 停止背景音乐
        boom_sound = pygame.mixer.Sound("res/gameover.wav")  # 加载音效
        boom_sound.play()  # 播放音效
        while True:
            event_list = pygame.event.get()
            for event in event_list:
                # 1. 鼠标点击关闭窗口事件
                if event.type == pygame.QUIT:
                    print("关闭了窗口")
                    sys.exit()

    def main(self):
        while True:
            self.run()
Exemple #2
0
class PlaneWar(object):
    def __init__(self):
        pygame.init()
        # 创建游戏窗口对象
        self.window = pygame.display.set_mode([WINDOW_WIDTH, WINDOW_HEIGHT])

        self.set_window()
        self.map = Map(self.window)
        self.hero = Hero(self.window)
        self.enemy = [Enemy(self.window) for _ in range(4)]
        self.score = 0

    @staticmethod
    def set_window():
        # 设置窗口标题
        pygame.display.set_caption("飞机大战2018正常版")

        # 设置窗口小图标--icon
        icon = pygame.image.load("res/app.ico")
        pygame.display.set_icon(icon)
        # 加载背景音乐
        pygame.mixer.music.load("./res/bg2.ogg")
        # 循环播放背景音乐
        pygame.mixer.music.play(-1)

    def events(self):
        """执行窗口事件"""
        # 窗口事件
        event_list = pygame.event.get()

        for event in event_list:
            # 1. 鼠标点击关闭窗口事件
            if event.type == pygame.QUIT:
                print("关闭了窗 口")
                sys.exit()

            # 2. 键盘按下事件
            if event.type == pygame.KEYDOWN:

                # 判断用户按下的键是否是空格键
                if event.key == pygame.K_SPACE:
                    print("按了空格 ")
                    self.hero.shot()  # 飞机发射子弹

    def move(self):
        """处理各个对象(飞机、子弹、敌机、地图)的移动"""
        self.map.move()
        self.hero.move()
        for i in self.hero.bullets:  # i就是每一个子弹
            i.move()

        for i in self.enemy:  # i是每一只敌机
            i.move()

    def blit(self):
        """绘制窗口中需要 显示 的所有的对象"""
        self.map.blited()
        self.hero.blited()
        for i in self.enemy:  # i是每一只敌机
            i.blited()

    def update(self):
        """更新界面"""
        pygame.display.update()

    def is_bullet_hit_enemy(self):
        # 判断两个矩形是否相交,相交返回True,否则返回False
        # flag = pygame.Rect.colliderect(rect1, rect2)
        # if flag:

        for i in self.enemy:
            for j in self.hero.bullets:
                if pygame.Rect.colliderect(i.rect, j.rect):
                    i.reset()
                    self.score += 20
                    # self.hero.bullets.remove(j)

    def is_hero_hit_enemy(self):
        for i in self.enemy:
            if pygame.Rect.colliderect(i.rect, self.hero.rect):
                return True  # 如果相交了就返回真
        else:
            return False

    def write(self, text, y, font_size):
        font = pygame.font.SysFont('SimHei', font_size)
        # render(text(文本内容), antialias(抗锯齿), color(RGB)),返回文字对象
        textobj = font.render(text, 1, (200, 200, 200))

        # 设置文字矩形对象位置
        textrect = textobj.get_rect()
        textrect.move_ip(WINDOW_WIDTH / 2 - textrect[2] / 2, y)
        # 在指定位置绘制指定文字对象
        self.window.blit(textobj, textrect)
        # 更新界面
        pygame.display.update()

    def wait_player_input(self):
        while True:
            # 窗口事件
            event_list = pygame.event.get()

            for event in event_list:
                # 1. 鼠标点击关闭窗口事件
                if event.type == pygame.QUIT:
                    print("关闭了窗 口")
                    sys.exit()
                # 2. 键盘按下事件
                if event.type == pygame.KEYDOWN:

                    # 判断用户按下的键是否是a键
                    if event.key == pygame.K_RETURN:
                        print("按了回车")
                        return

    def gameover(self):
        # 停止背景音乐
        pygame.mixer.music.stop()
        # 加载音效
        boom_sound = pygame.mixer.Sound("./res/gameover.wav")
        # 播放音效
        boom_sound.play()

        self.write("游戏结束", 150, 50)
        self.write("按Enter关闭窗口", 230, 40)
        self.wait_player_input()

    def gamebegin(self):
        """游戏开始界面"""
        self.map.blited()
        self.write("游戏开始", 150, 50)
        self.write("按Enter开始游戏", 230, 40)
        self.wait_player_input()

    def run(self):

        self.gamebegin()
        while True:
            # 1、事件
            self.events()
            # 2、各个对象(飞机、子弹、敌机、地图)的移动
            self.move()

            # 判断子弹是否打中敌机
            self.is_bullet_hit_enemy()
            # 判断飞机是否撞击到敌机
            if self.is_hero_hit_enemy():
                break
            # 3、往窗口中绘制图片
            self.blit()
            self.write("得分:%s" % self.score, 0, 30)
            # 4、更新界面
            self.update()
        # gameover界面
        self.gameover()
Exemple #3
0
class PlaneWar(object):
    def __init__(self):  # 定义初始值;define the initial value
        # 初始化pygame
        # Initialization of pygame
        pygame.init()

        # 创建窗口;set window sizes
        window = pygame.display.set_mode(
            [setting.WIN_WIDTH, setting.WIN_HEIGHT])

        # 调用设置窗口;run setting window properties
        self.set_window()

        # 创建对象;create objects
        self.map = Map(window)
        self.hero = Hero(window)
        self.enemy = [Enemy(window) for _ in range(4)]

    @staticmethod
    def set_window():
        # 设置窗口标题;set window caption
        pygame.display.set_caption("AirWar1.0")
        # 加载窗口图标;load window's image
        icon = pygame.image.load("res/game.ico")
        # 设置窗口图标;set window's image
        pygame.display.set_icon(icon)

    # 定义事件方法;define events method
    def events(self):
        # 获取响应事件;get the events in response
        event_list = pygame.event.get()
        # 遍历事件;traversal events
        for event in event_list:
            # 鼠标点击关闭窗口事件(解决未响应);exit event
            if event.type == pygame.QUIT:
                print("关闭了窗口")
                sys.exit()
            # 判断是否空格;if press space,shoot
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    self.hero.shooting()

    # 定义移动方法;define a movement method
    def move(self):
        self.map.move()
        self.hero.move()

        # 每一个子弹都需要调用自己的move方法;each bullet needs to call its own move method
        for i in self.hero.bullets:
            i.move()

        # 移动每一个敌机;move each enemy
        for i in self.enemy:
            i.move()

    def hit_enemy(self):
        # 判断两个矩形是否相交,相交返回True,否则返回False;to determine whether two rectangles intersect, the intersection returns True or False
        for i in self.hero.bullets:
            for j in self.enemy:
                if pygame.Rect.colliderect(i.bullet_rect, j.enemy_rect):
                    j.enemy_reset()

    def crash(self):
        # 判断两个矩形是否相交,相交返回True,否则返回False;to determine whether two rectangles intersect, the intersection returns True or False
        for i in self.enemy:
            if pygame.Rect.colliderect(i.enemy_rect, self.hero.hero_rect):
                return True
        else:
            return False

    # 定义绘制方法;define the drawing method
    def blit(self):
        self.map.blited()
        self.hero.blited()

        # 遍历绘制敌机;iterating over to draw the enemys
        for i in self.enemy:
            i.blited()

    # 定义显示方法;define display method
    def display(self):
        pygame.display.update()

    def gameover(self):
        while True:
            # 获取响应事件;get the events in response
            event_list = pygame.event.get()
            # 遍历事件;traversal events
            for event in event_list:
                # 鼠标点击关闭窗口事件(解决未响应);exit event
                if event.type == pygame.QUIT:
                    print("关闭了窗口")
                    sys.exit()

    # 定义运行方法;define the operation method
    def run(self):
        while True:

            # 1.调用事件方法;run events method
            self.events()
            # 2.各个对象的移动;run a movement method
            self.move()
            # 3.判断是否打中敌机;judge whether you hit the enemys
            self.hit_enemy()
            if self.crash():
                break
            # 4.绘制图片对象;run a bullet method
            self.blit()
            # 5.更新界面;update display content
            self.display()
        self.gameover()