OK,今天成功做出了多个外星人,代码来了
import sys
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event, ship, ai_settings, screen, bullets):
if event.key == pygame.K_RIGHT:
ship.moving_right = True
print(event.key)
elif event.key == pygame.K_LEFT:
ship.moving_left = True
print(event.key)
elif event.key == pygame.K_UP:
ship.moving_up = True
print(event.key)
elif event.key == pygame.K_DOWN:
ship.moving_down = True
print(event.key)
elif event.key == pygame.K_SPACE:
fire_bullet(ai_settings, screen, ship, bullets)
elif event.key == pygame.K_ESCAPE:
sys.exit()
# 上面的函数可以调用下面的函数!!!!
def fire_bullet(ai_settings, screen, ship, bullets):
if len(bullets) < ai_settings.bullet_allow:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
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 check_events(ship, ai_settings, screen, bullets):
# 控制飞船移动
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ship, ai_settings, screen, bullets)
# Event就是for循环里的event
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
def update_bullets(aliens,bullets):
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
print(len(bullets))
#检测是否有子弹击中外星人
#如果集中,就删除对应的子弹和外星人
#这行代码遍历编组子弹和编组外星人判断是否子弹和外星人的rect是否重叠,重叠的话返回字典的键值对
collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)
def update_screen(ai_settings, screen, ship, bullets, aliens):
# 更新屏幕,将颜色和飞船印上去,以及子弹
screen.fill(ai_settings.bg_color)
for bullet in bullets.sprites():
bullet.draw_buller()
ship.blitme()
ship.update()
aliens.draw(screen)
pygame.display.flip()
def update_aliens(aliens):
aliens_moving = aliens.update()
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 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 create_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 creat_fleet(ai_settings, screen, 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,alien.rect.height,alien.rect.height)
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
# 这一步是创建外星人的X轴和Y轴,调用create_alien模块,同时用两个for循环
# 这一步的意义在于,建立每个外星人都是独立的个体
create_alien(ai_settings, ai_settings.screen, aliens, alien_number,row_number)
#让外星人碰到边界然后进行回弹
def check_fleet_edges(ai_settings,aliens):
for alien in aliens.sprites():
if alien.check_edges():
change_fleet_dirction(ai_settings,aliens)
break
def change_fleet_dirction(ai_settings,aliens):
for alien in aliens.sprites():
alien.rect.y += ai_settings.fleet_drop
ai_settings.fleet_direction *= -1
def update_aliens(ai_settings,aliens):
check_fleet_edges(ai_settings,aliens)
aliens.update()
并且也成功发射导弹进行对外星人的射击!但是,说实话今天做的像是抄作业,今天打算不通过写好的代码自己进行尝试自己进行重做一次。今天我尝试做一个矩形,然后让其进行左右上下移动,碰到边界之后返回。今天代码弄了一下午也不知道为什么不能让其进行矩形移动,代码如下:
import pygame
class moving():
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((500, 300))
self.bg_color = self.screen.fill((65, 222, 65))
self.font = pygame.font.Font(None, 36)
self.text = self.font.render('Hello There', 1, (10, 10, 10))
self.rect_width = 50
self.rect_height = 50
self.rect_moving = 10
self.rect1 = pygame.Surface((60, 60), pygame.SRCALPHA)
def text1(self, screen, text):
textpos = text.get_rect()
textpos.centerx = screen.get_rect().centerx
textpos.bottom = screen.get_rect().bottom / 2
screen.blit(text, textpos)
def moving_rect(self,ai_setting):
pygame.draw.rect(self.rect1, (255, 255, 255), [0, 0, self.rect_width, self.rect_height])
x = 0
x += self.rect_moving
self.screen.blit(self.rect1, [x, 0])
def run():
ai_setting = moving()
ai_setting.text1(ai_setting.screen, ai_setting.text)
ai_setting.moving_rect(ai_setting)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
return
pygame.display.update()
pygame.display.flip()
run()
目前只能移动一次,也就是X+=self.rect_moving只能移动一次,也就是在X轴只能移动10个X,但是我想要做的是让其不断移动,直到碰到边界然后反弹。今天熬夜继续试试。。。加油