|
|
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)) |