#ship.py
import pygame
from pygame.sprite import Sprite
class Ship(Sprite):
def __init__(self, ai_settings, screen):
"""初始化飞船并设置其初始位置"""
super(Ship,self).__init__()
self.screen = screen
self.ai_settings = ai_settings
# 加载飞船图像并获取其外接矩形
self.image = pygame.image.load('alien1.gif')
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
if 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)
def center_ship(self):
"""让飞船在屏幕居中"""
self.center = self.screen_rect.centerx
#settings.py
class Settings():
"""储存《外星人入侵》的所有设置类"""
def __init__(self):
"""初始化游戏的设置"""
# 屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230, 230, 230)
# 子弹设置
self.bullet_speed_factor = 3
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60,60,60
self.bullets_allowed = 3
# 外星人设置
self.alien_speed_factor = 1
self.fleet_drop_speed = 10
# fleet_direction为1表示向右移,为-1表示向左移
self.fleet_direction = 1
# 飞船设置
self.ship_speed_factor = 1.5
self.ship_limit = 3
# 以什么样的速度加快游戏节奏
self.speedup_scale = 1.1
# 外星人点数的提高速度
self.score_scale = 1.5
self.initialize_dynamic_settings()
def initialize_dynamic_settings(self):
"""初始化随游戏进行而变化的设置"""
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 3
self.alien_speed_factor = 1
# fleet_direction 为1表示为右;为-1表示向左
self.fleet_direction = 1
# 记分
self.alien_points = 50
def increase_speed(self):
"""提高速度设置"""
self.ship_speed_factor *= self.speedup_scale
self.bullet_speed_factor *= self.speedup_scale
self.alien_speed_factor *= self.speedup_scale
self.alien_points = int(self.alien_points * self.score_scale)
Traceback (most recent call last):
File "/Users/shihongguang/PycharmProjects/pythonProject/alien_invasion.py", line 48, in <module>
run_game()
File "/Users/shihongguang/PycharmProjects/pythonProject/alien_invasion.py", line 24, in run_game
ship = Ship(screen,ai_settings)
File "/Users/shihongguang/PycharmProjects/pythonProject/ship.py", line 14, in __init__
self.screen_rect = screen.get_rect()
AttributeError: 'Settings' object has no attribute 'get_rect'
重新检查了“settings”板块和“ship”板块,之前运行没有出现问题,最近通过更改一些bug,突然发现运行不通.
需要你把完整的代码发一下,不然不知道错在哪里
第九行,赋予screen大概应该是 self.screen = ai_game.screen
目前我刚解决的类似问题也是这个,已经解决