基于 Python 的横版 2D 动作类小游戏

基于 Python 的横版 2D 动作类小游戏

游戏代码

游戏整体代码(基于 pygame 模块开发)

// An highlighted block
import pygame
import random


# Colors (R, G, B)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

WIDTH = 1280  # 游戏窗口宽度
HEIGHT = 700  # 游戏窗口高度
FPS = 100  # Frames Per Second

speed = 6  # 要求是 3 的倍数,类中用到了 speed / 3
gongji = 10

geshu = 5  # 地图个数


# 将一系列动作图片加载到一个列表中
def load_sprites(image_path, image_name_prefix, number_of_image, size_x=0, size_y=0):

    images = []  # 保存连续动作图片的列表

    for i in range(0, number_of_image):

        path = image_path + image_name_prefix + str(i) + '.png'  # 创建路径
        image = pygame.image.load(path).convert_alpha()  # 加载图片并将其转换为像素格式
        image.set_colorkey(WHITE)

        if size_x > 0 and size_y > 0:
            image = pygame.transform.scale(image, (size_x, size_y))  # 调节图片大小

        images.append(image)

    return images


# 加载单个图片
def load_image(image_path, image_name, size_x=0, size_y=0):

    path = image_path + image_name + '.png'  # 创建路径
    image = pygame.image.load(path).convert_alpha()  # 加载图片并将其转换为像素格式
    image.set_colorkey(WHITE)

    if size_x > 0 and size_y > 0:
        image = pygame.transform.scale(image, (size_x, size_y))  # 调节图片大小

    return image


def begin():
    global running
    beijing_rect.left = 0
    beijing_rect.top = 0
    title_rect.left = 300
    title_rect.top = 150
    screen.blit(beijing, beijing_rect)
    screen.blit(title, title_rect)
    pygame.display.flip()
    wait = True
    while wait:
        clock.tick(FPS)
        for shijian in pygame.event.get():
            if shijian.type == pygame.QUIT:
                running = False
                wait = False
            if shijian.type == pygame.KEYUP:
                wait = False


class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.idle_images = load_sprites('image/Player/Idle/', 'Idle_', 1)
        self.idle_fan_images = load_sprites('image/Player/Idle/', 'Idle_fan_', 1)
        self.running_images = load_sprites('image/Player/Run/', 'Run_', 4)
        self.running_fan_images = load_sprites('image/Player/Run/', 'Run_fan_', 4)
        self.hurt_images = load_sprites('image/Player/Hurt/', 'Hurt_', 1)
        self.hurt_fan_images = load_sprites('image/Player/Hurt/', 'Hurt_fan_', 1)

        self.die_images = load_sprites('image/Player/Die/', 'Die_', 5)
        self.die_fan_images = load_sprites('image/Player/Die/', 'Die_', 5)
        for i in range(5):
            self.die_fan_images[i] = pygame.transform.flip(self.die_fan_images[i], True, False)
        self.combo_images = load_sprites('image/Player/Combo/', 'Combo_', 9)
        self.combo_fan_images = load_sprites('image/Player/Combo/', 'Combo_', 9)
        for i in range(9):
            self.combo_fan_images[i] = pygame.transform.flip(self.combo_fan_images[i], True, False)
        self.skill_0_images = load_sprites('image/Player/Skill/Skill_0/', 'Ren_', 7)
        self.skill_0_fan_images = load_sprites('image/Player/Skill/Skill_0/', 'Ren_', 7)
        for i in range(7):
            self.skill_0_fan_images[i] = pygame.transform.flip(self.skill_0_fan_images[i], True, False)
        self.skill_1_images = load_sprites('image/Player/Skill/Skill_1/', 'Ren_', 7)
        self.skill_1_fan_images = load_sprites('image/Player/Skill/Skill_1/', 'Ren_', 7)
        for i in range(7):
            self.skill_1_fan_images[i] = pygame.transform.flip(self.skill_1_fan_images[i], True, False)
        self.skill_2_images = load_sprites('image/Player/Skill/Skill_2/', 'Ren_', 7)
        self.skill_2_fan_images = load_sprites('image/Player/Skill/Skill_2/', 'Ren_', 7)
        for i in range(7):
            self.skill_2_fan_images[i] = pygame.transform.flip(self.skill_2_fan_images[i], True, False)

        self.huifu_images = load_sprites('image/Player/Skill/Buff/', 'Ren_', 18)
        self.huifu_fan_images = load_sprites('image/Player/Skill/Buff/', 'Ren_', 18)
        for i in range(18):
            self.huifu_fan_images[i] = pygame.transform.flip(self.huifu_fan_images[i], True, False)
        self.texiao_images = load_sprites('image/Player/Skill/Buff/', 'Texiao_', 5)
        self.texiao_fan_images = load_sprites('image/Player/Skill/Buff/', 'Texiao_', 5)
        for i in range(5):
            self.texiao_fan_images[i] = pygame.transform.flip(self.texiao_fan_images[i], True, False)

        self.win_images = load_sprites('image/Player/Win/', 'Win_', 5)
        self.win_fan_images = load_sprites('image/Player/Win/', 'Win_', 5)
        for i in range(5):
            self.texiao_fan_images[i] = pygame.transform.flip(self.texiao_fan_images[i], True, False)

        self.born_images = load_sprites('image/Player/Born/', 'Born_', 17)

        self.image = self.idle_images[0]

        self.rect = self.idle_images[0].get_rect()

        self.born_rect = self.born_images[0].get_rect()

        self.radius = int(self.rect.width * 1 / 5)  # 规定碰撞半径

        self.rect.bottom = HEIGHT - 50
        self.rect.left = 50

        self.born_rect.bottom = self.rect.bottom - 50
        self.born_rect.left = self.rect.left + 60

        self.hp = 100
        self.mp = 100
        self.gongji = gongji

        self.born_index = 0
        self.idle_index = 0
        self.running_index = 0
        self.die_index = 0
        self.hurt_index = 0
        self.fight_index = 0
        self.skill_index = 0
        self.buff_index = 0
        self.win_index = 0

        self.fan = False

        self.speed_heng = speed
        self.speed_shu = speed * 3 / 4

        self.born = True
        self.idle = False
        self.running = False
        self.die = False
        self.hurt = False
        self.fighting = False
        self.win = False

        self.combo = False

        self.skill = False
        self.skill_0 = False
        self.skill_1 = False
        self.skill_2 = False

        self.huifu = False
        self.brave = False

        self.daji = False

        self.bofang_win = True
        self.bofang_defeat = True

        self.count = 0  # 调节动作快慢
        self.hurt_count = 0  # 调节受伤动作持续时间
        self.fight_count = 0
        self.skill_count = 5
        self.brave_count = 0
        self.buff_count = 5

    def update(self):

        global gameover

        # 首先判断是否死亡
        if self.hp <= 1:
            self.die = True
            self.idle = False
            self.running = False
            self.hurt = False
            self.fighting = False
            self.huifu = False
            self.brave = False
            if self.die_index == 4:
                gameover = True
            self.hp = 1

        if self.die and self.bofang_defeat:
            defeat_sound.play()
            self.bofang_defeat = False

        if self.win and self.bofang_win:
            win_sound.play()
            self.bofang_win = False

        # 被打击时停止一切活动,但是技能不会被打断
        if self.hurt and not self.skill:
            self.idle = False
            self.running = False
            self.fighting = False

            self.running_index = 0
            self.fight_index = 0

        # 出生
        if self.born:
            if self.born_index == 16:
                self.born = False

        # 确定当前动作

        if self.fan:
            if self.idle:
                self.image = self.idle_fan_images[self.idle_index]
            if self.running:
                self.image = self.running_fan_images[self.running_index]
            if self.die:
                self.image = self.die_fan_images[self.die_index]
            if self.hurt:
                self.image = self.hurt_fan_images[self.hurt_index]
            if self.fighting:
                if self.combo:
                    self.image = self.combo_fan_images[self.fight_index]
                if self.skill_0:
                    self.image = self.skill_0_fan_images[self.skill_index]
                if self.skill_1:
                    self.image = self.skill_1_fan_images[self.skill_index]
                if self.skill_2:
                    self.image = self.skill_2_fan_images[self.skill_index]
            if self.huifu or self.brave:
                self.image = self.huifu_fan_images[self.buff_index]

            if self.win:
                self.image = self.win_fan_images[self.win_index]

        else:
            if self.idle:
                self.image = self.idle_images[self.idle_index]
            if self.running:
                self.image = self.running_images[self.running_index]
            if self.die:
                self.image = self.die_images[self.die_index]
            if self.hurt:
                self.image = self.hurt_images[self.hurt_index]
            if self.fighting:
                if self.combo:
                    self.image = self.combo_images[self.fight_index]
                if self.skill_0:
                    self.image = self.skill_0_images[self.skill_index]
                if self.skill_1:
                    self.image = self.skill_1_images[self.skill_index]
                if self.skill_2:
                    self.image = self.skill_2_images[self.skill_index]
            if self.huifu or self.brave:
                self.image = self.huifu_images[self.buff_index]

            if self.win:
                self.image = self.win_images[self.win_index]

        if self.born:
            self.image = self.born_images[self.born_index]

        # 玩家攻击碰撞检测

        if self.fighting:
            enemy = pygame.sprite.spritecollide(player, enemy_sprites, False, pygame.sprite.collide_circle)
            if self.combo and (
                    self.fight_index == 2 or self.fight_index == 4 or self.fight_index == 6) and self.daji:
                for diren in enemy:
                    if abs(player.rect.center[1] - diren.rect.center[1]) < 30:
                        diren.hurt = True
                        if self.fight_index == 2:
                            diren.hp -= 0.5 * self.gongji
                        if self.fight_index == 4:
                            diren.hp -= self.gongji
                        if self.fight_index == 2:
                            diren.hp -= 1.5 * self.gongji
                self.daji = False

            if (self.skill_0 or self.skill_1) and self.skill_index == 3 and self.daji:
                for diren in enemy:
                    if abs(player.rect.center[1] - diren.rect.center[1]) < 30:
                        diren.hurt = True
                        diren.hp -= 3 * self.gongji
                self.daji = False

            if self.skill_2 and self.skill_index == 3 and self.daji:
                for diren in enemy:
                    if abs(player.rect.center[1] - diren.rect.center[1]) < 30:
                        diren.hurt = True
                        diren.hp -= 5 * self.gongji
                self.daji = False

        # 根据输入判定下一步行为动作

        keystate = pygame.key.get_pressed()

        # 移动

        if keystate[pygame.K_w] or keystate[pygame.K_a] or keystate[pygame.K_s] or keystate[pygame.K_d]:
            self.running = True
            self.idle = False

        else:
            self.running = False
            self.idle = True
            self.running_index = 0  # 恢复初始动作

        # 攻击

        if (keystate[pygame.K_j] or keystate[pygame.K_u] or keystate[pygame.K_i] or keystate[pygame.K_o]) and \
                not self.win:

            self.fighting = True

        if self.fighting and not self.die:

            if keystate[pygame.K_j] and not self.skill:
                self.combo = True
                self.idle = False

                self.running = False
                self.running_index = 0  # 恢复初始动作

            elif self.combo and (self.fight_index == 2 or self.fight_index == 4 or self.fight_index == 6):
                self.combo = False
                self.fight_index = 0
                self.fight_count = 0
                if not running:
                    self.idle = True

            if self.skill_0 or self.skill_1 or self.skill_2 or self.huifu or self.brave:
                self.skill = True
            else:
                self.skill = False

            if keystate[pygame.K_u] and not self.combo and not self.skill and self.mp >= 30:
                self.mp -= 30

                self.skill_0 = True
                self.idle = False

                self.running = False
                self.running_index = 0  # 恢复初始动作

                jineng = PlayerSkillZhan()
                all_sprites.add(jineng)

            elif self.skill_0 and self.skill_index == 6:
                self.skill_0 = False
                self.skill_index = 0
                self.skill_count = 5
                if not running:
                    self.idle = True

            if keystate[pygame.K_i] and not self.combo and not self.skill and self.mp >= 30:
                self.mp -= 30

                self.skill_1 = True
                self.idle = False

                self.running = False
                self.running_index = 0  # 恢复初始动作

                jineng = PlayerSkillTiao()
                all_sprites.add(jineng)

            elif self.skill_1 and self.skill_index == 6:
                self.skill_1 = False
                self.skill_index = 0
                self.skill_count = 5
                if not running:
                    self.idle = True

            if keystate[pygame.K_o] and not self.combo and not self.skill and self.mp >= 50:
                self.mp -= 50

                self.skill_2 = True
                self.idle = False

                self.running = False
                self.running_index = 0  # 恢复初始动作

                jineng = PlayerSkillChop()
                all_sprites.add(jineng)

            elif self.skill_2 and self.skill_index == 6:
                self.skill_2 = False
                self.skill_index = 0
                self.skill_count = 5
                if not running:
                    self.idle = True

        if keystate[pygame.K_k] and not self.combo and not self.skill and not self.die and not self.win:
            self.huifu = True
            self.buff_count = 5

            self.idle = False
            self.running = False
            self.running_index = 0  # 恢复初始动作

            jineng = PlayerBuff()
            all_sprites.add(jineng)

        elif self.huifu and self.buff_index == 17:
            self.huifu = False
            self.buff_index = 0
            if not running:
                self.idle = True

        elif self.huifu:
            self.hp += 0.2
            if self.hp >= 100:
                self.hp = 100

        if keystate[pygame.K_l] and not self.combo and not self.skill and not self.die and not self.win:
            self.brave = True
            self.buff_count = 5

            self.idle = False
            self.running = False
            self.running_index = 0  # 恢复初始动作

            jineng = PlayerBuff()
            all_sprites.add(jineng)

        elif self.brave and self.buff_index == 17:
            self.brave = False
            self.buff_index = 0
            self.buff_count = 5
            if not running:
                self.idle = True

        if self.brave and self.buff_index == 15:
            self.gongji = 2 * gongji
            self.brave_count = 0
        elif self.brave_count >= 300:
            self.gongji = gongji

        # 及时取消玩家释放技能状态

        if self.skill_0 or self.skill_1 or self.skill_2 or self.huifu or self.brave:
            self.skill = True
        else:
            self.skill = False

        if not self.combo and not self.skill_0 and not self.skill_1 and not self.skill_2:

            self.fighting = False

        # 玩家移动

        # 调整玩家进行攻击动作时的移动速度
        if self.fighting:
            self.speed_heng = speed / 3
        else:
            self.speed_heng = speed

        # 移动
        if not self.die and not self.skill and not self.born and not self.win:
            if keystate[pygame.K_a]:
                self.fan = True
                self.rect.x = self.rect.x - self.speed_heng
            if keystate[pygame.K_d]:
                self.fan = False
                if not background.bianjie:
                    self.rect.x = self.rect.x + self.speed_heng
            if keystate[pygame.K_w]:
                self.rect.y = self.rect.y - self.speed_shu
            if keystate[pygame.K_s]:
                self.rect.y = self.rect.y + self.speed_shu

        # 限制玩家位置

        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.top < HEIGHT / 4 - 20:
            self.rect.top = HEIGHT / 4 - 20
        if self.rect.bottom > HEIGHT - 100:
            self.rect.bottom = HEIGHT - 100

        # 控制各个动作的频率

        if self.running and self.count % 6 == 0:
            self.running_index = (self.running_index + 1) % 4
        if self.die and self.count % 10 == 0 and self.die_index < 4:
            self.die_index = self.die_index + 1
        if self.hurt and self.hurt_count % 15 == 0:
            self.hurt = False

        if self.fighting and self.combo and self.fight_count % 6 == 0:
            self.daji = True
            self.fight_index = (self.fight_index + 1) % 9

        if self.fighting and (self.skill_0 or self.skill_1 or self.skill_2) and self.skill_count % 6 == 0:
            self.daji = True
            self.skill_index = self.skill_index + 1

        if self.huifu and self.buff_count % 6 == 0:
            self.buff_index = self.buff_index + 1

        if self.brave and self.buff_count % 6 == 0:
            self.buff_index = self.buff_index + 1

        if self.born and self.count % 6 == 0:
            self.born_index = self.born_index + 1

        if self.win and self.count % 6 == 0:
            self.win_index = (self.win_index + 1) % 5

        # 控制回蓝速度

        if self.count % 10 == 0:
            self.mp += 1
            if self.mp > 100:
                self.mp = 100

        # 更新各项计数器

        self.count = self.count + 1
        self.hurt_count = self.hurt_count + 1
        self.fight_count = self.fight_count + 1
        self.skill_count = self.skill_count + 1
        self.buff_count = self.buff_count + 1

    def draw(self):
        if self.born:
            screen.blit(self.image, self.born_rect)
        else:
            screen.blit(self.image, self.rect)


class PlayerSkillZhan(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.skill_0_images = skill_0_L0_images
        self.skill_0_fan_images = skill_0_L0_fan_images

        self.skill_index = 0

        if player.fan:
            self.image = self.skill_0_fan_images[self.skill_index]
        else:
            self.image = self.skill_0_images[self.skill_index]

        self.rect = self.image.get_rect()

        self.rect.bottom = player.rect.bottom - 10

        if player.fan:
            self.rect.left = player.rect.left - 20
        else:
            self.rect.left = player.rect.left - 35

        self.skill_count = 0

    def update(self):

        self.rect.bottom = player.rect.bottom - 10

        if player.fan:
            self.rect.left = player.rect.left - 20
        else:
            self.rect.left = player.rect.left - 35

        if player.fan:
            self.image = self.skill_0_fan_images[self.skill_index]

        else:
            self.image = self.skill_0_images[self.skill_index]

        if self.skill_count % 6 == 0:
            self.skill_index = self.skill_index + 1
            if self.skill_index > 5:
                self.kill()

        self.skill_count = self.skill_count + 1

    def draw(self):

        screen.blit(self.image, self.rect)


class PlayerSkillTiao(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.skill_1_images = skill_1_L0_images
        self.skill_1_fan_images = skill_1_L0_fan_images

        self.skill_index = 0

        if player.fan:
            self.image = self.skill_1_fan_images[self.skill_index]
        else:
            self.image = self.skill_1_images[self.skill_index]

        self.rect = self.image.get_rect()

        self.rect.bottom = player.rect.bottom

        if player.fan:
            self.rect.left = player.rect.left - 400
        else:
            self.rect.left = player.rect.left - 400

        self.skill_count = 0

    def update(self):

        self.rect.bottom = player.rect.bottom

        if player.fan:
            self.rect.left = player.rect.left - 400
        else:
            self.rect.left = player.rect.left - 400

        if player.fan:
            self.image = self.skill_1_fan_images[self.skill_index]

        else:
            self.image = self.skill_1_images[self.skill_index]

        if self.skill_count % 6 == 0:
            self.skill_index = self.skill_index + 1
            if self.skill_index > 5:
                self.kill()

        self.skill_count = self.skill_count + 1

    def draw(self):

        screen.blit(self.image, self.rect)


class PlayerSkillChop(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.skill_2_images = skill_2_L0_images
        self.skill_2_fan_images = skill_2_L0_fan_images

        self.skill_index = 0

        if player.fan:
            self.image = self.skill_2_fan_images[self.skill_index]
        else:
            self.image = self.skill_2_images[self.skill_index]

        self.rect = self.image.get_rect()

        self.rect.bottom = player.rect.bottom - 15

        self.rect.left = player.rect.left - 5

        self.skill_count = 0

    def update(self):

        self.rect.bottom = player.rect.bottom - 15

        self.rect.left = player.rect.left - 5

        if player.fan:
            self.image = self.skill_2_fan_images[self.skill_index]

        else:
            self.image = self.skill_2_images[self.skill_index]

        if self.skill_count % 6 == 0:
            self.skill_index = self.skill_index + 1
            if self.skill_index > 5:
                self.kill()

        self.skill_count = self.skill_count + 1

    def draw(self):

        screen.blit(self.image, self.rect)


class PlayerBuff(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.huifu_images = huifu_images
        self.huifu_fan_images = huifu_fan_images

        self.skill_index = 0

        if player.fan:
            self.image = self.huifu_fan_images[self.skill_index]
        else:
            self.image = self.huifu_images[self.skill_index]

        self.rect = self.image.get_rect()

        self.rect.bottom = player.rect.bottom

        self.rect.left = player.rect.left

        self.skill_count = 0

    def update(self):

        if player.fan:
            self.image = self.huifu_fan_images[self.skill_index]

        else:
            self.image = self.huifu_images[self.skill_index]

        if self.skill_count % 6 == 0:
            self.skill_index = self.skill_index + 1
            if self.skill_index > 16:
                self.kill()

        self.skill_count = self.skill_count + 1

    def draw(self):

        screen.blit(self.image, self.rect)


class Bone(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.idle_images = load_sprites('image/Monster/Bone/Idle/', 'Idle_', 4)
        self.idle_fan_images = load_sprites('image/Monster/Bone/Idle/', 'Idle_', 4)
        for i in range(4):
            self.idle_fan_images[i] = pygame.transform.flip(self.idle_fan_images[i], True, False)
        self.walk_images = load_sprites('image/Monster/Bone/Walk/', 'Walk_', 4)
        self.walk_fan_images = load_sprites('image/Monster/Bone/Walk/', 'Walk_', 4)
        for i in range(4):
            self.walk_fan_images[i] = pygame.transform.flip(self.walk_fan_images[i], True, False)
        self.attack_images = load_sprites('image/Monster/Bone/Attack/', 'Attack_', 8)
        self.attack_fan_images = load_sprites('image/Monster/Bone/Attack/', 'Attack_', 8)
        for i in range(8):
            self.attack_fan_images[i] = pygame.transform.flip(self.attack_fan_images[i], True, False)
        self.die_images = load_sprites('image/Monster/Bone/Die/', 'Die_', 3)
        self.die_fan_images = load_sprites('image/Monster/Bone/Die/', 'Die_', 3)
        for i in range(3):
            self.die_fan_images[i] = pygame.transform.flip(self.die_fan_images[i], True, False)
        self.hurt_images = load_sprites('image/Monster/Bone/Hurt/', 'Jump_', 1)
        self.hurt_fan_images = load_sprites('image/Monster/Bone/Hurt/', 'Jump_', 1)
        for i in range(1):
            self.hurt_fan_images[i] = pygame.transform.flip(self.hurt_fan_images[i], True, False)

        self.skill_blood_images = load_sprites('image/Monster/Bone/Skill/', 'Blood_', 3)
        self.skill_blood_fan_images = load_sprites('image/Monster/Bone/Skill/', 'Blood_', 3)
        for i in range(3):
            self.skill_blood_fan_images[i] = pygame.transform.flip(self.skill_blood_fan_images[i], True, False)
        self.skill_splash_images = load_sprites('image/Monster/Bone/Skill/', 'Splash_', 4)
        self.skill_splash_fan_images = load_sprites('image/Monster/Bone/Skill/', 'Splash_', 4)
        for i in range(4):
            self.skill_splash_fan_images[i] = pygame.transform.flip(self.skill_splash_fan_images[i], True, False)
        self.skill_range_images = load_sprites('image/Monster/Bone/Skill/', 'Range_', 8)
        self.skill_range_fan_images = load_sprites('image/Monster/Bone/Skill/', 'Range_', 8)
        for i in range(8):
            self.skill_range_fan_images[i] = pygame.transform.flip(self.skill_range_fan_images[i], True, False)

        self.image = self.idle_images[0]

        self.rect = self.idle_images[0].get_rect()

        self.rect.left = WIDTH
        self.rect.bottom = HEIGHT - 30

        self.radius = int(self.rect.width * 1 / 5)

        self.hp = 400

        self.idle_index = 0
        self.walk_index = 0
        self.attack_index = 0
        self.die_index = 0
        self.hurt_index = 0
        self.skill_index = 0

        self.daji = False  # 控制玩家掉血频率

        self.fan = False

        self.speed_heng = speed * 2 / 3
        self.speed_shu = speed / 2

        self.idle = True
        self.walk = False
        self.attack = False
        self.die = False
        self.hurt = False
        self.skill = False

        self.fang = False

        self.hurt_count = 0  # 调节受伤动作持续时间
        self.count = 0  # 调节动作快慢

    def update(self):

        # 首先判断是否死亡
        if self.hp <= 0:
            self.die = True
            self.idle = False
            self.walk = False
            self.attack = False
            self.hurt = False
            self.skill = False
            if self.die_index > 2:
                self.die_index = 2
                self.kill()

        # 被打击时停止一切活动
        if self.hurt:
            self.idle = False
            self.walk = False
            self.skill = False
            self.attack = False

            self.idle_index = 0
            self.walk_index = 0
            self.skill_index = 0
            self.attack_index = 0

        if self.fan:
            if self.idle:
                self.image = self.idle_fan_images[self.idle_index]
            if self.walk:
                self.image = self.walk_fan_images[self.walk_index]
            if self.attack:
                self.image = self.attack_fan_images[self.attack_index]
            if self.die:
                self.image = self.die_fan_images[self.die_index]
            if self.hurt:
                self.image = self.hurt_fan_images[self.hurt_index]
            if self.skill:
                self.image = self.skill_range_fan_images[self.skill_index]
        else:
            if self.idle:
                self.image = self.idle_images[self.idle_index]
            if self.walk:
                self.image = self.walk_images[self.walk_index]
            if self.attack:
                self.image = self.attack_images[self.attack_index]
            if self.die:
                self.image = self.die_images[self.die_index]
            if self.hurt:
                self.image = self.hurt_images[self.hurt_index]
            if self.skill:
                self.image = self.skill_range_images[self.skill_index]

        # 选择动作

        if 650 < abs(self.rect.center[0] - player.rect.center[0]) < 800 or \
                (abs(self.rect.center[1] - player.rect.center[1]) > 10 and
                 abs(self.rect.center[0] - player.rect.center[0]) < 800) or \
                (abs(self.rect.center[0] - player.rect.center[0]) > 800 and
                 self.rect.center[0] < player.rect.center[0]) or \
                (self.rect.left < 0 or self.rect.right > WIDTH):
            self.idle = False
            self.walk = True
            self.attack = False
            self.skill = False
            # 恢复初始动作
            self.attack_index = 0
            self.skill_index = 0

        if 2 * self.radius < abs(self.rect.center[0] - player.rect.center[0]) < 650 and \
                abs(self.rect.center[1] - player.rect.center[1]) < 10 and \
                not (self.rect.left < 0 or self.rect.right > WIDTH):
            self.idle = False
            self.walk = False
            self.attack = False
            self.skill = True
            # 恢复初始动作
            self.walk_index = 0
            self.attack_index = 0

        if abs(self.rect.center[0] - player.rect.center[0]) < 2 * self.radius and \
                abs(self.rect.center[1] - player.rect.center[1]) < 10 and \
                not (self.rect.left < 0 or self.rect.right > WIDTH):
            self.idle = False
            self.walk = False
            self.attack = True
            self.skill = False
            # 恢复初始动作
            self.walk_index = 0
            self.skill_index = 0

        if ((abs(self.rect.center[0] - player.rect.center[0]) >= 800 and
                self.rect.center[0] > player.rect.center[0]) and
                not (self.rect.left < 0 or self.rect.right > WIDTH)) or player.die:
            self.idle = True
            self.walk = False
            self.attack = False
            self.skill = False
            # 恢复初始动作
            self.walk_index = 0
            self.attack_index = 0
            self.skill_index = 0

        # 移动

        if self.walk and ((player.rect.center[0] < self.rect.center[0] and
                          abs(self.rect.center[0] - player.rect.center[0]) > 550) or self.rect.right > WIDTH):
            self.rect.x = self.rect.x - self.speed_heng

        if self.walk and ((player.rect.center[0] > self.rect.center[0] and
                          abs(self.rect.center[0] - player.rect.center[0]) > 550) or self.rect.left < 0):
            self.rect.x = self.rect.x + self.speed_heng

        if self.walk and player.rect.center[1] < self.rect.center[1]:
            self.rect.y = self.rect.y - self.speed_shu

        if self.walk and player.rect.center[1] > self.rect.center[1]:
            self.rect.y = self.rect.y + self.speed_shu

        # 判断朝向

        if player.rect.center[0] < self.rect.center[0]:
            self.fan = False

        else:
            self.fan = True

        # 随地图移动

        if background.dong:
            if not player.skill:
                if player.fighting:
                    self.rect.x = self.rect.x - background.speed
                else:
                    self.rect.x = self.rect.x - background.speed

        if self.rect.top < HEIGHT / 4 - 20:
            self.rect.top = HEIGHT / 4 - 20
        if self.rect.bottom > HEIGHT - 100:
            self.rect.bottom = HEIGHT - 100

        if self.idle and self.count % 6 == 0:
            self.idle_index = (self.idle_index + 1) % 4
        if self.walk and self.count % 6 == 0:
            self.walk_index = (self.walk_index + 1) % 4
        if self.attack and self.count % 6 == 0:
            if self.attack_index == 5:
                self.daji = True
            self.attack_index = (self.attack_index + 1) % 8
        if self.die and self.count % 10 == 0:
            self.die_index = self.die_index + 1
        if self.hurt and self.hurt_count % 15 == 0:
            self.hurt = False
        if self.skill and self.count % 6 == 0:
            if self.skill_index == 5:
                self.fang = True
            self.skill_index = (self.skill_index + 1) % 8

        # 攻击

        # 释放技能
        if self.skill and self.fang:
            self.fang = False
            xue = BoneSkill()
            all_sprites.add(xue)
            bone_skill.add(xue)

        # 判断是否攻击(是否和玩家碰撞)
        if self.attack:
            if abs(player.rect.center[0] - self.rect.center[0]) < 2 * self.radius and \
                    abs(player.rect.center[1] - self.rect.center[1]) < 30 and self.daji:
                self.daji = False
                player.hurt = True
                player.hp -= 20

        self.hurt_count = self.hurt_count + 1
        self.count = self.count + 1

    def draw(self):

        screen.blit(self.image, self.rect)


class BoneSkill(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.skill_blood_images = load_sprites('image/Monster/Bone/Skill/', 'Blood_', 3)
        self.skill_blood_fan_images = load_sprites('image/Monster/Bone/Skill/', 'Blood_', 3)
        for i in range(3):
            self.skill_blood_fan_images[i] = pygame.transform.flip(self.skill_blood_fan_images[i], True, False)
        self.skill_splash_images = load_sprites('image/Monster/Bone/Skill/', 'Splash_', 4)
        self.skill_splash_fan_images = load_sprites('image/Monster/Bone/Skill/', 'Splash_', 4)
        for i in range(4):
            self.skill_splash_fan_images[i] = pygame.transform.flip(self.skill_splash_fan_images[i], True, False)

        self.image = self.skill_blood_images[0]

        self.rect = self.skill_blood_images[0].get_rect()

        # 确定初始方向,不再更改
        if bone.fan:
            self.fan = True
        else:
            self.fan = False

        self.rect.bottom = bone.rect.center[1]

        if self.fan:
            self.rect.left = bone.rect.center[0]
        else:
            self.rect.right = bone.rect.center[0]

        self.blood_index = 0
        self.splash_index = 0

        self.speed_heng = 1.5 * speed

        self.blood = True
        self.splash = False

        self.count = 0  # 调节动作快慢

    def update(self, *args):

        if self.fan:
            if self.blood:
                self.image = self.skill_blood_fan_images[self.blood_index]
            if self.splash:
                self.image = self.skill_splash_images[self.splash_index]
        else:
            if self.blood:
                self.image = self.skill_blood_images[self.blood_index]
            if self.splash:
                self.image = self.skill_splash_fan_images[self.splash_index]

        # 判断和玩家碰撞

        if abs(player.rect.center[0] - self.rect.center[0]) < 30 and \
                abs(player.rect.center[1] - 30 - self.rect.center[1]) < 30 and not self.splash:

            self.splash = True
            self.blood = False

            self.rect.y = self.rect.y - 60

            if self.fan:
                self.rect.x = self.rect.x - 80

            player.hurt = True
            player.hp -= 40

        if self.blood:
            if self.fan:
                self.rect.x = self.rect.x + self.speed_heng
            else:
                self.rect.x = self.rect.x - self.speed_heng

        if self.rect.right < 0 and self.rect.right < bone.rect.left:
            self.kill()
        if self.rect.left > WIDTH and self.rect.right > bone.rect.right:
            self.kill()
        if self.splash_index == 3:
            self.kill()

        if self.blood and self.count % 6 == 0:
            self.blood_index = (self.blood_index + 1) % 3
        if self.splash and self.count % 6 == 0:
            self.splash_index = self.splash_index + 1

        self.count = self.count + 1

    def draw(self):

        screen.blit(self.image, self.rect)


class SmallBone(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.idle_images = load_sprites('image/Monster/Small_Bone/Idle/', 'Idle_', 4)
        self.idle_fan_images = load_sprites('image/Monster/Small_Bone/Idle/', 'Idle_', 4)
        for i in range(4):
            self.idle_fan_images[i] = pygame.transform.flip(self.idle_fan_images[i], True, False)
        self.walk_images = load_sprites('image/Monster/Small_Bone/Walk/', 'Walk_', 4)
        self.walk_fan_images = load_sprites('image/Monster/Small_Bone/Walk/', 'Walk_', 4)
        for i in range(4):
            self.walk_fan_images[i] = pygame.transform.flip(self.walk_fan_images[i], True, False)
        self.attack_images = load_sprites('image/Monster/Small_Bone/Attack/', 'Attack_', 5)
        self.attack_fan_images = load_sprites('image/Monster/Small_Bone/Attack/', 'Attack_', 5)
        for i in range(5):
            self.attack_fan_images[i] = pygame.transform.flip(self.attack_fan_images[i], True, False)
        self.die_images = load_sprites('image/Monster/Small_Bone/Die/', 'Die_', 4)
        self.die_fan_images = load_sprites('image/Monster/Small_Bone/Die/', 'Die_', 4)
        for i in range(4):
            self.die_fan_images[i] = pygame.transform.flip(self.die_fan_images[i], True, False)
        self.hurt_images = load_sprites('image/Monster/Small_Bone/Hurt/', 'Fly_', 1)
        self.hurt_fan_images = load_sprites('image/Monster/Small_Bone/Hurt/', 'Fly_', 1)
        for i in range(1):
            self.hurt_fan_images[i] = pygame.transform.flip(self.hurt_fan_images[i], True, False)

        self.image = self.idle_images[0]

        self.rect = self.idle_images[0].get_rect()

        self.weizhi = random.randint(0, 1)
        if self.weizhi == 0:
            self.rect.right = 0 - random.randint(0, 50)
        else:
            self.rect.left = WIDTH + random.randint(0, 50)
        self.rect.bottom = random.randint(HEIGHT - 200, HEIGHT - 80)

        self.radius = int(self.rect.width * 1 / 4)

        self.hp = 60

        self.idle_index = 0
        self.walk_index = 0
        self.attack_index = 0
        self.die_index = 0
        self.hurt_index = 0

        self.daji = False  # 控制玩家掉血频率

        self.fan = False

        self.speed_heng = speed * 0.8
        self.speed_shu = speed * 0.6

        self.idle = True
        self.walk = False
        self.attack = False
        self.die = False
        self.hurt = False

        self.fang = False

        self.hurt_count = 0  # 调节受伤动作持续时间
        self.count = 0  # 调节动作快慢

    def update(self):

        # 首先判断是否死亡
        if self.hp <= 0:
            self.die = True
            self.idle = False
            self.walk = False
            self.attack = False
            self.hurt = False
            if self.die_index > 3:
                self.die_index = 3
                self.kill()

        # 被打击时停止一切活动
        if self.hurt:
            self.idle = False
            self.walk = False
            self.attack = False

            self.idle_index = 0
            self.walk_index = 0
            self.attack_index = 0

        if self.fan:
            if self.idle:
                self.image = self.idle_fan_images[self.idle_index]
            if self.walk:
                self.image = self.walk_fan_images[self.walk_index]
            if self.attack:
                self.image = self.attack_fan_images[self.attack_index]
            if self.die:
                self.image = self.die_fan_images[self.die_index]
            if self.hurt:
                self.image = self.hurt_fan_images[self.hurt_index]
        else:
            if self.idle:
                self.image = self.idle_images[self.idle_index]
            if self.walk:
                self.image = self.walk_images[self.walk_index]
            if self.attack:
                self.image = self.attack_images[self.attack_index]
            if self.die:
                self.image = self.die_images[self.die_index]
            if self.hurt:
                self.image = self.hurt_images[self.hurt_index]

        # 选择动作

        if 2 * self.radius < abs(self.rect.center[0] - player.rect.center[0]) < 1000 or \
                abs(self.rect.center[1] - player.rect.center[1]) > 10 or \
                self.rect.right > WIDTH:
            self.idle = False
            self.walk = True
            self.attack = False
            # 恢复初始动作
            self.attack_index = 0

        if abs(self.rect.center[0] - player.rect.center[0]) <= 2 * self.radius and \
                abs(self.rect.center[1] - player.rect.center[1]) < 10:
            self.idle = False
            self.walk = False
            self.attack = True
            # 恢复初始动作
            self.walk_index = 0

        if ((abs(self.rect.center[0] - player.rect.center[0]) >= 1000 and
                self.rect.center[0] > player.rect.center[0]) and
                not self.rect.right > WIDTH) or player.die:
            self.idle = True
            self.walk = False
            self.attack = False
            # 恢复初始动作
            self.walk_index = 0
            self.attack_index = 0

        # 移动

        if self.walk and (player.rect.center[0] < self.rect.center[0] or self.rect.right > WIDTH) and not self.die:
            self.rect.x = self.rect.x - self.speed_heng

        if self.walk and player.rect.center[0] > self.rect.center[0] and not self.die:
            self.rect.x = self.rect.x + self.speed_heng

        if self.walk and player.rect.center[1] < self.rect.center[1] and \
                abs(self.rect.center[0] - player.rect.center[0]) <= 2 * self.radius and not self.die:
            self.rect.y = self.rect.y - self.speed_shu

        if self.walk and player.rect.center[1] > self.rect.center[1] and \
                abs(self.rect.center[0] - player.rect.center[0]) <= 2 * self.radius and not self.die:
            self.rect.y = self.rect.y + self.speed_shu

        # 判断朝向

        if player.rect.center[0] < self.rect.center[0]:
            self.fan = False

        else:
            self.fan = True

        # 随地图移动

        if background.dong:
            if not player.skill:
                if player.fighting:
                    self.rect.x = self.rect.x - background.speed
                else:
                    self.rect.x = self.rect.x - background.speed

        # 位置限制

        if self.rect.top < HEIGHT / 4 - 20:
            self.rect.top = HEIGHT / 4 - 20
        if self.rect.bottom > HEIGHT - 100:
            self.rect.bottom = HEIGHT - 100

        # 更新动作

        if self.idle and self.count % 6 == 0:
            self.idle_index = (self.idle_index + 1) % 4
        if self.walk and self.count % 6 == 0:
            self.walk_index = (self.walk_index + 1) % 4
        if self.attack and self.count % 6 == 0:
            if self.attack_index == 3:
                self.daji = True
            self.attack_index = (self.attack_index + 1) % 5
        if self.die and self.count % 10 == 0:
            self.die_index = self.die_index + 1
        if self.hurt and self.hurt_count % 15 == 0:
            self.hurt = False

        # 攻击

        # 判断是否攻击(是否和玩家碰撞)
        if self.attack:
            if abs(player.rect.center[0] - self.rect.center[0]) < 2 * self.radius and \
                    abs(player.rect.center[1] - self.rect.center[1]) < 30 and self.daji:
                self.daji = False
                player.hurt = True
                player.hp -= 5

        self.hurt_count = self.hurt_count + 1
        self.count = self.count + 1

    def draw(self):

        screen.blit(self.image, self.rect)


class Backgrounds:

    def __init__(self, name, no):

        self.name = name
        self.no = no

        self.images_0 = load_sprites('image/Background/' + self.name + '/', self.name + '_', self.no)
        self.images_1 = load_sprites('image/Background/' + self.name + '/', self.name + '_', self.no)

        for i in range(self.no):
            self.rect_0 = self.images_0[i].get_rect()
            self.rect_0.bottom = HEIGHT
            self.rect_1 = self.images_1[i].get_rect()
            self.rect_1.bottom = HEIGHT
            self.rect_0.left = 0
            self.rect_1.left = self.rect_0.right

        self.bianjie = False
        self.dong = False

        self.speed = speed

    def update(self):

        if player.fighting:
            self.speed = speed / 3
        else:
            self.speed = speed

        if player.skill:
            self.speed = 0

        if (WIDTH / 2 < player.rect.right and ditu.rect_1_1.right > WIDTH) or ditu.go:
            self.bianjie = True
        else:
            self.bianjie = False

        keystate = pygame.key.get_pressed()

        if self.bianjie and keystate[pygame.K_d] and not player.die:

            self.dong = True

            self.rect_0.left = self.rect_0.left - self.speed
            self.rect_1.left = self.rect_1.left - self.speed

            if self.rect_0.right < 0:
                self.rect_0.left = self.rect_1.right
            if self.rect_1.right < 0:
                self.rect_1.left = self.rect_0.right

        else:
            self.dong = False

    def draw(self):
        for i in range(self.no):
            screen.blit(self.images_0[i], self.rect_0)
            screen.blit(self.images_1[i], self.rect_1)


class Map:

    def __init__(self, name):

        self.name = name

        # 加载一套地图的起始地图
        path = 'image/Map/' + self.name + '/' + self.name + '_start' + '.png'
        self.image_start = pygame.image.load(path).convert_alpha()
        self.image_start.set_colorkey(WHITE)
        self.rect_start = self.image_start.get_rect()

        self.rect_start.left = 0
        self.rect_start.bottom = HEIGHT + 20  # 开始地图和后面的地图连接不顺,因此下降二十

        # 加载一套地图的两个可循环地图
        self.images_0 = load_sprites('image/Map/' + self.name + '/', self.name + '_Loop_', 2)
        self.images_1 = load_sprites('image/Map/' + self.name + '/', self.name + '_Loop_', 2)

        for i in range(2):
            self.rect_0 = self.images_0[i].get_rect()
            self.rect_0.bottom = HEIGHT
            self.rect_1 = self.images_1[i].get_rect()
            self.rect_1.bottom = HEIGHT

        self.rect_0_0 = self.images_0[0].get_rect()
        self.rect_0_1 = self.images_0[1].get_rect()
        self.rect_1_0 = self.images_1[0].get_rect()
        self.rect_1_1 = self.images_1[1].get_rect()

        self.rect_0_0.left = self.rect_start.right
        self.rect_0_1.left = self.rect_0_0.right
        self.rect_1_0.left = self.rect_0_1.right
        self.rect_1_1.left = self.rect_1_0.right

        self.dong = False
        self.go = False  # 用于扩张地图,使地图进入下一次循环

        self.speed = speed

    def update(self):

        if player.fighting:
            self.speed = speed / 3
        else:
            self.speed = speed

        if player.skill:
            self.speed = 0

        if background.dong:  # 背景移动,地图跟着移动

            self.rect_start.left = self.rect_start.left - self.speed

            self.rect_0_0.left = self.rect_0_0.left - self.speed
            self.rect_0_1.left = self.rect_0_1.left - self.speed
            self.rect_1_0.left = self.rect_1_0.left - self.speed
            self.rect_1_1.left = self.rect_1_1.left - self.speed

            if self.rect_0_0.right < 0:
                self.rect_0_0.left = self.rect_1_1.right
            if self.rect_0_1.right < 0:
                self.rect_0_1.left = self.rect_0_0.right
            if self.rect_1_0.right < 0:
                self.rect_1_0.left = self.rect_0_1.right
            if self.rect_1_1.right < 0:
                self.rect_1_1.left = self.rect_1_0.right

    def draw(self):

        screen.blit(self.image_start, self.rect_start)
        screen.blit(self.images_0[0], self.rect_0_0)
        screen.blit(self.images_0[1], self.rect_0_1)
        screen.blit(self.images_1[0], self.rect_1_0)
        screen.blit(self.images_1[1], self.rect_1_1)


class Interface:
    def __init__(self):

        # 加载图片

        self.path = 'image/Interface/'

        self.image_top = load_image(self.path, 'Top')
        self.image_hero_icon = load_image(self.path, 'Hero_Icon', 90, 90)
        self.image_back = load_image(self.path, 'Back', 400, 20)
        self.image_hp = load_image(self.path, 'HP', 400, 20)
        self.image_mp = load_image(self.path, 'MP', 400, 20)
        self.image_distance_point = load_image(self.path, 'Distance_Point')
        self.image_fight_black = load_image(self.path, 'Fight_Black')

        # 定位

        self.top_rect = self.image_top.get_rect()
        self.hero_icon_rect = self.image_hero_icon.get_rect()
        self.back_rect_0 = self.image_back.get_rect()
        self.back_rect_1 = self.image_back.get_rect()
        self.back_rect_2 = self.image_back.get_rect()
        self.hp_rect = self.image_hp.get_rect()
        self.mp_rect = self.image_mp.get_rect()
        self.distance_point_rect = self.image_distance_point.get_rect()
        self.fight_black_rect = self.image_fight_black.get_rect()

        self.top_rect.left = 0
        self.top_rect.top = 0

        # 上下左右各有 5 的偏移
        self.hero_icon_rect.left = self.top_rect.center[0] - self.hero_icon_rect.width / 2 - 5
        self.hero_icon_rect.top = -5

        self.back_rect_0.left = self.top_rect.width / 4 - self.back_rect_0.width / 2 - 20
        self.back_rect_0.top = 10

        self.back_rect_1.left = self.back_rect_0.left
        self.back_rect_1.top = self.back_rect_0.bottom + 10

        self.back_rect_2.left = self.top_rect.width * 3 / 4 - self.back_rect_0.width / 2 + 20
        self.back_rect_2.top = 10

        self.hp_rect.left = self.back_rect_0.left
        self.hp_rect.top = 10

        self.mp_rect.left = self.back_rect_1.left
        self.mp_rect.top = self.back_rect_0.bottom + 10

        self.distance_point_rect.left = self.back_rect_2.left
        self.distance_point_rect.top = self.back_rect_2.top

    def update(self):

        xueliang = player.hp / 100
        lanliang = player.mp / 100

        self.image_hp = load_image(self.path, 'HP', int(400 * xueliang), 20)
        self.image_mp = load_image(self.path, 'MP', int(400 * lanliang), 20)

        length = 400

        self.distance_point_rect.left = \
            (1 - (ditu.rect_1_1.right - player.rect.center[0]) / (geshu * ditu.rect_1_1.width)) * length + \
            self.back_rect_2.left

    def draw(self):
        if not player.born:
            screen.blit(self.image_top, self.top_rect)
            screen.blit(self.image_hero_icon, self.hero_icon_rect)
            screen.blit(self.image_back, self.back_rect_0)
            screen.blit(self.image_back, self.back_rect_1)
            screen.blit(self.image_back, self.back_rect_2)
            screen.blit(self.image_hp, self.hp_rect)
            screen.blit(self.image_mp, self.mp_rect)
            screen.blit(self.image_distance_point, self.distance_point_rect)


class SkillButton:
    def __init__(self):

        # 加载图片

        self.path = 'image/Player/Skill/Button/'

        self.image_large_0_zuo = load_image(self.path, 'Skill_Button_L_0')
        self.image_large_0_you = load_image(self.path, 'Skill_Button_L_0')
        self.image_large_1_zuo = load_image(self.path, 'Skill_Button_L_1')
        self.image_large_1_you = load_image(self.path, 'Skill_Button_L_1')
        self.image_mid_0_zuo_1 = load_image(self.path, 'Skill_Button_M_0')
        self.image_mid_0_you_1 = load_image(self.path, 'Skill_Button_M_0')
        self.image_mid_0_zuo_2 = load_image(self.path, 'Skill_Button_M_0')
        self.image_mid_0_you_2 = load_image(self.path, 'Skill_Button_M_0')
        self.image_mid_1_zuo_1 = load_image(self.path, 'Skill_Button_M_1')
        self.image_mid_1_you_1 = load_image(self.path, 'Skill_Button_M_1')
        self.image_mid_1_zuo_2 = load_image(self.path, 'Skill_Button_M_1')
        self.image_mid_1_you_2 = load_image(self.path, 'Skill_Button_M_1')

        self.image_attack = load_image(self.path, 'Attack')
        self.image_hp = load_image(self.path, 'Hp')
        self.image_brave = load_image(self.path, 'Brave')
        self.image_chop = load_image(self.path, 'Chop')
        self.image_slash = load_image(self.path, 'Slash')
        self.image_up = load_image(self.path, 'Up')

        self.image_cool = load_image(self.path, 'Cool')  # 待用

        # 定位

        self.large_0_zuo_rect = self.image_large_0_zuo.get_rect()
        self.large_0_you_rect = self.image_large_0_you.get_rect()
        self.large_1_zuo_rect = self.image_large_1_zuo.get_rect()
        self.large_1_you_rect = self.image_large_1_you.get_rect()
        self.mid_0_zuo_1_rect = self.image_mid_0_zuo_1.get_rect()
        self.mid_0_you_1_rect = self.image_mid_0_you_1.get_rect()
        self.mid_0_zuo_2_rect = self.image_mid_0_zuo_2.get_rect()
        self.mid_0_you_2_rect = self.image_mid_0_you_2.get_rect()
        self.mid_1_zuo_1_rect = self.image_mid_1_zuo_1.get_rect()
        self.mid_1_you_1_rect = self.image_mid_1_you_1.get_rect()
        self.mid_1_zuo_2_rect = self.image_mid_1_zuo_2.get_rect()
        self.mid_1_you_2_rect = self.image_mid_1_you_2.get_rect()

        self.large_1_zuo_rect.bottom = HEIGHT
        self.large_1_zuo_rect.left = 0
        self.large_0_zuo_rect.bottom = self.large_1_zuo_rect.bottom
        self.large_0_zuo_rect.left = self.large_1_zuo_rect.left

        self.large_1_you_rect.bottom = HEIGHT
        self.large_1_you_rect.right = WIDTH
        self.large_0_you_rect.bottom = self.large_1_you_rect.bottom
        self.large_0_you_rect.left = self.large_1_you_rect.left

        self.mid_1_zuo_1_rect.bottom = HEIGHT
        self.mid_1_zuo_1_rect.left = self.large_1_zuo_rect.right
        self.mid_0_zuo_1_rect.bottom = self.mid_1_zuo_1_rect.bottom
        self.mid_0_zuo_1_rect.left = self.mid_1_zuo_1_rect.left
        self.mid_1_you_1_rect.bottom = HEIGHT
        self.mid_1_you_1_rect.right = WIDTH - self.mid_1_zuo_1_rect.left
        self.mid_0_you_1_rect.bottom = self.mid_1_you_1_rect.bottom
        self.mid_0_you_1_rect.right = self.mid_1_you_1_rect.right

        self.mid_1_zuo_2_rect.bottom = HEIGHT
        self.mid_1_zuo_2_rect.left = self.mid_1_zuo_1_rect.right
        self.mid_0_zuo_2_rect.bottom = self.mid_1_zuo_2_rect.bottom
        self.mid_0_zuo_2_rect.left = self.mid_1_zuo_2_rect.left
        self.mid_1_you_2_rect.bottom = HEIGHT
        self.mid_1_you_2_rect.right = WIDTH - self.mid_1_zuo_2_rect.left
        self.mid_0_you_2_rect.bottom = self.mid_1_you_2_rect.bottom
        self.mid_0_you_2_rect.right = self.mid_1_you_2_rect.right

        self.image_zuo_1 = self.image_large_1_zuo
        self.image_zuo_2 = self.image_mid_1_zuo_1
        self.image_zuo_3 = self.image_mid_1_zuo_2

        self.image_you_1 = self.image_large_1_you
        self.image_you_2 = self.image_mid_1_you_1
        self.image_you_3 = self.image_mid_1_you_2

        self.count_zuo_1 = 0
        self.count_zuo_2 = 0
        self.count_zuo_3 = 0
        self.count_you_1 = 0
        self.count_you_2 = 0
        self.count_you_3 = 0

    def update(self):
        if player.combo:
            self.image_zuo_1 = self.image_large_0_zuo
            self.count_zuo_1 = 0
        elif self.image_zuo_1 == self.image_large_0_zuo and self.count_zuo_1 == 3:
            self.image_zuo_1 = self.image_large_1_zuo

        if player.skill_0:
            self.image_you_3 = self.image_mid_0_you_2
            self.count_you_3 = 0
        elif self.image_you_3 == self.image_mid_0_you_2 and self.count_you_3 == 3:
            self.image_you_3 = self.image_mid_1_you_2

        if player.skill_1:
            self.image_you_2 = self.image_mid_0_you_1
            self.count_you_2 = 0
        elif self.image_you_2 == self.image_mid_0_you_1 and self.count_you_2 == 3:
            self.image_you_2 = self.image_mid_1_you_1

        if player.skill_2:
            self.image_you_1 = self.image_large_0_you
            self.count_you_1 = 0
        elif self.image_you_1 == self.image_large_0_you and self.count_you_1 == 3:
            self.image_you_1 = self.image_large_1_you

        if player.huifu:
            self.image_zuo_2 = self.image_mid_0_zuo_1
            self.count_zuo_2 = 0
        elif self.image_zuo_2 == self.image_mid_0_zuo_1 and self.count_zuo_2 == 3:
            self.image_zuo_2 = self.image_mid_1_zuo_1

        if player.brave:
            self.image_zuo_3 = self.image_mid_0_zuo_2
            self.count_zuo_3 = 0
        elif self.image_zuo_3 == self.image_mid_0_zuo_2 and self.count_zuo_3 == 3:
            self.image_zuo_3 = self.image_mid_1_zuo_2

        self.count_zuo_1 += 1
        self.count_zuo_2 += 1
        self.count_zuo_3 += 1
        self.count_you_1 += 1
        self.count_you_2 += 1
        self.count_you_3 += 1

    def draw(self):
        if not player.born:
            screen.blit(self.image_zuo_1, self.large_1_zuo_rect)
            screen.blit(self.image_zuo_2, self.mid_1_zuo_1_rect)
            screen.blit(self.image_zuo_3, self.mid_1_zuo_2_rect)
            screen.blit(self.image_you_1, self.large_1_you_rect)
            screen.blit(self.image_you_2, self.mid_1_you_1_rect)
            screen.blit(self.image_you_3, self.mid_1_you_2_rect)

            screen.blit(self.image_attack, self.large_1_zuo_rect)
            screen.blit(self.image_hp, self.mid_1_zuo_1_rect)
            screen.blit(self.image_brave, self.mid_1_zuo_2_rect)
            screen.blit(self.image_chop, self.large_1_you_rect)
            screen.blit(self.image_up, self.mid_1_you_1_rect)
            screen.blit(self.image_slash, self.mid_1_you_2_rect)


if __name__ == "__main__":
    pygame.init()

    pygame.mixer.init()  # 声音初始化
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption('Take Heaven')
    clock = pygame.time.Clock()

    # 加载图片

    skill_0_L0_images = load_sprites('image/Player/Skill/Skill_0/', 'Slash_L0_', 6)
    skill_0_L0_fan_images = load_sprites('image/Player/Skill/Skill_0/', 'Slash_L0_', 6)
    for j in range(6):
        skill_0_L0_fan_images[j] = pygame.transform.flip(skill_0_L0_fan_images[j], True, False)
    skill_1_L0_images = load_sprites('image/Player/Skill/Skill_1/', 'Slash_L0_', 6)
    skill_1_L0_fan_images = load_sprites('image/Player/Skill/Skill_1/', 'Slash_L0_', 6)
    for j in range(6):
        skill_1_L0_fan_images[j] = pygame.transform.flip(skill_1_L0_fan_images[j], True, False)
    skill_2_L0_images = load_sprites('image/Player/Skill/Skill_2/', 'Chop_L0_', 6)
    skill_2_L0_fan_images = load_sprites('image/Player/Skill/Skill_2/', 'Chop_L0_', 6)
    for j in range(6):
        skill_2_L0_fan_images[j] = pygame.transform.flip(skill_2_L0_fan_images[j], True, False)

    skill_0_L1_images = load_sprites('image/Player/Skill/Skill_0/', 'Slash_L1_', 8)
    skill_0_L1_fan_images = load_sprites('image/Player/Skill/Skill_0/', 'Slash_L1_', 6)
    for j in range(6):
        skill_0_L1_fan_images[j] = pygame.transform.flip(skill_0_L1_fan_images[j], True, False)
    skill_1_L1_images = load_sprites('image/Player/Skill/Skill_1/', 'Slash_L1_', 6)
    skill_1_L1_fan_images = load_sprites('image/Player/Skill/Skill_1/', 'Slash_L1_', 6)
    for j in range(6):
        skill_1_L1_fan_images[j] = pygame.transform.flip(skill_1_L1_fan_images[j], True, False)
    skill_2_L1_images = load_sprites('image/Player/Skill/Skill_2/', 'Chop_L1_', 6)
    skill_2_L1_fan_images = load_sprites('image/Player/Skill/Skill_2/', 'Chop_L1_', 6)
    for j in range(6):
        skill_2_L1_fan_images[j] = pygame.transform.flip(skill_2_L1_fan_images[j], True, False)

    huifu_images = load_sprites('image/Player/Skill/Buff/', 'Texiao_', 17)
    huifu_fan_images = load_sprites('image/Player/Skill/Buff/', 'Texiao_', 17)
    for j in range(17):
        huifu_fan_images[j] = pygame.transform.flip(huifu_fan_images[j], True, False)

    beijing = load_image('image/Start/', 'Background')
    beijing_rect = beijing.get_rect()
    title = load_image('image/Start/', 'Title')
    title_rect = title.get_rect()

    pygame.mixer.music.load('music/background.mid')
    pygame.mixer.music.set_volume(0.5)

    win_sound = pygame.mixer.Sound('music/win.wav')
    defeat_sound = pygame.mixer.Sound('music/defeat.wav')

    bofang = True

    Boss = 0
    Monster = 0
    shengyu = 0

    all_sprites = pygame.sprite.Group()
    bone_skill = pygame.sprite.Group()
    enemy_sprites = pygame.sprite.Group()

    # 提前加载

    bone = Bone()

    smallbones = []
    for xiaogui in range(22):
        smallbone = SmallBone()
        smallbones.append(smallbone)

    player = Player()

    all_sprites.add(player)

    ditu = Map('Bone_Path')

    background = Backgrounds('Sunset', 3)

    interface = Interface()

    skillbutton = SkillButton()

    running = True
    gameover = False
    start = True

    while running:

        if start:
            begin()
            start = False

        if not running:
            break

        # 处理事件(输入)

        clock.tick(FPS)
        for event in pygame.event.get():   # 检查输入
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                pass

        # 更新

        if not player.born and bofang:
            pygame.mixer.music.play(loops=-1)
            bofang = False

        # 到达最终地图出现Boss

        if player.rect.right > (WIDTH / 2 + 10):
            if Boss == 0:
                all_sprites.add(bone)
                enemy_sprites.add(bone)
                Boss += 1

        lucheng = player.rect.left - ditu.rect_start.left + 100
        if lucheng % 1000 == 0 and Monster < 16:
            for jishu in range(4):
                all_sprites.add(smallbones[Monster])
                enemy_sprites.add(smallbones[Monster])
                Monster += 1

        if Boss == 1 and Monster < 22:
            all_sprites.add(smallbones[Monster])
            enemy_sprites.add(smallbones[Monster])
            Monster += 1

        if bone.die:
            for dijun in enemy_sprites:
                shengyu += 1
            if shengyu == 0:
                player.win = True
            shengyu = 0

        background.update()

        ditu.update()

        all_sprites.update()

        bone_skill.update()

        interface.update()

        skillbutton.update()

        # 绘制屏幕

        screen.fill(BLACK)  # 覆盖

        background.draw()

        ditu.draw()

        # 在路径上使所有精灵形成前后关系

        for sprite in all_sprites:
            if 0 < sprite.rect.center[1] <= 300:
                sprite.draw()

        for hang in range(18):
            for sprite in all_sprites:
                if 300 + 10 * hang < sprite.rect.center[1] <= 300 + 10 * (hang + 1):
                    sprite.draw()

        # 使血液飞溅效果永远在玩家之前
        for sprite in bone_skill:
            if sprite.splash:
                sprite.draw()

        interface.draw()

        skillbutton.draw()

        pygame.display.flip()  # 画完翻面

    pygame.quit()

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值