聂l 2022-10-06 10:56 采纳率: 50%
浏览 17

调用pygame.Surface出现错误

问题遇到的现象和发生背景

我在做一个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


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-08 21:48
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月6日

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献