python pygame让外星人群移动
更新12/7 最后我找到了我不能使用python pygame让外星人群移动,python,pygame,Python,Pygame,更新12/7 最后我找到了我不能使用Group调用方法的原因,因为方法名必须update(),以便组可以调用 在我的代码中,我这样修改,然后它工作了 def update(self): self.x =self.rect.x + self.speed self.rect.x = self.x def position(aliens): aliens.update() ==================================================
Group
调用方法的原因,因为方法名必须update()
,以便组可以调用
在我的代码中,我这样修改,然后它工作了
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()
这两个是书中的两个,我在代码中使用它,因为外星人是一个叫做error#AttributeError的组:“Group”对象没有属性“position”
如何使组
执行更新()
我写剧本是为了让外星生物群移动,一个是为了我自己的方式,另一个是从书中,当我参考这本书时,我发现了一个错误,我不确定它是否是错的
书籍“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()
是的,它看起来像一只虫子。老实说,整个代码看起来很糟糕
第一步,从Alien
类中删除blit
和position
函数,将update
函数更改为:
def update(self):
self.x = self.rect.x + self.speed
self.rect.x = self.x
在主循环中,而不是
Alien.blit(setting,aliens)
Alien.update(aliens)
做
在组中调用update
将调用该组中所有Sprite
实例的update
,因此不需要手动迭代所有Sprite
同样,在组
上调用draw
会将该组
中的所有精灵绘制到作为参数传递的曲面
(通常是屏幕曲面)。同样,在Alien
类中不需要这样做,该类应该表示单个精灵
其他一些问题:
- 每次创建新实例时,都会从磁盘加载
Alien
精灵的映像
- 没有FPS限制,因此游戏不会以恒定速度运行
- 通常将主函数命名为“main”
- 创建
Alien
的实例,只需使用create
instance方法创建更多实例,然后像使用class方法一样使用update
函数
这是哪本书?我是Python速成班的作者,其中包括一个名为“外星人入侵”的项目。这看起来像是从这本书的抄袭版本;这段代码有一些相同的计算,但组织方式完全不同。@japhyr hi在第243页def update(self)self.x=self.ai_settings.alien_speed_factor self.rect.x=self.x
def update_aliens(aliens)aliens.update()
aliens是一个Group@japhyr我找到了原因!!!如果我想使用Group来调用其名称必须为def update()
的方法,我会在我的代码中更改它,它起作用了,这不是书中的bug,而是我的bug。我很高兴听到您已经解决了您遇到的问题。但对于阅读本文的人来说,这不是Python速成班的代码。这本书要么是抄袭得很差,要么是有人试图独立重构代码。对于任何好奇的人来说,这是一个好消息。在与第12-14章相对应的文件夹中有多个版本的游戏。我编辑了这个问题,对于它自己创建的代码,我知道它可能真的很可怕,我参考了这本书,然后根据理解编写代码
aliens.update()
aliens.draw(setting.screen)