import sys
import pygame
from bullet import Bullet
from alien import Alien
from time import sleep

def check_keydown_events(event,ship):
	# 响应按键
	if event.key==pygame.K_RIGHT:
		# 向右移动飞船 
		ship.moving_right = True
	elif event.key==pygame.K_LEFT:
		#向左移动飞船
		ship.moving_left = True
	elif event.key==pygame.K_UP:
		#向上移动飞船
		ship.moving_up = True
	elif event.key==pygame.K_DOWN:
		#向下移动飞船
		ship.moving_down = True
	elif event.key == pygame.K_q:
		# 按q退出游戏
			sys.exit()
		
def check_keyup_events(event,ship):
	# 松开按键
	if event.key == pygame.K_RIGHT:
		ship.moving_right = False
	elif event.key == pygame.K_LEFT:
		ship.moving_left = False
	elif event.key==pygame.K_UP:
		ship.moving_up = False
	elif event.key==pygame.K_DOWN:
		ship.moving_down = False


def bullet_events(ai_settings,screen,ship,bullets):
	# 子弹事件
	new_bullet = Bullet(ai_settings,screen,ship)
	bullets.add(new_bullet)


def check_events(ai_settings,screen,ship,bullets):
	# 响应键鼠事件
	# bullet_events(ai_settings,screen,ship,bullets)
	
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			sys.exit()

		elif event.type == pygame.KEYDOWN:
			check_keydown_events(event,ship)
			bullet_events(ai_settings,screen,ship,bullets)
		elif event.type == pygame.KEYUP:
			check_keyup_events(event,ship)
			bullet_events(ai_settings,screen,ship,bullets)
				

def update_screen(ai_settings,screen,ship,aliens,bullets):
	# 更新屏幕，切换到新屏幕

	# 每次都重新绘制屏幕
	screen.fill(ai_settings.bg_color)
	# 重绘子弹
	for bullet in bullets.sprites():
		bullet.draw_bullet()
			
	ship.blitme()
	aliens.draw(screen)

	# 让最近绘制的屏幕可见
	pygame.display.flip()
	
def update_bullets(ai_settings,screen,ship,aliens,bullets):
	# 更新子弹位置，并删除已消失子弹
	# 删除已经消失的子弹释放内存
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
        # print(len(bullets))
		# 检测是否击中
    check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets)
    
def check_bullet_alien_collisions(ai_settings,screen,ship,aliens,bullets):
	# 检查是否击中，若击中，则让对应的子弹和外星人消失
    collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)
    # if pygame.sprite.spritecollideany(ship,aliens):
        # bullets.empty()
	
    if len(aliens) == 0:
		# 目前外星人消失完，重新创建外星人组
        bullets.empty()
        create_fleet(ai_settings,screen,ship,aliens)
	
def create_fleet(ai_settings,screen,ship,aliens):
	# 创建外星人群
	# 创建一个外星人，并计算一行可以容纳多少个外星人
	# 外星人间距为外星人宽度
	alien = Alien(ai_settings,screen)
	number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)
	number_rows = get_number_rows(ai_settings,ship.rect.height,
					alien.rect.height)
	# 创建第一行外星人
	for row_number in range(number_rows):
		for alien_number in range(number_aliens_x):
		# 创建一个外星人并且将其加入当前行		
			creat_alien(ai_settings,screen,aliens,alien_number,row_number)
	
def get_number_aliens_x(ai_settings,alien_width):
	# 计算每行可以容纳多少个外星人
	available_space_x = ai_settings.screen_width - 2 * alien_width
	number_aliens_x = int(available_space_x / (2 * alien_width))
	return number_aliens_x

def creat_alien(ai_settings,screen,aliens,alien_number,row_number):
	# 创建一个外星人并且放在当前行
	alien = Alien(ai_settings,screen)
	alien_width = alien.rect.width
	alien.x = alien_width + 2 * alien_width * alien_number
	alien.rect.x = alien.x
	alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
	aliens.add(alien)
	
def get_number_rows(ai_settings,ship_height,alien_height):
	# 计算屏幕可以容纳多少行外星人
	available_space_y = (ai_settings.screen_height - (3 * alien_height)- ship_height)
	number_rows = int(available_space_y / (2 * alien_height))
	return number_rows

def update_aliens(ai_settings,stats,screen,ship,aliens,bullets):
	# 更新外星人群中所有的外星人位置
	check_fleet_edges(ai_settings,aliens)
	aliens.update()
	# 检测碰撞
	if pygame.sprite.spritecollideany(ship,aliens):
		# print("Ship hit!!!")
	    ship_hit(ai_settings,stats,screen,ship,aliens,bullets)
	
def check_fleet_edges(ai_settings,aliens):
	# 有外星人到达边缘时采取措施
	for alien in aliens.sprites():
		if alien.check_edges():
			change_fleet_direction(ai_settings,aliens)
			break
			
			
def change_fleet_direction(ai_settings,aliens):
	
	# 将外星人下移，并改变他们的方向
	for alien in aliens.sprites():
		alien.rect.y += ai_settings.fleet_drop_speed
	ai_settings.fleet_direction *= -1
	

def ship_hit(ai_settings,stats,screen,ship,aliens,bullets):
	# 相应撞击
	# 将ship_left减1
    if stats.ships_left > 0:
        stats.ships_left -= 1
		# 清空子弹和外星人列表
        aliens.empty()
        bullets.empty()
	
	    # 创建一群新的外星人，并且将飞船置于初始位置
        create_fleet(ai_settings,screen,ship,aliens)
        ship.center_ship()
	
	    # 暂停
        sleep(0.5)
    else:
        stats.game_active = False

	
