python pygame使外星人小组行动

时间:2019-12-05 14:32:12

标签: python pygame

更新12/7

最后,我找到了无法使用Group调用方法的原因,因为方法名称必须为update(),以便Group可以调用。

在我的代码中,我像这样修改,然后成功了!

def update(self):
     self.x =self.rect.x + self.speed
     self.rect.x = self.x
def position(aliens):
    aliens.update()

============================================

编辑问题使其清晰可见

def update(self):
            self.x =self.ai.setting.alien_speed_factor
            self.rect.x = self.x

def update_aliens(aliens):
       aliens.update()

本书中的这两个,我在代码中使用,因为外星人是一个Group,它被称为错误#AttributeError:“ Group”对象没有属性“ position”

如何让Group的外星人执行update() ???

我正在编写脚本以使外星人群体活动,一种是我自己的方式,另一种是书中的方式,当我提到这本书时,发现一个错误,我不确定这是否是错误的。

预订“ Python崩溃课程”,第243页

我使用

def update(aliens):
    for alien in aliens:
        alien.position()

代替书中的代码:

def update(aliens):
        aliens.position()

返回

>> AttributeError: 'Group' object has no attribute 'position'

然后运行脚本是正确的,那么这在书中是错误的吗?还是我使用错误的方式来运行原始代码?

这是我的代码:

#!/usr/bin/python
import sys
import pygame as p


class Setting():
    def __init__(self,width,height):
        self.w=width
        self.h=height
        self.flag=p.RESIZABLE
        self.screen=p.display.set_mode((self.w,self.h),self.flag)
        p.display.set_caption("Muhaha")



class Alien(p.sprite.Sprite):
    def __init__(self):
        super().__init__()
        pic=p.image.load("../image/ship.jpg").convert_alpha()
        self.image=p.transform.smoothscale(pic,(100,100))
        self.rect=self.image.get_rect()
        self.x = float(self.rect.x)
        self.rect.x=(self.rect.width)
        self.speed=1
    def create(self,setting,aliens):
        spacex=setting.w-(self.rect.x)*2
        spacey=(setting.h)/2-self.rect.y
        alien_number=int(spacex/(2*(self.rect.width)))
        alien_row=int(spacey/(2*(self.rect.height)))
        for row in range(alien_row):
           for number in range(alien_number):
               alien=Alien()
               alien.rect.x=alien.rect.x+2*alien.rect.width*number
               alien.rect.y=alien.rect.y+2*alien.rect.height*row
               aliens.add(alien)

    def position(self):
        self.x =self.rect.x + self.speed
        self.rect.x = self.x
    def update(aliens):
        aliens.position()        #AttributeError: 'Group' object has no attribute 'position'
                                 #i think the correct code is>> for alien in aliens:
                                 #                              alien.position()

    def blit(setting,aliens):
        aliens.draw(setting.screen)

def game():
    p.init()
    setting=Setting(1200,800)
    alien=Alien()
    aliens=p.sprite.Group()
    alien.create(setting,aliens)
    while True:
         for event in p.event.get():
             if event.type == p.QUIT:
                 sys.exit()
         setting.screen.fill((255,0,0))
         Alien.blit(setting,aliens)
         Alien.update(aliens)
         p.display.flip()
game()

1 个答案:

答案 0 :(得分:1)

是的,这似乎是一个错误。老实说,整个代码看起来很可怕。

第一步,从blit类中删除positionAlien函数,将update函数更改为此:

def update(self):
    self.x = self.rect.x + self.speed
    self.rect.x = self.x  

并在主循环中,而不是

     Alien.blit(setting,aliens)
     Alien.update(aliens)

    aliens.update()
    aliens.draw(setting.screen)

update上调用Group将调用该update中所有Sprite实例中的Group,因此不需要手动遍历所有精灵。

以同样的方式,在draw上调用Group将把Group中的所有子图绘制到作为参数传递的Surface(通常是屏幕表面)上。同样,在Alien类中不需要这样做,该类应该表示单个精灵。

其他一些问题:

  • 每次创建新实例时,都会从磁盘加载Alien精灵的图像
  • 没有FPS限制,因此游戏无法以恒定速度运行
  • 命名主函数很常见,好吧,“ main”
  • 创建Alien的实例只是使用create实例方法创建更多实例,然后像类方法一样使用update函数