diff --git a/dinosaur.py b/dinosaur.py new file mode 100644 index 0000000..832a10e --- /dev/null +++ b/dinosaur.py @@ -0,0 +1,94 @@ +from settings import * +from bullet import Bullet + +class Dinosaur: + X_ori = 80 # 恐龙的初始x坐标 + Y_ori = 310 # 恐龙的初始y坐标 + Y_ori_DUCK = 340 # 恐龙的初始低头y坐标 + ori_vy = 7 # 恐龙的初始跳跃速度 + + def __init__(self, game_speed): + # 读入setting中恐龙三种状态所属的列表图片 + self.duck_img = DUCKING + self.run_img = RUNNING + self.jump_img = JUMPING + self.game_speed = game_speed + self.gravity = 9.8 + self.hp = 2 + + + # 恐龙的三种状态:低头,奔跑,跳跃 + self.status = 1 # 状态机:0表示低头, 1表示奔跑, 2表示跳跃状态, 3表示往左移动, 4表示往右移动 + + self.index = 0 + self.vy = self.ori_vy # 设定初始速度为ori_vy + self.image = self.run_img[0] # 初始的跑步动作下标为0 + self.dino_rect = self.image.get_rect() # get_rect是获取图像的位置信息以及宽度高度 + self.dino_rect.x = self.X_ori + self.dino_rect.y = self.Y_ori + + def update(self, userInput): # userInput <== 键盘输入 + # 三种状态不断切换 + if self.status == 0: + self.duck() + if self.status == 1: + self.run() + if self.status == 2: + self.jump() + if self.index >= 10: + self.index = 0 + + # 读入按键,要额外判定恐龙是否处于跳跃状态,不然就会连跳 + if userInput[pygame.K_UP] and not self.status == 2: + self.status = 2 + elif userInput[pygame.K_DOWN] and not self.status == 2: + self.status = 0 + elif not (userInput[pygame.K_DOWN] or self.status == 2): + self.status = 1 + + def duck(self): + self.image = self.duck_img[self.index // 5] + self.dino_rect = self.image.get_rect() + self.dino_rect.x = self.X_ori + self.dino_rect.y = self.Y_ori_DUCK + self.index += 1 + + def run(self): + self.image = self.run_img[self.index // 5] + self.dino_rect = self.image.get_rect() + self.dino_rect.x = self.X_ori + self.dino_rect.y = self.Y_ori + self.index += 1 + + def jump(self): + self.image = self.jump_img + if self.status == 2: + # 抛物线公式 + self.dino_rect.y -= self.vy * 4 # 在空中下降,注意y轴是向下的,所以需要是-= + self.vy -= 0.5 # 加速度为-0.5 + if self.vy < - self.ori_vy: # 恢复初始跳跃速度 + self.status = 1 + self.vy = self.ori_vy + + # 定义draw函数以刷新画面 + def draw(self, SCREEN): + SCREEN.blit(self.image, (self.dino_rect.x, self.dino_rect.y)) + + # 死亡动画 + def draw_death(self,SCREEN): + SCREEN.blit(DEAD, (self.dino_rect.x, self.dino_rect.y)) + + def showHp(self): + font = pygame.font.SysFont(['方正粗黑宋简体', 'microsoftsansserif'], 30) + text = font.render("Hp: " + str(self.hp), True, (0, 0, 0)) + SCREEN.blit(text, (self.dino_rect.x, self.dino_rect.y - 20)) + + def showHit(self): + font = pygame.font.SysFont(['方正粗黑宋简体', 'microsoftsansserif'], 30) + text = font.render("OAO", True, (0, 0, 0)) + SCREEN.blit(text, (self.dino_rect.x, self.dino_rect.y - 50)) + + def showDead(self): + font = pygame.font.SysFont(['方正粗黑宋简体', 'microsoftsansserif'], 30) + text = font.render("TAT", True, (0, 0, 0)) + SCREEN.blit(text, (self.dino_rect.x, self.dino_rect.y - 50)) \ No newline at end of file