Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python pygame让外星人群移动_Python_Pygame - Fatal编程技术网

python pygame让外星人群移动

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() ==================================================

更新12/7

最后我找到了我不能使用
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)