问题遇到的现象和发生背景
Python中有self.属性名 = 其他模块类名(self)的语法吗?这种语法如何理解呢?
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
求指教
import pygame # 导入游戏库game
import sys
from settings import Stiings # 导出参数类
from ship import Ship
class AlienInvasion(object):
def __init__(self):
"""初始化游戏资源"""
pygame.init()
self.stiings = Stiings() # 将设置类赋值给初始化属性:self.stiings
self.screen = pygame.display.set_mode((self.stiings.screen_width, self.stiings.screen_height))
# pygame.display.set_mode创建一个显示窗口,让所有的图像元素都在里面绘制。
# (1200, 800)是一个元组,定义了游戏窗口的尺寸,单位像素。并将这个值赋值给self.screen.使整个类都可以使用此属性
pygame.display.set_caption("外星人入侵!")
# 这是设置有序屏幕的标题
# self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
self.ship = Ship(self)
"""请注意,此处在创建一个名称self.ship实例的同时。Ship()初始化缺少参数,需要当前类(AlienInvasion)将资源传递给self.ship,
故加上Ship(self)。如:self.screen或者其他变量,self.ship实例在引用时,在初始化名称后面加上变量名称即可。
"""
# self.bg_color = (230,230,230)
# 设置屏幕颜色,在pygame中的颜色是以rgb指定的,这种颜色由红色、绿色、蓝色组成。其中每一个的值的取值范围都是:0-255.
# (0,255,0)绿色,(255,0,0)红色。(0,0,255)蓝色。我们将设计好的颜色赋值给:self.screen.fill()。让它使用我们设置的颜色
def run_game(self):
"""开启游戏的主循环"""
while True:
# 监视鼠标和键盘的事件。意思是监控鼠标和键盘的操作
for event in pygame.event.get(): # pygame.event.get这个函数包含它在上次调用后发送的所有事件(操作)
# pygame.event.get()会生成一个列表,记录之前的所以时间进行for循环,并结合if语句判断是否需要执行以下的代码
if event.type == pygame.QUIT:
sys.exit() # 监控到用户操作pygame.QUIT退出,则运行下面退出方法
self.screen.fill(self.stiings.bg_color)
# ,我们见设置好的颜色填充到屏幕中(窗口)。fill()只接收一个实参:一种颜色
self.ship.blitme()
# 让最近绘制的屏幕可见,每执行一次,会擦去旧屏幕,使得只展示新屏幕可见
pygame.display.flip()
if __name__ == '__main__':
# 创建游戏实例,并运行游戏
ai = AlienInvasion()
ai.run_game()
"""创建一个飞船类Ship"""
import pygame
class Ship(object):
"""管理飞船的类"""
def __init__(self, ai_game):
"""初始化飞船并设置初始化位置"""
self.screen = ai_game.screen
self.screen_rect = ai_game.screen.get_rect()
"""此处需要注意,初始化时由于指向了AlienInvasion类,所以可以从AlienInvasion获取已存在的变量
自定义变量 = 初始化名称.自主类变量名称(无需加self)。如:self.xxxx = ai_game.screen
"""
# 加载飞船图像并获取其外接矩形
self.image = pygame.image.load("images/ship.bmp") # load
# 属性名 = pygame.image.load("xx") 加载图片
self.rect = self.image.get_rect()
#self.rect = self.image.get_rect()是因为self.rect。要做知道图片矩形大小,以便后面根据当前大小定位所在位置
# 对于没艘新飞船,都将其放在屏幕底部的中央
self.rect.midbottom = self.screen_rect.midbottom
# self.rect.midbottom = self.screen_rect.midbottom。要知道屏幕矩形大小于,同时确认居中坐标
if self.screen_rect.midbottom == self.rect.midbottom:
print("两个值相等")
print(self.rect.midbottom)
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image,self.rect) # blit位置