美文网首页
【python3小白上路系列】添加一些敌人(二)

【python3小白上路系列】添加一些敌人(二)

作者: Charles_DT | 来源:发表于2020-08-21 14:39 被阅读0次

前天实现了在屏幕中绘制一个敌人,昨天算是水了一篇日更吧。其实要说日更挑战这个模式,我觉得本身还是没问题的,至少可以让我这种极度容易放弃的人有一种约束感,不管是不是凑的,它能监督我坚持做一件事情,哪怕每天的收获只有一点点。如果对一件事情不确定是否热爱的话,先坚持做下去也没什么,至少我不讨厌它。

废话不多说了,今天开始绘制一些敌人吧~要绘制一群外星人,需要确定一行能容纳多少个外星人以及要绘制多少行外星人。我们将首先计算外星人之间的水平间距,并创建一行敌人,再确定可用的垂直空间,并创建整群敌人。

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)

计算数量部分的代码我们之前已经设计过,这里只是做了一个实现,下一步我们需要创建第一行敌人,实例化并按照序号生成一行敌人。如果现在运行主程序,你会看到这样的效果。



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

相关文章

网友评论

      本文标题:【python3小白上路系列】添加一些敌人(二)

      本文链接:https://www.haomeiwen.com/subject/atuujktx.html