问题遇到的现象和发生背景
我在做一个python小游戏时候调用pygame.Surface错误
用代码块功能插入代码,请勿粘贴截图
# coding=gbk
import sys # 导入sys模块,使用模块里面的exit()来完成退出功能
import pygame
from settings import Settings # 导入settings类
from ship import Ship
from bullet import Bullet
from alien import Alien
class AlienInvasion:
def __init__(self):
pygame.init() # 初始化游戏背景
self.settings = Settings() # 创建一个settings实例并赋给self.settings
self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
self.settings.screen_width = self.screen.get_rect().width
self.settings.screen_height = self.screen.get_rect().height
pygame.display.set_caption("Alien Invasion") # 设置标题
self.ship = Ship(self)
self.bullets = pygame.sprite.Group()
self.aliens = pygame.sprite.Group()
self.__create__fleet()
def __create__fleet(self):
alien = Alien(self)
alien_width, alien_height = alien.rect.size
alien_width = alien.rect.width
avaliable_space_x = self.settings.screen_width - (2 * alien_width)
number_aliens_x = avaliable_space_x // (2 * alien_width)
ship_height = self.ship.rect.height
avaliable_space_y = (self.settings.screen_height - (3 * alien_height) - ship_height)
number_rows = avaliable_space_y // (2 * alien_height)
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
self.__create__alien(alien_number, row_number)
def __fire__bullet(self):
if len(self.bullets) < self.settings.bullets_allowed:
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
def __change__fleet__direction(self):
for alien in self.aliens.sprites():
alien.rect.y += self.settings.fleet_drop_speed
self.settings.fleet_direction *= -1
def __check__fleet__edges(self):
for alien in self.aliens.sprites():
if alien.check_edges():
self.__change__fleet__direction()
break
def run_game(self):
while True: # 包含事件循环和屏幕更新, 事件是玩家的操作
# 监听键盘和鼠标事件
self.ship.update()
self.bullets.update()
self.__update__aliens()
for bullet in self.bullets.copy():
if bullet.rect.bottom <= 0:
self.bullets.remove(bullet)
for event in pygame.event.get(): # 事件循环
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
elif event.key == pygame.K_q:
sys.exit()
elif event.key == pygame.K_SPACE:
self.__fire__bullet()
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
# 让最近绘制的屏幕可见
self.screen.fill(self.settings.bg_color) # 每次循环时重新绘制屏幕,填充颜色
self.ship.blitme()
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.aliens.draw(self.screen)
pygame.display.flip() # 不断更新屏幕,造成平滑移动的效果
def __update__aliens(self):
self.__check__fleet__edges()
self.aliens.update()
def __create__alien(self, alien_number, row_number):
alien = Alien(self)
alien_width, alien_height = alien.rect.size
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
self.aliens.add(alien)
if __name__ == '__main__':
ai = AlienInvasion()
ai.run_game()
alien.py:
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(self, ai_game):
super().__init__()
self.screen = ai_game.screen()
self.settings = ai_game.settings
self.image = pygame.image.load('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 check_edges(self):
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right or self.rect.left <= 0:
return True
def update(self):
self.x += (self.settings.alien_speed * self.settings.fleet_direction)
self.rect.x = self.x
`出现的错误
Traceback (most recent call last):
File "C:\Users\PycharmProjects\pythonProject3\alien_invasion.py", line 111, in
ai = AlienInvasion()
File "C:\UsersPycharmProjects\pythonProject3\alien_invasion.py", line 26, in init
self.__create__fleet()
File "C:\Users\PycharmProjects\pythonProject3\alien_invasion.py", line 29, in __create__fleet
alien = Alien(self)
File "C:\Users\PycharmProjects\pythonProject3\alien.py", line 8, in init
self.screen = ai_game.screen()
TypeError: 'pygame.Surface' object is not callable