'''
定义一个：小恐龙类
'''
import pygame  #导入 Pygame 模块，用于实现游戏开发


'''小恐龙'''
class Dinosaur(pygame.sprite.Sprite):
	#定义了一个名为 Dinosaur 的类，继承自 pygame.sprite.Sprite，表示小恐龙是一个 Sprite 对象
	def __init__(self, imagepaths, position=(40, 147), size=[(44, 47), (59, 47)], **kwargs):  #初始化方法，用于设置小恐龙的属性和状态
		pygame.sprite.Sprite.__init__(self)
		# 导入所有图片
		# 首先加载小恐龙的不同动作的图片，根据给定的大小参数对图片进行缩放，并存储在 self.images 列表中
		self.images = []
		image = pygame.image.load(imagepaths[0])
		for i in range(5):
			self.images.append(pygame.transform.scale(image.subsurface((i*88, 0), (88, 95)), size[0]))
		image = pygame.image.load(imagepaths[1])
		for i in range(2):
			self.images.append(pygame.transform.scale(image.subsurface((i*118, 0), (118, 95)), size[1]))
		self.image_idx = 0
		self.image = self.images[self.image_idx]
		self.rect = self.image.get_rect()
		self.rect.left, self.rect.bottom = position
		self.mask = pygame.mask.from_surface(self.image)
		# 定义一些必要的变量，设置小恐龙的初始属性
		self.init_position = position
		self.refresh_rate = 5
		self.refresh_counter = 0
		self.speed = 11.5
		self.gravity = 0.6
		self.is_jumping = False
		self.is_ducking = False
		self.is_dead = False
		self.movement = [0, 0]
	'''跳跃'''
	def jump(self, sounds):
		if self.is_dead or self.is_jumping:
			return
		sounds['jump'].play()
		self.is_jumping = True
		self.movement[1] = -1 * self.speed
	'''低头'''
	def duck(self):
		if self.is_jumping or self.is_dead:
			return
		self.is_ducking = True
	'''不低头'''
	def unduck(self):
		self.is_ducking = False
	'''死掉了'''
	def die(self, sounds):
		if self.is_dead:
			return
		sounds['die'].play()
		self.is_dead = True
	'''将恐龙画到屏幕'''
	def draw(self, screen):
		screen.blit(self.image, self.rect)
	'''载入当前状态的图片'''
	def loadImage(self):
		self.image = self.images[self.image_idx]
		rect = self.image.get_rect()
		rect.left, rect.top = self.rect.left, self.rect.top
		self.rect = rect
		self.mask = pygame.mask.from_surface(self.image)
	'''更新小恐龙'''
	def update(self):
		if self.is_dead:
			self.image_idx = 4
			self.loadImage()
			return
		if self.is_jumping:
			self.movement[1] += self.gravity
			self.image_idx = 0
			self.loadImage()
			self.rect = self.rect.move(self.movement)
			if self.rect.bottom >= self.init_position[1]:
				self.rect.bottom = self.init_position[1]
				self.is_jumping = False
		elif self.is_ducking:
			if self.refresh_counter % self.refresh_rate == 0:
				self.refresh_counter = 0
				self.image_idx = 5 if self.image_idx == 6 else 6
				self.loadImage()
		else:
			if self.refresh_counter % self.refresh_rate == 0:
				self.refresh_counter = 0
				if self.image_idx == 1:
					self.image_idx = 2
				elif self.image_idx == 2:
					self.image_idx = 3
				else:
					self.image_idx = 1
				self.loadImage()
		self.refresh_counter += 1