python从入门到实践中的《外星人入侵》游戏,外星人移动出问题

我按照书上的代码编写,已经生成多行多列的外星人飞船,静止没问题,但是让飞船动起来的时候,却变成了只有一列飞船在移动,其他的都消失了,这是为什么呢?求指点。。。

            图片如下:
            ![图片说明](https://img-ask.csdn.net/upload/201811/01/1541061266_597866.png)
            ![图片说明](https://img-ask.csdn.net/upload/201811/01/1541061280_149064.png)


            代码如下:
            主循环:
             while True:
    # 监视键盘和鼠标事件
    gf.check_events(ai_settings, screen, ship, bullets)
    ship.update()
    gf.update_bullets(bullets)
    gf.update_aliens(ai_settings, aliens)
    # 每次循环都重绘屏幕,最近绘制的屏幕展示
    gf.update_screen(ai_settings, screen, ship, bullets, aliens)

        更新函数
        def update_aliens(ai_settings, aliens):
'''更新所有外星人'''
check_fleet_edges(ai_settings, aliens)
aliens.update()

def check_fleet_edges(ai_settings, aliens):
for alien in aliens.sprites():
if alien.check_edge():
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 update_screen(ai_settings, screen, ship, bullets, aliens):
# 更新屏幕上的图像,并切换到新屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
testnum = 0
# 在飞船和外星人后面重绘所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
# 让最新绘制的屏幕可见
print ("外星人数量= " + str(len(aliens)))
for alien in aliens.sprites():
alien.blitme()
testnum += 1
print("绘制外星人" + str(testnum))
pygame.display.flip()

    外星人类
    class Alien(Sprite):
def __init__(self, ai_settings, screen):
    super().__init__()
    self.screen = screen
    self.ai_settings = ai_settings
    self.screen_rect = self.screen.get_rect()

    self.image = pygame.image.load('image/alien.png')
    self.image = pygame.transform.scale(self.image, (40,40))
    self.rect = self.image.get_rect()

    self.rect.x = self.rect.width
    self.rect.y = self.rect.height

    self.x = float(self.rect.x)
    self.edge_station = 1
    print("alien init 完成")

def blitme(self):
    self.screen.blit(self.image, self.rect)
    print('alien draw 完成')

def check_edge(self):
    screen_rect = self.screen.get_rect()
    if self.rect.right >= screen_rect.right:
        return True
    elif self.rect.left <= 0:
        return True

def update(self):
    '''
    if self.rect.right >= self.screen_rect.right:
        self.edge_station = -1
        self.rect.y += self.rect.height
    elif self.rect.left < self.screen_rect.left:
        self.edge_station = 1
        self.rect.y += self.rect.height
    '''

    self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)
    self.rect.x = self.x

3个回答

图片说明

weixin_44617228
weixin_44617228 求助
一年多之前 回复
weixin_44617228
weixin_44617228 您好,请问您解决了这个问题吗,我跟您一样,都是只有一列外星人
一年多之前 回复

我之前照着书写运行也遇到了这个问题,观察后发现发现updat方法e并没有对sprite生成的每个alien的位置都是用精灵的实际位置计算的,查了网上资料发现update方法更新的是alien.x,需要在创造一个外星人的方法中加一个alien.x = alien.rect.x ,或者直接在更改您的update方法:self.rect.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)。

feiyihexin
feiyihexin 回复weixin_46422409: https://blog.csdn.net/feiyihexin/article/details/87944776#_199
5 个月之前 回复
weixin_46422409
weixin_46422409 楼上回复有效,但具体原因我也没搞清楚
5 个月之前 回复
feiyihexin
feiyihexin 回复weixin_44617228: 确实修改为self.rect.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)即可,具体原因还没有搞清楚
一年多之前 回复
weixin_44617228
weixin_44617228 您说的解决方案代码里本身就已经是self.rect.x了
一年多之前 回复
weixin_44617228
weixin_44617228 您好,请问您解决了这个问题吗,我跟您一样,都是只有一列外星人
一年多之前 回复
weixin_44617228
weixin_44617228 您好,请问您解决了这个
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐