问题 AttributeError: 'Settings' object has no attribute 'blit'

下面这段程式用于外星人入侵小游戏,预期是将外星人绘制在屏幕上
可是执行后出现 AttributeError: ‘Settings’ object has no attribute ‘blit’
在网上多次查询无果,对比同类型ship也没发现问题
请教一下我应该修改哪一部分呢?
十分感谢

alien_invasion.py


    import pygame
    from pygame.sprite import Group

    from setting import Settings
    from ship import Ship
    from alien import Alien
    import game_functions as gf

    def run_game():
        # 初始化pygame,设置和屏幕对象
        pygame.init()
        ai_settings=Settings()
        screen=pygame.display.set_mode(
        (ai_settings.screen_width,ai_settings.screen_height))
        pygame.display.set_caption("Alien Invasion")

        # 创建一艘飞船
        ship=Ship(screen,ai_settings)
        # 创建一个用于存储子弹的编组
        bullets = Group()
        # 创建一个外星人
        alien=Alien(screen,ai_settings)

        # 开始游戏的主循环
        while True:
            gf.check_events(ai_settings,screen,ship,bullets)
            ship.update()
            gf.update_bullets(bullets)
            gf.update_screen(ai_settings,screen,ship,bullets,alien)

    run_game()

game_function.py

import sys
import pygame

from bullet import Bullet

def check_ketdown_events(event,ai_settings,screen,ship,bullets):
    if event.key == pygame.K_RIGHT:
        #向右移动飞船
        ship.moving_right = True
    if event.key == pygame.K_LEFT:
        #向左移动飞船
        ship.moving_left = True
    elif event.key == pygame.K_SPACE:
        fire_bullet(ai_settings,screen,ship,bullets)
    elif event.key == pygame.K_q:
        sys.exit()

def fire_bullet(ai_settings,screen,ship,bullets):
        """如果还没有达到限制,就发射一颗子弹"""
        # 创建新子弹,并将其加入到编组bullets中
        if len(bullets) < ai_settings.bullets_allowed:
            new_bullet = Bullet(ai_settings,screen,ship)
            bullets.add(new_bullet)

def check_keyup_events(event,ship):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = False
    if 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_ketdown_events(event,ai_settings,screen,ship,bullets)

        elif event.type == pygame.KEYUP:
            check_keyup_events(event,ship)

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

    # 在飞船和外星人后面重绘所有子弹
    for bullet in bullets.sprites():
        bullet.draw_bullet()
    ship.blitme()
    alien.blitme()

    # 让最近绘制的屏幕可见
    pygame.display.flip()

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

alien.py

import pygame
from pygame.sprite import Sprite


class Alien(Sprite):
    """表示单个外星人的类"""

    def __init__(self,ai_settings,screen):
        """初始化外星人并设置其起始位置"""
        super(Alien,self).__init__()
        self.screen = screen
        self.ai_settings = ai_settings

        # 加载外星人图像,并设置其rect属性
        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)

setting.py

class Settings():
    """存储《外星人入侵》的所有设置的类"""

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

        # 飞船的设置
        self.ship_speed_factor=1.5

        #子弹设置
        self.bullet_speed_factor = 1
        self.bullet_width = 3
        self.bullet_height = 15
        self.bullet_color = 60,60,60
        self.bullets_allowed = 5

Jason990420
最佳答案
  1. 'Settings' object has no attribute 'blit'
    alien.py line 27
    self.scrre.blit(self.image, self.rect)
  2. 'bilt'应该是'screen'的attribute, 表示这里的self.screen是Settings不是screen
  3. 看一下, self.screen的定义, self.screen = screen没错, 那就错在self了
    class Alien(Sprite):
     def __init__(self,ai_settings,screen):
         super(Alien,self).__init__()
         self.screen = screen
  4. 再看一下, self的定义
    def __init__(self, ai_settings, screen)
  5. 再看一下class Alien的实例
    alien=Alien(screen,ai_settings)
  6. 看到了吗? 参数顺序反了, 要改成
    alien=Alien(ai_settings, screen)
    或者把
    def __init__(self, ai_settings, screen):
    改成
    def __init__(self, screen, ai_settings):
5年前 评论
Alexzedd (楼主) 5年前
讨论数量: 2
Vimiix

Alien 初始化的两个参数传反了吧

alien=Alien(screen,ai_settings) 
5年前 评论
Alexzedd (楼主) 5年前
Jason990420
  1. 'Settings' object has no attribute 'blit'
    alien.py line 27
    self.scrre.blit(self.image, self.rect)
  2. 'bilt'应该是'screen'的attribute, 表示这里的self.screen是Settings不是screen
  3. 看一下, self.screen的定义, self.screen = screen没错, 那就错在self了
    class Alien(Sprite):
     def __init__(self,ai_settings,screen):
         super(Alien,self).__init__()
         self.screen = screen
  4. 再看一下, self的定义
    def __init__(self, ai_settings, screen)
  5. 再看一下class Alien的实例
    alien=Alien(screen,ai_settings)
  6. 看到了吗? 参数顺序反了, 要改成
    alien=Alien(ai_settings, screen)
    或者把
    def __init__(self, ai_settings, screen):
    改成
    def __init__(self, screen, ai_settings):
5年前 评论
Alexzedd (楼主) 5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!