基于 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 Secondspeed = 6  # 要求是 3 的倍数,类中用到了 speed / 3
gongji = 10geshu = 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 imagedef begin():global runningbeijing_rect.left = 0beijing_rect.top = 0title_rect.left = 300title_rect.top = 150screen.blit(beijing, beijing_rect)screen.blit(title, title_rect)pygame.display.flip()wait = Truewhile wait:clock.tick(FPS)for shijian in pygame.event.get():if shijian.type == pygame.QUIT:running = Falsewait = Falseif shijian.type == pygame.KEYUP:wait = Falseclass 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 - 50self.rect.left = 50self.born_rect.bottom = self.rect.bottom - 50self.born_rect.left = self.rect.left + 60self.hp = 100self.mp = 100self.gongji = gongjiself.born_index = 0self.idle_index = 0self.running_index = 0self.die_index = 0self.hurt_index = 0self.fight_index = 0self.skill_index = 0self.buff_index = 0self.win_index = 0self.fan = Falseself.speed_heng = speedself.speed_shu = speed * 3 / 4self.born = Trueself.idle = Falseself.running = Falseself.die = Falseself.hurt = Falseself.fighting = Falseself.win = Falseself.combo = Falseself.skill = Falseself.skill_0 = Falseself.skill_1 = Falseself.skill_2 = Falseself.huifu = Falseself.brave = Falseself.daji = Falseself.bofang_win = Trueself.bofang_defeat = Trueself.count = 0  # 调节动作快慢self.hurt_count = 0  # 调节受伤动作持续时间self.fight_count = 0self.skill_count = 5self.brave_count = 0self.buff_count = 5def update(self):global gameover# 首先判断是否死亡if self.hp <= 1:self.die = Trueself.idle = Falseself.running = Falseself.hurt = Falseself.fighting = Falseself.huifu = Falseself.brave = Falseif self.die_index == 4:gameover = Trueself.hp = 1if self.die and self.bofang_defeat:defeat_sound.play()self.bofang_defeat = Falseif self.win and self.bofang_win:win_sound.play()self.bofang_win = False# 被打击时停止一切活动,但是技能不会被打断if self.hurt and not self.skill:self.idle = Falseself.running = Falseself.fighting = Falseself.running_index = 0self.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 = Trueif self.fight_index == 2:diren.hp -= 0.5 * self.gongjiif self.fight_index == 4:diren.hp -= self.gongjiif self.fight_index == 2:diren.hp -= 1.5 * self.gongjiself.daji = Falseif (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 = Truediren.hp -= 3 * self.gongjiself.daji = Falseif 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 = Truediren.hp -= 5 * self.gongjiself.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 = Trueself.idle = Falseelse:self.running = Falseself.idle = Trueself.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 = Trueif self.fighting and not self.die:if keystate[pygame.K_j] and not self.skill:self.combo = Trueself.idle = Falseself.running = Falseself.running_index = 0  # 恢复初始动作elif self.combo and (self.fight_index == 2 or self.fight_index == 4 or self.fight_index == 6):self.combo = Falseself.fight_index = 0self.fight_count = 0if not running:self.idle = Trueif self.skill_0 or self.skill_1 or self.skill_2 or self.huifu or self.brave:self.skill = Trueelse:self.skill = Falseif keystate[pygame.K_u] and not self.combo and not self.skill and self.mp >= 30:self.mp -= 30self.skill_0 = Trueself.idle = Falseself.running = Falseself.running_index = 0  # 恢复初始动作jineng = PlayerSkillZhan()all_sprites.add(jineng)elif self.skill_0 and self.skill_index == 6:self.skill_0 = Falseself.skill_index = 0self.skill_count = 5if not running:self.idle = Trueif keystate[pygame.K_i] and not self.combo and not self.skill and self.mp >= 30:self.mp -= 30self.skill_1 = Trueself.idle = Falseself.running = Falseself.running_index = 0  # 恢复初始动作jineng = PlayerSkillTiao()all_sprites.add(jineng)elif self.skill_1 and self.skill_index == 6:self.skill_1 = Falseself.skill_index = 0self.skill_count = 5if not running:self.idle = Trueif keystate[pygame.K_o] and not self.combo and not self.skill and self.mp >= 50:self.mp -= 50self.skill_2 = Trueself.idle = Falseself.running = Falseself.running_index = 0  # 恢复初始动作jineng = PlayerSkillChop()all_sprites.add(jineng)elif self.skill_2 and self.skill_index == 6:self.skill_2 = Falseself.skill_index = 0self.skill_count = 5if not running:self.idle = Trueif keystate[pygame.K_k] and not self.combo and not self.skill and not self.die and not self.win:self.huifu = Trueself.buff_count = 5self.idle = Falseself.running = Falseself.running_index = 0  # 恢复初始动作jineng = PlayerBuff()all_sprites.add(jineng)elif self.huifu and self.buff_index == 17:self.huifu = Falseself.buff_index = 0if not running:self.idle = Trueelif self.huifu:self.hp += 0.2if self.hp >= 100:self.hp = 100if keystate[pygame.K_l] and not self.combo and not self.skill and not self.die and not self.win:self.brave = Trueself.buff_count = 5self.idle = Falseself.running = Falseself.running_index = 0  # 恢复初始动作jineng = PlayerBuff()all_sprites.add(jineng)elif self.brave and self.buff_index == 17:self.brave = Falseself.buff_index = 0self.buff_count = 5if not running:self.idle = Trueif self.brave and self.buff_index == 15:self.gongji = 2 * gongjiself.brave_count = 0elif 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 = Trueelse:self.skill = Falseif 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 / 3else: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 = Trueself.rect.x = self.rect.x - self.speed_hengif keystate[pygame.K_d]:self.fan = Falseif not background.bianjie:self.rect.x = self.rect.x + self.speed_hengif keystate[pygame.K_w]:self.rect.y = self.rect.y - self.speed_shuif keystate[pygame.K_s]:self.rect.y = self.rect.y + self.speed_shu# 限制玩家位置if self.rect.left < 0:self.rect.left = 0if self.rect.right > WIDTH:self.rect.right = WIDTHif self.rect.top < HEIGHT / 4 - 20:self.rect.top = HEIGHT / 4 - 20if 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) % 4if self.die and self.count % 10 == 0 and self.die_index < 4:self.die_index = self.die_index + 1if self.hurt and self.hurt_count % 15 == 0:self.hurt = Falseif self.fighting and self.combo and self.fight_count % 6 == 0:self.daji = Trueself.fight_index = (self.fight_index + 1) % 9if self.fighting and (self.skill_0 or self.skill_1 or self.skill_2) and self.skill_count % 6 == 0:self.daji = Trueself.skill_index = self.skill_index + 1if self.huifu and self.buff_count % 6 == 0:self.buff_index = self.buff_index + 1if self.brave and self.buff_count % 6 == 0:self.buff_index = self.buff_index + 1if self.born and self.count % 6 == 0:self.born_index = self.born_index + 1if self.win and self.count % 6 == 0:self.win_index = (self.win_index + 1) % 5# 控制回蓝速度if self.count % 10 == 0:self.mp += 1if self.mp > 100:self.mp = 100# 更新各项计数器self.count = self.count + 1self.hurt_count = self.hurt_count + 1self.fight_count = self.fight_count + 1self.skill_count = self.skill_count + 1self.buff_count = self.buff_count + 1def 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_imagesself.skill_0_fan_images = skill_0_L0_fan_imagesself.skill_index = 0if 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 - 10if player.fan:self.rect.left = player.rect.left - 20else:self.rect.left = player.rect.left - 35self.skill_count = 0def update(self):self.rect.bottom = player.rect.bottom - 10if player.fan:self.rect.left = player.rect.left - 20else:self.rect.left = player.rect.left - 35if 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 + 1if self.skill_index > 5:self.kill()self.skill_count = self.skill_count + 1def 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_imagesself.skill_1_fan_images = skill_1_L0_fan_imagesself.skill_index = 0if 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.bottomif player.fan:self.rect.left = player.rect.left - 400else:self.rect.left = player.rect.left - 400self.skill_count = 0def update(self):self.rect.bottom = player.rect.bottomif player.fan:self.rect.left = player.rect.left - 400else:self.rect.left = player.rect.left - 400if 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 + 1if self.skill_index > 5:self.kill()self.skill_count = self.skill_count + 1def 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_imagesself.skill_2_fan_images = skill_2_L0_fan_imagesself.skill_index = 0if 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 - 15self.rect.left = player.rect.left - 5self.skill_count = 0def update(self):self.rect.bottom = player.rect.bottom - 15self.rect.left = player.rect.left - 5if 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 + 1if self.skill_index > 5:self.kill()self.skill_count = self.skill_count + 1def 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_imagesself.huifu_fan_images = huifu_fan_imagesself.skill_index = 0if 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.bottomself.rect.left = player.rect.leftself.skill_count = 0def 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 + 1if self.skill_index > 16:self.kill()self.skill_count = self.skill_count + 1def 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 = WIDTHself.rect.bottom = HEIGHT - 30self.radius = int(self.rect.width * 1 / 5)self.hp = 400self.idle_index = 0self.walk_index = 0self.attack_index = 0self.die_index = 0self.hurt_index = 0self.skill_index = 0self.daji = False  # 控制玩家掉血频率self.fan = Falseself.speed_heng = speed * 2 / 3self.speed_shu = speed / 2self.idle = Trueself.walk = Falseself.attack = Falseself.die = Falseself.hurt = Falseself.skill = Falseself.fang = Falseself.hurt_count = 0  # 调节受伤动作持续时间self.count = 0  # 调节动作快慢def update(self):# 首先判断是否死亡if self.hp <= 0:self.die = Trueself.idle = Falseself.walk = Falseself.attack = Falseself.hurt = Falseself.skill = Falseif self.die_index > 2:self.die_index = 2self.kill()# 被打击时停止一切活动if self.hurt:self.idle = Falseself.walk = Falseself.skill = Falseself.attack = Falseself.idle_index = 0self.walk_index = 0self.skill_index = 0self.attack_index = 0if 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 andabs(self.rect.center[0] - player.rect.center[0]) < 800) or \(abs(self.rect.center[0] - player.rect.center[0]) > 800 andself.rect.center[0] < player.rect.center[0]) or \(self.rect.left < 0 or self.rect.right > WIDTH):self.idle = Falseself.walk = Trueself.attack = Falseself.skill = False# 恢复初始动作self.attack_index = 0self.skill_index = 0if 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 = Falseself.walk = Falseself.attack = Falseself.skill = True# 恢复初始动作self.walk_index = 0self.attack_index = 0if 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 = Falseself.walk = Falseself.attack = Trueself.skill = False# 恢复初始动作self.walk_index = 0self.skill_index = 0if ((abs(self.rect.center[0] - player.rect.center[0]) >= 800 andself.rect.center[0] > player.rect.center[0]) andnot (self.rect.left < 0 or self.rect.right > WIDTH)) or player.die:self.idle = Trueself.walk = Falseself.attack = Falseself.skill = False# 恢复初始动作self.walk_index = 0self.attack_index = 0self.skill_index = 0# 移动if self.walk and ((player.rect.center[0] < self.rect.center[0] andabs(self.rect.center[0] - player.rect.center[0]) > 550) or self.rect.right > WIDTH):self.rect.x = self.rect.x - self.speed_hengif self.walk and ((player.rect.center[0] > self.rect.center[0] andabs(self.rect.center[0] - player.rect.center[0]) > 550) or self.rect.left < 0):self.rect.x = self.rect.x + self.speed_hengif self.walk and player.rect.center[1] < self.rect.center[1]:self.rect.y = self.rect.y - self.speed_shuif 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 = Falseelse:self.fan = True# 随地图移动if background.dong:if not player.skill:if player.fighting:self.rect.x = self.rect.x - background.speedelse:self.rect.x = self.rect.x - background.speedif self.rect.top < HEIGHT / 4 - 20:self.rect.top = HEIGHT / 4 - 20if self.rect.bottom > HEIGHT - 100:self.rect.bottom = HEIGHT - 100if self.idle and self.count % 6 == 0:self.idle_index = (self.idle_index + 1) % 4if self.walk and self.count % 6 == 0:self.walk_index = (self.walk_index + 1) % 4if self.attack and self.count % 6 == 0:if self.attack_index == 5:self.daji = Trueself.attack_index = (self.attack_index + 1) % 8if self.die and self.count % 10 == 0:self.die_index = self.die_index + 1if self.hurt and self.hurt_count % 15 == 0:self.hurt = Falseif self.skill and self.count % 6 == 0:if self.skill_index == 5:self.fang = Trueself.skill_index = (self.skill_index + 1) % 8# 攻击# 释放技能if self.skill and self.fang:self.fang = Falsexue = 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 = Falseplayer.hurt = Trueplayer.hp -= 20self.hurt_count = self.hurt_count + 1self.count = self.count + 1def 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 = Trueelse:self.fan = Falseself.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 = 0self.splash_index = 0self.speed_heng = 1.5 * speedself.blood = Trueself.splash = Falseself.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 = Trueself.blood = Falseself.rect.y = self.rect.y - 60if self.fan:self.rect.x = self.rect.x - 80player.hurt = Trueplayer.hp -= 40if self.blood:if self.fan:self.rect.x = self.rect.x + self.speed_hengelse:self.rect.x = self.rect.x - self.speed_hengif 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) % 3if self.splash and self.count % 6 == 0:self.splash_index = self.splash_index + 1self.count = self.count + 1def 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 = 60self.idle_index = 0self.walk_index = 0self.attack_index = 0self.die_index = 0self.hurt_index = 0self.daji = False  # 控制玩家掉血频率self.fan = Falseself.speed_heng = speed * 0.8self.speed_shu = speed * 0.6self.idle = Trueself.walk = Falseself.attack = Falseself.die = Falseself.hurt = Falseself.fang = Falseself.hurt_count = 0  # 调节受伤动作持续时间self.count = 0  # 调节动作快慢def update(self):# 首先判断是否死亡if self.hp <= 0:self.die = Trueself.idle = Falseself.walk = Falseself.attack = Falseself.hurt = Falseif self.die_index > 3:self.die_index = 3self.kill()# 被打击时停止一切活动if self.hurt:self.idle = Falseself.walk = Falseself.attack = Falseself.idle_index = 0self.walk_index = 0self.attack_index = 0if 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 = Falseself.walk = Trueself.attack = False# 恢复初始动作self.attack_index = 0if 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 = Falseself.walk = Falseself.attack = True# 恢复初始动作self.walk_index = 0if ((abs(self.rect.center[0] - player.rect.center[0]) >= 1000 andself.rect.center[0] > player.rect.center[0]) andnot self.rect.right > WIDTH) or player.die:self.idle = Trueself.walk = Falseself.attack = False# 恢复初始动作self.walk_index = 0self.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_hengif self.walk and player.rect.center[0] > self.rect.center[0] and not self.die:self.rect.x = self.rect.x + self.speed_hengif 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_shuif 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 = Falseelse:self.fan = True# 随地图移动if background.dong:if not player.skill:if player.fighting:self.rect.x = self.rect.x - background.speedelse:self.rect.x = self.rect.x - background.speed# 位置限制if self.rect.top < HEIGHT / 4 - 20:self.rect.top = HEIGHT / 4 - 20if 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) % 4if self.walk and self.count % 6 == 0:self.walk_index = (self.walk_index + 1) % 4if self.attack and self.count % 6 == 0:if self.attack_index == 3:self.daji = Trueself.attack_index = (self.attack_index + 1) % 5if self.die and self.count % 10 == 0:self.die_index = self.die_index + 1if 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 = Falseplayer.hurt = Trueplayer.hp -= 5self.hurt_count = self.hurt_count + 1self.count = self.count + 1def draw(self):screen.blit(self.image, self.rect)class Backgrounds:def __init__(self, name, no):self.name = nameself.no = noself.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 = HEIGHTself.rect_1 = self.images_1[i].get_rect()self.rect_1.bottom = HEIGHTself.rect_0.left = 0self.rect_1.left = self.rect_0.rightself.bianjie = Falseself.dong = Falseself.speed = speeddef update(self):if player.fighting:self.speed = speed / 3else:self.speed = speedif player.skill:self.speed = 0if (WIDTH / 2 < player.rect.right and ditu.rect_1_1.right > WIDTH) or ditu.go:self.bianjie = Trueelse:self.bianjie = Falsekeystate = pygame.key.get_pressed()if self.bianjie and keystate[pygame.K_d] and not player.die:self.dong = Trueself.rect_0.left = self.rect_0.left - self.speedself.rect_1.left = self.rect_1.left - self.speedif self.rect_0.right < 0:self.rect_0.left = self.rect_1.rightif self.rect_1.right < 0:self.rect_1.left = self.rect_0.rightelse:self.dong = Falsedef 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 = 0self.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 = HEIGHTself.rect_1 = self.images_1[i].get_rect()self.rect_1.bottom = HEIGHTself.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.rightself.rect_0_1.left = self.rect_0_0.rightself.rect_1_0.left = self.rect_0_1.rightself.rect_1_1.left = self.rect_1_0.rightself.dong = Falseself.go = False  # 用于扩张地图,使地图进入下一次循环self.speed = speeddef update(self):if player.fighting:self.speed = speed / 3else:self.speed = speedif player.skill:self.speed = 0if background.dong:  # 背景移动,地图跟着移动self.rect_start.left = self.rect_start.left - self.speedself.rect_0_0.left = self.rect_0_0.left - self.speedself.rect_0_1.left = self.rect_0_1.left - self.speedself.rect_1_0.left = self.rect_1_0.left - self.speedself.rect_1_1.left = self.rect_1_1.left - self.speedif self.rect_0_0.right < 0:self.rect_0_0.left = self.rect_1_1.rightif self.rect_0_1.right < 0:self.rect_0_1.left = self.rect_0_0.rightif self.rect_1_0.right < 0:self.rect_1_0.left = self.rect_0_1.rightif self.rect_1_1.right < 0:self.rect_1_1.left = self.rect_1_0.rightdef 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 = 0self.top_rect.top = 0# 上下左右各有 5 的偏移self.hero_icon_rect.left = self.top_rect.center[0] - self.hero_icon_rect.width / 2 - 5self.hero_icon_rect.top = -5self.back_rect_0.left = self.top_rect.width / 4 - self.back_rect_0.width / 2 - 20self.back_rect_0.top = 10self.back_rect_1.left = self.back_rect_0.leftself.back_rect_1.top = self.back_rect_0.bottom + 10self.back_rect_2.left = self.top_rect.width * 3 / 4 - self.back_rect_0.width / 2 + 20self.back_rect_2.top = 10self.hp_rect.left = self.back_rect_0.leftself.hp_rect.top = 10self.mp_rect.left = self.back_rect_1.leftself.mp_rect.top = self.back_rect_0.bottom + 10self.distance_point_rect.left = self.back_rect_2.leftself.distance_point_rect.top = self.back_rect_2.topdef update(self):xueliang = player.hp / 100lanliang = player.mp / 100self.image_hp = load_image(self.path, 'HP', int(400 * xueliang), 20)self.image_mp = load_image(self.path, 'MP', int(400 * lanliang), 20)length = 400self.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.leftdef 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 = HEIGHTself.large_1_zuo_rect.left = 0self.large_0_zuo_rect.bottom = self.large_1_zuo_rect.bottomself.large_0_zuo_rect.left = self.large_1_zuo_rect.leftself.large_1_you_rect.bottom = HEIGHTself.large_1_you_rect.right = WIDTHself.large_0_you_rect.bottom = self.large_1_you_rect.bottomself.large_0_you_rect.left = self.large_1_you_rect.leftself.mid_1_zuo_1_rect.bottom = HEIGHTself.mid_1_zuo_1_rect.left = self.large_1_zuo_rect.rightself.mid_0_zuo_1_rect.bottom = self.mid_1_zuo_1_rect.bottomself.mid_0_zuo_1_rect.left = self.mid_1_zuo_1_rect.leftself.mid_1_you_1_rect.bottom = HEIGHTself.mid_1_you_1_rect.right = WIDTH - self.mid_1_zuo_1_rect.leftself.mid_0_you_1_rect.bottom = self.mid_1_you_1_rect.bottomself.mid_0_you_1_rect.right = self.mid_1_you_1_rect.rightself.mid_1_zuo_2_rect.bottom = HEIGHTself.mid_1_zuo_2_rect.left = self.mid_1_zuo_1_rect.rightself.mid_0_zuo_2_rect.bottom = self.mid_1_zuo_2_rect.bottomself.mid_0_zuo_2_rect.left = self.mid_1_zuo_2_rect.leftself.mid_1_you_2_rect.bottom = HEIGHTself.mid_1_you_2_rect.right = WIDTH - self.mid_1_zuo_2_rect.leftself.mid_0_you_2_rect.bottom = self.mid_1_you_2_rect.bottomself.mid_0_you_2_rect.right = self.mid_1_you_2_rect.rightself.image_zuo_1 = self.image_large_1_zuoself.image_zuo_2 = self.image_mid_1_zuo_1self.image_zuo_3 = self.image_mid_1_zuo_2self.image_you_1 = self.image_large_1_youself.image_you_2 = self.image_mid_1_you_1self.image_you_3 = self.image_mid_1_you_2self.count_zuo_1 = 0self.count_zuo_2 = 0self.count_zuo_3 = 0self.count_you_1 = 0self.count_you_2 = 0self.count_you_3 = 0def update(self):if player.combo:self.image_zuo_1 = self.image_large_0_zuoself.count_zuo_1 = 0elif self.image_zuo_1 == self.image_large_0_zuo and self.count_zuo_1 == 3:self.image_zuo_1 = self.image_large_1_zuoif player.skill_0:self.image_you_3 = self.image_mid_0_you_2self.count_you_3 = 0elif 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_2if player.skill_1:self.image_you_2 = self.image_mid_0_you_1self.count_you_2 = 0elif 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_1if player.skill_2:self.image_you_1 = self.image_large_0_youself.count_you_1 = 0elif self.image_you_1 == self.image_large_0_you and self.count_you_1 == 3:self.image_you_1 = self.image_large_1_youif player.huifu:self.image_zuo_2 = self.image_mid_0_zuo_1self.count_zuo_2 = 0elif 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_1if player.brave:self.image_zuo_3 = self.image_mid_0_zuo_2self.count_zuo_3 = 0elif 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_2self.count_zuo_1 += 1self.count_zuo_2 += 1self.count_zuo_3 += 1self.count_you_1 += 1self.count_you_2 += 1self.count_you_3 += 1def 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 = TrueBoss = 0Monster = 0shengyu = 0all_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 = Truegameover = Falsestart = Truewhile running:if start:begin()start = Falseif not running:break# 处理事件(输入)clock.tick(FPS)for event in pygame.event.get():   # 检查输入if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:pass# 更新if not player.born and bofang:pygame.mixer.music.play(loops=-1)bofang = False# 到达最终地图出现Bossif player.rect.right > (WIDTH / 2 + 10):if Boss == 0:all_sprites.add(bone)enemy_sprites.add(bone)Boss += 1lucheng = player.rect.left - ditu.rect_start.left + 100if lucheng % 1000 == 0 and Monster < 16:for jishu in range(4):all_sprites.add(smallbones[Monster])enemy_sprites.add(smallbones[Monster])Monster += 1if Boss == 1 and Monster < 22:all_sprites.add(smallbones[Monster])enemy_sprites.add(smallbones[Monster])Monster += 1if bone.die:for dijun in enemy_sprites:shengyu += 1if shengyu == 0:player.win = Trueshengyu = 0background.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()

基于 Python 的横版 2D 动作类小游戏相关推荐

  1. 基于Python pygame简易版斗兽棋小游戏源代码

    基于Python pygame简易版斗兽棋小游戏源代码 游戏规则如下: 胜利条件: 1.吃掉对方全部棋子 2.走入对方兽穴(不可进入自己洞穴) 吃法: 1.象>狮>虎>豹>狼& ...

  2. 用Direct3D设计二维横版过关动作类游戏的角色运动(双倍速、二段跳)

    用Direct3D设计二维横版过关动作类游戏的角色运动 演示程序下载地址:http://download.csdn.net/detail/jiangcaiyang123/4278008 虽然大家使用D ...

  3. 超爽动作类小游戏——4399DNF2.3

    4399DNF2.3版游戏介绍: DNF系列动作游戏最新推出的2.3版本,保持了上一版本的职业和技能设定,在硬值.起身.关卡方面做了细微调整.打斗效果依然出色!还没玩过的朋友快来挑战吧! 游戏地址:h ...

  4. 《勇士传说》横版卷轴动作类游戏笔记-3.场景绘制和叠层设置

    0.写在前面 该笔记为M_Studio老师今年免费更新的面向初学者的教程的笔记,只会更新老师免费更新的部分,中文课堂独有的部分不会更新.教程中所有的演示均为付费版下的演示,观看免费版的小伙伴可能会出现 ...

  5. 《勇士传说》横版卷轴动作类游戏笔记目录

    0.写在前面 该笔记为M_Studio老师今年免费更新的面向初学者的教程的笔记,只会更新老师免费更新的部分,中文课堂独有的部分不会更新.教程中所有的演示均为付费版下的演示,观看免费版的小伙伴可能会出现 ...

  6. 《勇士传说》横版卷轴动作类游戏笔记-2.素材导入和整理

    0.写在前面 该笔记为M_Studio老师今年免费更新的面向初学者的教程的笔记,只会更新老师免费更新的部分,中文课堂独有的部分不会更新.教程中所有的演示均为付费版下的演示,观看免费版的小伙伴可能会出现 ...

  7. [源码和文档分享]基于C#实现的RPG角色扮演类小游戏

    1 需求分析 1.1 游戏概述 DragonQuest是一个角色扮演类游戏(RPG),该游戏实现的具体功能是设计两种类型的人物,分别为被玩家所控制的玩家人物(Hero)和由系统所控制的外部人物(Ene ...

  8. 基于Python的《玛丽冒险》小游戏

    开发环境要求 本系统的软件开发及运行环境具体如下. 操作系统:Windows 7.Windows 8.Windows 10. Python版本:Python 3.7.0. 开发工具:PyCharm. ...

  9. python实训报告pygame_[源码和文档分享]基于Python的PyGame库实现的2048小游戏

    一.简介 2048的游戏规则很简单,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢.相撞时会相 ...

最新文章

  1. 50 jQuery拷贝对象与多库共存
  2. 动态时间规整_动态时间规整下时间序列子序列的搜索与挖掘
  3. java中堆与栈的区别 彻底理解
  4. 数据为王:大数据如何影响消费金融
  5. 封装的适配器 adapter
  6. 深入浅出CSS(二):关于雪碧图、background-position与steps函数的三角恋情
  7. 交换机的三种转发模式
  8. Hadoop Map/Reduce的工作流
  9. 【HDU - 1220】Cube (组合数学,简单)
  10. 10. VMware Tools 安裝
  11. linux下查看系统硬件,Linux 查看系统硬件信息 Linux 查看系统硬件信息(实例详解)...
  12. 泛微oa系统什么框架_泛微OA系统表结构说明文档
  13. [RK3399][Android7.1] 移植笔记 --- 音频Codec RT5640添加
  14. opencv人脸检测报错,(-215:Assertion failed)cv::CascadeClassifier::detectMultiScale‘
  15. 【读万卷书】《挪威的森林》
  16. 一个在线免费短网址生成API
  17. 【OpenCV】人脸旋转角度计算
  18. [敏捷开发实践] 使用RACI Matrix划分敏捷团队的RR
  19. Linux GRO流程分析
  20. 机器学习——EM和GMM(基于李航老师的推导)

热门文章

  1. UHF Gen 2 RFID和HF RFID的区别
  2. 解决espressif-ide启动失败报错Incompatible JVM问题
  3. 微信的用户已退出是什么意思_乐此不疲的微信运动点赞是什么意思?网友:原来是这样...
  4. 小区业主的春天捷径智慧物业管理
  5. Armbian 笔记二_初识机顶盒硬件设备和接口知识
  6. HDMI学习-2:HDMI传输原理
  7. 声明:关于原创与转载的标注
  8. 免杀PHP一句话木马(把阿里云给过了)
  9. Deep Learning的案例-YoloV5中的数据增强
  10. 使用FontLab生成字体文件