更新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()
答案 0 :(得分:1)
是的,这似乎是一个错误。老实说,整个代码看起来很可怕。
第一步,从blit
类中删除position
和Alien
函数,将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
精灵的图像Alien
的实例只是使用create
实例方法创建更多实例,然后像类方法一样使用update
函数