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
    关注

    图片说明

    评论

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面