qq_43578746 2018-11-01 08:36 采纳率: 0%
浏览 3480

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条回答 默认 最新

  • qq_43578746 2018-11-01 08:36
    关注

    图片说明

    评论

报告相同问题?

悬赏问题

  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)