一直运行不起来,要么窗口闪一下要么就没窗口,困扰了两天实在是看不懂了,好像是ship那个函数有问题。
而且那些形参比如self什么的作用看不懂啊
这是系统的报错:
Traceback (most recent call last):
File "c:\game\alien_invasion.py", line 62, in <module>
ai=AlienInvasion()
File "c:\game\alien_invasion.py", line 18, in __init__
self.ship=Ship(self)
File "c:\game\ship.py", line 14, in __init__
ship_rect= self.ship_image.get_rect()
AttributeError: 'Ship' object has no attribute 'ship_image'
Alien_Invasion.py
import pygame
import sys
from settings import Settings
from ship import Ship
class AlienInvasion:
"""管理游戏资源和行为的类"""
def __init__(self):
"""初始化屏幕"""
pygame.init()
self.settings=Settings()
self.screen=pygame.display.set_mode((0,0),pygame.FULLSCREEN)
self.settings.screen=self.screen.get_rect().width
self.settings.screen=self.screen.get_rect().height
pygame.display.set_caption("Alien Invasion")
self.ship=Ship(self)
"""有问题"""
def run_game(self):
"""开始游戏的主循环"""
while True:
self._check_events()
self.ship.updata()
self._updata_screen()
def _check_events(self):
"""监视捕获鼠标与键盘操作"""
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
self._check_ketdown_events(event)
elif event.type == pygame.KEYUP:
self._check_ketup_events(event)
"""将开和关重构为函数"""
def _check_keydown_events(self,event):
if event.key == pygame.K_LEFT:
self.moving_left=True
elif event.key == pygame.K_RIGHT:
self.moving_right=True
elif event.key==pygame.K_q:
sys.exit()
def _check_keyup_events(self,event):
if event.key == pygame.K_LEFT:
self.moving_left=False
elif event.key == pygame.K_RIGHT:
self.moving_right=False
def _updata_screen(self):
"""更新屏幕中图像,并切换到新屏幕"""
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
pygame.display.flip()
"""这里也有问题"""
#创建游戏实例并运行游戏
ai=AlienInvasion()
ai.__init__()
ai.run_game()
Ship.py
import sys
import pygame
class Ship:
# 飞船
def __init__(self,ai_game):
"""初始化飞船并设置其初始位置"""
self.screen=ai_game.screen
self.settings=ai_game.settings
self.screen_rect=ai_game.screen.get_rect()
"""加载飞船图像并获取其外接矩形"""
ship_image=pygame.image.load('images/ship.bmp')
ship_rect= self.ship_image.get_rect()
"""将新飞船放在屏幕底部中央"""
#看这里
ship_rect.midbottom=self.screen_rect.midbottom
"""移速设置小数值"""
self.x=float(self.rect.x)
#移动开关
self.moving_left=False
self.moving_right=False
def updata(self):
"""限制飞船移动"""
if self.moving_left and self.rect.left>0:
self.x -= self.self.settings.ship_speed
if self.moving_right and self.rect.right<self.screen_rect.right:
self.x += self.self.settings.ship_speed
#根据self.x更新rect对象
self.rect.x = self.x
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.rect(self.image,self.rect)
Settings.py
import pygame
class Settings():
"""储存外星人大战的所有设置"""
def __init__(self):
"""初始化游戏的设置"""
# 屏幕设置
self.screen_width = 1200;
self.screen_height = 800;
self.bg_color = (230, 230, 230)
"""速度设置"""
self.ship_speed=1.5
"""子弹设置"""
self.bullet_speed=1.0
self.bullet_weight=3
self.bullet_height=15
self.bullet_color=(60,60,60)
Bullet.py
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
"""管理飞船所发射的子弹的类"""
def __init__(self,ai_game):
"""在飞船当前位置创建一个文件夹"""
super().__init__()
self.screen=ai_game.screen
self.settings=ai_game.settings
self.color=self.settings.bullet_color
#在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
self.rect=pygame.Rect(0,0,self.settings.bullet_width,self.settings.bullet_height)
self.rect.midtop=ai_game.ship.rect.midtop
#存储用小数表示的子弹位置
self.y=float(self.rect.y)
def updata(self):
"""向上移动的字弹"""
#更新表示子弹位置的小数值
#更新表示子弹的rect的位置
self.rect.y