前天实现了在屏幕中绘制一个敌人,昨天算是水了一篇日更吧。其实要说日更挑战这个模式,我觉得本身还是没问题的,至少可以让我这种极度容易放弃的人有一种约束感,不管是不是凑的,它能监督我坚持做一件事情,哪怕每天的收获只有一点点。如果对一件事情不确定是否热爱的话,先坚持做下去也没什么,至少我不讨厌它。
废话不多说了,今天开始绘制一些敌人吧~要绘制一群外星人,需要确定一行能容纳多少个外星人以及要绘制多少行外星人。我们将首先计算外星人之间的水平间距,并创建一行敌人,再确定可用的垂直空间,并创建整群敌人。
2.2 创建一群敌人
2.2.1 确定一行能容纳多少敌人
为确定一行可容纳多少个外星人,我们来看看可用的水平空间有多大。屏幕宽度存储在ai_settings.screen_width 中,但需要在屏幕两边都留下一定的边距,把它设置为敌人的宽度。由于有两个边距,因此可用于放置敌人的水平空间为屏幕宽度减去外星人宽度的两倍:
available_space_x = ai_settings.screen_width – (2 * alien_width)
为了布局的美观,我们还需要在敌人之间留出一定的空间,即外星人宽度。因此,显示一个外星人所需的水平空间为敌人宽度的两倍:一个宽度用于放置敌人,另一个宽度为敌人右边的空白区域。为确定一行可容纳多少个外星人,我们将可用空间除以敌人宽度的两倍:
number_aliens_x = available_space_x / (2 * alien_width)
确定好公式以后,我们可以开始创建敌人了!
2.2.2 创建多行敌人
为创建一行敌人,首先在alien_invasion.py中创建一个名为aliens 的空编组,用于存储全部敌人,再调用game_functions.py中创建外星人群的函数:
import pygame
from pygame.sprite import Group
from setting import Settings
from ship import Ship
from alien import Alien
import game_functions as gf
def rungame():
#初始化游戏并创建一个屏幕对象
pygame.init()
#实例化设置对象
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
#创建一只飞船
ship = Ship(ai_settings,screen)
#创建一个用于存储子弹的编组
bullets = Group()
#创建一个用于存储敌人的编组
aliens = Group()
# #创建一个外星人
# alien = Alien(ai_settings,screen)
# 创建一群敌人
gf.create_fleet(ai_settings,screen,aliens)
#开始游戏主循环
while True:
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
gf.update_bullets(bullets)
gf.update_screen(ai_settings,screen,ship,aliens,bullets)
rungame()
先来修改主函数,我们把一个敌人修改成一群敌人,接下来我们需要修改game_function模块,首先修改upstate_screen函数:
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()
# 屏幕上绘制敌人
# alien.blitme()
aliens.draw(screen)
#让最近绘制的屏幕可见#
pygame.display.flip()
对编组调用draw() 时,Pygame自动绘制编组的每个元素,绘制位置由元素的属性rect 决定。在这里,aliens.draw(screen) 在屏幕上绘制编组中的每个敌人。
2.2.3 创建多行敌人
下面我们来设计create_fleet函数:
def create_fleet(ai_settings,screen,aliens):
# 创建敌人群
# 创建一个敌人,并计算一行可容纳多少个敌人
# 敌人间距为敌人宽度
alien = Alien(ai_settings, screen)
alien_width = alien.rect.width
available_space_x = ai_settings.screen_width - 2 * alien_width
number_aliens_x = int(available_space_x / (2 * alien_width))
# 创建第一行敌人
for alien_number in range(number_aliens_x):
# 创建一个敌人并将其加入当前行
alien = Alien(ai_settings, screen)
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
aliens.add(alien)
计算数量部分的代码我们之前已经设计过,这里只是做了一个实现,下一步我们需要创建第一行敌人,实例化并按照序号生成一行敌人。如果现在运行主程序,你会看到这样的效果。

貌似飞船有些大了,我晚上调整一下图片去……
就这样吧。给甲方孙子变魔术去了。
网友评论