Python抛出AttributeError:“ Group”对象没有属性“ blitme”

时间:2019-02-13 02:33:59

标签: python pygame

我是一名初学者,我只是想从书中创建一个名为“ Alien Invasion”的游戏。但是每次运行它时都会发生此错误。我应该如何对待他。我的任何帮助和解释做错了,将不胜感激。先感谢您。很抱歉,其中可能包含一些中文。

AttributeError:“组”对象没有属性“ blitme”

alien_invasion.py

import sys
import pygame
from setting import Settings
from ship import Ship
from pygame.sprite import Group
from alien import Alien
import game_functions as gf

def run_game():
#初始化屏幕并创建一个对象
pygame.init()
ai_settings=Settings()
screen=pygame.display.set_mode(
    (ai_settings.screen_width,ai_settings.screen_height))


pygame.display.set_caption("Aline Invasion")

#创建一艘飞船
ship=Ship(ai_settings,screen)

#创建一个用于储存子弹的编组
bullets=Group()
#创建一个外星人


aliens=Group()
gf.creat_fleet(ai_settings,screen,aliens)

#开始游戏的主循环
while True:

    #监视键盘和鼠标
    gf.check_events(ai_settings,screen,ship,bullets)
    ship.update()
    gf.update_bullets(bullets)
    gf.update_screen(ai_settings,screen,ship,aliens,bullets)

run_game()

setting.py

class Settings():
#储存外星人所有的类

        def __init__(self):
        #初始化游戏设置
    #屏幕设置
    self.screen_width=800
    self.screen_height=450
    self.bg_color=(230,230,230)

    #飞船设置
    self.ship_speed_factor=1.5

    #子弹设置
    self.bullet_speed_factor=0.5
    self.bullet_width=3
    self.bullet_height=12
    self.bullet_color=60,60,60
    self.bullet_allowed=5

game_functions.py

import sys
import pygame
from bullet import Bullet
from alien import Alien

def check_keydown_event(event,ai_settings,screen,ship,bullets):
    #响应按键
    if event.key==pygame.K_RIGHT:
        ship.moving_right=True
    elif event.key==pygame.K_LEFT:
        ship.moving_left=True
    elif event.key==pygame.K_SPACE:
        fire_bullet(ai_settings,screen,ship,bullets)



def check_keyup_event(event,ship):
    #响应松开
    if event.key==pygame.K_RIGHT:
        ship.moving_right=False
    elif event.key==pygame.K_LEFT:
        ship.moving_left=False



def check_events(ai_settings,screen,ship,bullets):
    #响应按键和鼠标事件
    for event in pygame.event.get():
    if event.type==pygame.quit:
                sys.exit()
    elif event.type==pygame.KEYDOWN:             
             check_keydown_event(event,ai_settings,screen,ship,bullets)
    elif event.type==pygame.KEYUP:
            check_keyup_event(event,ship)

def update_screen(ai_settings,screen,ship,alien,bullets):
    ##更新屏幕上的图像,并切换到屏幕
    #每次循环时都重绘屏幕
    screen.fill(ai_settings.bg_color)
    for bullet in bullets:
    bullet.draw_bullet()

    ship.blitme()
    alien.blitme()
    aliens.draw(screen)
    #让最近绘制的屏幕可见
    pygame.display.flip()

def update_bullets(bullets):
    ##更新子弹的位置,并删除已消失的子弹
    #更新子弹的位置
    bullets.update()
    #删除已消失的子弹
    for bullet in bullets.copy():
        if bullet.rect.bottom<=0:
            bullet.remove(bullets)

def fire_bullet(ai_settings,screen,ship,bullets):
    #如果没有达到限制就发射一颗
    if len(bullets)<ai_settings.bullet_allowed:
    new_bullet=Bullet(ai_settings,screen,ship)
    bullets.add(new_bullet)


def creat_fleet(ai_settings,screen,aliens):
#创建外星群
#创建外星人并且计算一行能容纳多少人
#外星人的间距和外星人的宽度
alien=Alien(ai_settings,screen)
alien_width=alien.rect.width
avaliable_space_x=ai_settings.screen_width-2*alien_width
number_alien_x=int(avaliable_space_x/(2*alien_width))

#创建第一行外星人
for alien_number in range(number_alien_x):
    alien=Alien(ai_settings,screen)
    alien.x=alien_width+2*alien_width*alien_number
    alien.rect.x=alien.x
    aliens.add(alien)

bullet.py

import pygame
from pygame.sprite import Sprite

class Bullet(Sprite):
def __init__(self,ai_settings,screen,ship):
    super().__init__()
    self.screen=screen

    #在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
    self.rect=pygame.Rect(0,0,ai_settings.bullet_width,
        ai_settings.bullet_height)
    self.rect.centerx=ship.rect.centerx
    self.rect.top=ship.rect.top

    #储存用小数表示的子弹位置
    self.y=float(self.rect.y)

    self.color=ai_settings.bullet_color
    self.speed_factor=ai_settings.bullet_speed_factor


def update(self):
    #向上移动子弹
    #更新表示子弹位置的数值
    self.y-=self.speed_factor
    #更新子弹的位置
    self.rect.y=self.y

def draw_bullet(self):
    #在屏幕上绘制子弹
    pygame.draw.rect(self.screen,self.color,self.rect)

ship.py

import pygame

class Ship():


def __init__(self,ai_settings,screen):
    #初始化飞船并设置其初始位置

    self.screen=screen
    self.ai_settings=ai_settings

    #加载飞船图像并获取其外接矩形
    self.image=pygame.image.load('images/ship.bmp')
    #获取相应属性
    self.rect=self.image.get_rect()
    self.screen_rect=screen.get_rect()

    #将每部飞放在底部中央
    self.rect.centerx=self.screen_rect.centerx
    self.rect.bottom=self.screen_rect.bottom


    #在飞船的属性center中储存小数值
    self.center=float(self.rect.centerx)

    #移动标志
    self.moving_right=False
    self.moving_left=False

def update(self):
    #根据移动调整飞船位置
    #更新飞船的center值而不是rect
    if self.moving_right and 
                    self.rect.right<self.screen_rect.right:
        self.center+=self.ai_settings.ship_speed_factor
    elif self.moving_left and self.rect.left>0:
        self.center-=self.ai_settings.ship_speed_factor


    #根据self.center更新rect对象
    self.rect.centerx=self.center

#指定位置绘制飞船
def blitme(self):
    self.screen.blit(self.image,self.rect)

alien.py

import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
#表示单个外星人的类
def __init__(self,ai_settings,screen):
    super().__init__()
    self.screen=screen
    self.ai_settings=ai_settings

    #加载外星人图像
    self.image=pygame.image.load("images/alien.bmp")
    self.rect=self.image.get_rect()

    #让每个外星人最初都在屏幕右上角附近
    self.rect.x=self.rect.width
    self.rect.y=self.rect.height

    #储存外星人的位置
    self.x=float(self.rect.x)

def blitme(self):
    #在指定位置绘制外星人
    self.screen.blit(self.image,self.rect)

文件

中的“ alien_invasion”,第43行

在run_game中的文件“ alien_invasion”,第39行

文件“ H:\ java \ Alineinvasion \ game_functions.py”,第50行,位于更新屏幕中

AttributeError:“组”对象没有属性“ blitme”

AttributeError:“组”对象没有属性“ blitme”

1 个答案:

答案 0 :(得分:1)

代码将名为Sprite.Group(请注意“ s”)的aliens作为参数alien(否“ s”)传递到update_screen()

由于alien是一个组,因此没有定义blitme()函数。

def update_screen(ai_settings,screen,ship,alien,bullets):
    ##更新屏幕上的图像,并切换到屏幕
    #每次循环时都重绘屏幕
    screen.fill(ai_settings.bg_color)
    for bullet in bullets:
        bullet.draw_bullet() # Should this be bullets.draw(screen) ?

    ship.blitme()   # Single sprite, this is OK
    alien.blitme()  # <-- HERE, remove this
    aliens.draw(screen)  # Draws all the alien sprites too
    #让最近绘制的屏幕可见
    pygame.display.flip()

我认为此函数可能应该将参数重命名为alien-> aliens,因为没有传递aliens参数,但已被引用。

def update_screen(ai_settings,screen,ship,aliens,bullets):
    ##更新屏幕上的图像,并切换到屏幕
    #每次循环时都重绘屏幕
    screen.fill(ai_settings.bg_color)
    bullets.draw(screen)  # Should this be bullets.draw(screen) ?
    ship.blitme()
    aliens.draw(screen)
    #让最近绘制的屏幕可见
    pygame.display.flip()