鍍金池/ 問答/Python/ 外星人飛船報錯'pygame.Surface' object has no at

外星人飛船報錯'pygame.Surface' object has no attribute 'alien_speed'

我是按照書上的內(nèi)容寫到外星人群移動,發(fā)現(xiàn)game_function.py中的 def update_aliens(aliens):aliens.update()無法正常讀取setting.py中的alien_speed取值,我將alien.py中的def update(self):self.x += self.ai_screen.alien_speed改成self.x += 1,外星人群就可以正常右移了,請問是哪里出現(xiàn)問題了?新人請多多指教,困擾半天了。

alien_invasion.py

import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as game_expand
from pygame.sprite import Group
from alien import Alien
from bull import Bullet
def run_game():
pygame.init()#pygame初始化背景設(shè)置,讓pygame能夠正確工作
ai_screen = Settings()
#設(shè)置實(shí)例獲取setting模塊下Settings方法中的參數(shù)設(shè)置
screen = pygame.display.set_mode((ai_screen.width,ai_screen.height))
#創(chuàng)建顯示窗口,通過實(shí)例傳遞setting模塊下self.width和self.height的具體參數(shù)
pygame.display.set_caption('Alien Invasion')
#創(chuàng)建游戲窗口標(biāo)題,這些都屬于游戲元素
ship = Ship(screen,ai_screen)
#獲取ship模塊下的Ship方法,調(diào)用飛船圖片,創(chuàng)造出飛船
black_color = ai_screen.black_color
#設(shè)置背景顏色,以RGB值指定,每個取值范圍0-255
bullets = Group()
aliens = Group()
#將外星人添加到一個數(shù)組中
game_expand.create_fleet(ai_screen,screen,aliens)
#創(chuàng)建外星人群
while True:#使用無限循環(huán)的目的是可以在每次刷新時都打印輸出
        ship.update()
        # 每次循環(huán)時都調(diào)用飛船的update方法
        game_expand.check_events(ai_screen, screen, ship, bullets)
        #將ship模塊作為實(shí)參傳遞給game_functions模塊下的check_events方法,目的是當(dāng)檢測到事件是按鍵并且是特定的方向鍵是將飛船做出相應(yīng)的位置調(diào)整
        game_expand.update_bullets(aliens,bullets,ai_screen,screen,ship)
        game_expand.update_aliens(aliens)
        game_expand.update_screen(ai_screen,screen,ship,bullets,aliens)

run_game()


game_function.py

import sys
import pygame
from bull import Bullet
from alien import Alien
#響應(yīng)按鍵和鼠標(biāo)事件
def check_keydown_events(event,ship,ai_screen,screen,bullets):
if event.key == pygame.K_RIGHT:
    ship.move_right = True
        # 上邊代碼表示持續(xù)移動屬性被修改為true,允許持續(xù)移動
elif event.key == pygame.K_LEFT:
    ship.move_left = True
elif event.key == pygame.K_UP:
    ship.move_up = True
elif event.key == pygame.K_DOWN:
    ship.move_down = True
elif event.key == pygame.K_SPACE:
        #創(chuàng)建一顆子彈,并將其加入到編組bullets中
    fire_bullets(bullets,ai_screen,screen,ship)
elif event.key == pygame.K_q:
        #創(chuàng)建一顆子彈,并將其加入到編組bullets中
    sys.exit()

def check_keyup_events(event,ship):
if event.key == pygame.K_RIGHT:
    ship.move_right = False
        # 上邊代碼表示持續(xù)移動屬性被修改為false,不允許持續(xù)移動
if event.key == pygame.K_LEFT:
    ship.move_left = False
if event.key == pygame.K_UP:
    ship.move_up = False
if event.key == pygame.K_DOWN:
    ship.move_down = False

def check_events(ai_screen, screen, ship, bullets):
for event in pygame.event.get():
# 為讓程序響應(yīng)事件,我們編寫一個事件循環(huán),監(jiān)聽事件,如果有事件發(fā)生,執(zhí)行相應(yīng)任務(wù)
    if event.type == pygame.QUIT:
        sys.exit()  # 退出進(jìn)程
    elif event.type == pygame.KEYDOWN:
        #如果pygame檢測到KEYDOWN事件,做出以下反應(yīng)
        check_keydown_events(event,ship,ai_screen,screen,bullets)
    elif event.type == pygame.KEYUP:
        #如果pygame檢測到KEYUP事件,做出一下反應(yīng)
        check_keyup_events(event,ship)
def fire_bullets(bullets,ai_screen,screen,ship):
if len(bullets) <= ai_screen.bull_allow:
    # 檢查如果同屏子彈數(shù)小于等于setting.py中設(shè)置的要求數(shù)量,執(zhí)行下列命令,將子彈添加到bullets列表中
    new_bullet = Bullet(ai_screen, screen, ship)
    bullets.add(new_bullet)

def update_bullets(aliens,bullets,ai_screen,screen,ship):
for bullet in bullets.copy():
    if bullet.rect.bottom <= 0:
        bullets.remove(bullet)
bullets.update()

def get_number_aliens_x(ai_screen,alien_width):
#計算每行可容納多少個外星人
available_space_x = ai_screen.width - 2 * alien_width
#可放置外星人的水平空間有多大
number_aliens_x = int(available_space_x / (2 * alien_width))
#計算一行可容納外星人數(shù)量
return number_aliens_x

def create_alien(ai_screen,screen,aliens,alien_number):
alien = Alien(ai_screen,screen)
alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
aliens.add(alien)

def create_fleet(ai_screen,screen,aliens):
#創(chuàng)建外星人群
alien = Alien(ai_screen,screen)
#先創(chuàng)建一個外星人
number_aliens_x = get_number_aliens_x(ai_screen,alien.rect.width)
for alien_number in range(number_aliens_x):
    create_alien(ai_screen,screen,aliens,alien_number)

def update_aliens(aliens):
aliens.update()

def update_screen(ai_screen,screen,ship,bullets,aliens):
#更新屏幕中的圖片,并切換到新屏幕
screen.fill(ai_screen.black_color)
#用屏幕填充背景顏色,只接受一個實(shí)參,一種顏色
for bull in bullets.sprites():
#在飛船和外星人后面重繪所有子彈,該方法中的所有函數(shù)必須在pygame.display.flip()前執(zhí)行,否則無法正常顯示
    bull.draw_bull()
ship.blitme()
#將飛船圖片繪制到屏幕中
aliens.draw(screen)
#在屏幕上繪制編組中的每個外星人
pygame.display.flip()
# 繪制最近屏幕的顯示,通過不斷更新屏幕,以顯示元素的新位置,并在原來的位置隱藏元素,從而營造平滑移動效果


aline.py

import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(self,screen,ai_screen):
    super(Alien,self).__init__()
    self.screen = screen
    self.ai_screen = ai_screen
    self.image = pygame.image.load('C:\\Users\\邢小星\\PycharmProjects\\Game\\Game_Windows\\aliens.bmp')
    #加載外星人圖片
    self.rect = self.image.get_rect()
    self.rect.x = self.rect.width
    self.rect.y = self.rect.height
    #設(shè)置每個外星人最初都在屏幕左上角附近出現(xiàn)
    self.x = float(self.rect.x)

def update(self):
    self.x += self.ai_screen.alien_speed
    self.rect.x = self.x

def blitme(self):
    self.screen.blit(self.image, self.rect)


setting.py

class Settings():
def __init__(self):
    self.width = 960#寬度
    self.height = 600#高度
    self.black_color = (255,255,255)#背景顏色
    self.ship_speed = 1.5#飛船行駛速度
    self.bull_speed = 1
    self.bull_width = 3
    self.bull_height = 15
    self.bull_color = (10,10,10)
    self.bull_allow = 5#限制同屏的子彈數(shù)
    self.alien_speed = 1
    self.fleet_drop_speed = 2
    self.fleet_direction = 1
回答
編輯回答
敢試

create_aliencreate_fleet 中,你都是使用 alien = Alien(ai_screen,screen) 創(chuàng)建 Alien 對象的。但是 Alien.__init__() 的參數(shù)簽名卻是 Alien.__init__(screen, ai_screen) 順序反了。

2018年1月6日 07:59
編輯回答
怪痞

是的,謝謝大神知道,確實(shí)是參數(shù)寫反了

2018年4月26日 16:33