新人請大佬指導
彈框后,按左右箭頭彈框消失,反饋
Traceback (most recent call last):
File "d:/py/pycode/alien_invasion/alien_invasion.py", line 47, in <module>
run_game()
File "d:/py/pycode/alien_invasion/alien_invasion.py", line 32, in run_game
gf.check_events(ai_settings,screen,ship,bullets)
File "d:\py\pycode\alien_invasion\game_functions.py", line 46, in check_events
check_keydown_events(event,ship,ai_settings,screen,bullets)
File "d:\py\pycode\alien_invasion\game_functions.py", line 26, in check_keydown_events
ship.moving_left = True
AttributeError: 'pygame.Surface' object has no attribute 'moving_left'
彈框后,按空格彈框消失,反饋
Traceback (most recent call last):
File "d:/py/pycode/alien_invasion/alien_invasion.py", line 47, in <module>
run_game()
File "d:/py/pycode/alien_invasion/alien_invasion.py", line 32, in run_game
gf.check_events(ai_settings,screen,ship,bullets)
File "d:\py\pycode\alien_invasion\game_functions.py", line 46, in check_events
check_keydown_events(event,ship,ai_settings,screen,bullets)
File "d:\py\pycode\alien_invasion\game_functions.py", line 29, in check_keydown_events
new_bullet=Bullet(ai_settings,screen,ship)
File "d:\py\pycode\alien_invasion\bullet.py", line 15, in __init__
self.rect=pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
AttributeError: 'Ship' object has no attribute 'bullet_width'
代碼如下:
#alien_invasion.py
import sys
import pygame
from set import Setting
from ship import Ship
import game_functions as gf
import importlib
importlib.reload(sys)
from pygame.sprite import Group
def run_game():
# 初始化游戲并創建一個螢屏物件
pygame.init()
ai_settings=Setting()
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) #雙括號?
pygame.display.set_caption("Alien invasion")
# 創建一艘飛船
ship=Ship(ai_settings,screen)
#創建子彈編組
bullets=Group()
#設定背景色
#bg_color=(176,224,230)
# 開始游戲的主回圈
while True:
#監視鍵盤和滑鼠
gf.check_events(ai_settings,screen,ship,bullets)
ship.update()
bullets.update()
gf.update_screen(ai_settings,screen,ship,bullets)
# for event in pygame.event.get():
# if event.type==pygame.QUIT:
# sys.exit()
#每次回圈重繪螢屏
screen.fill(ai_settings.bg_color)
ship.blitme()
# 讓最近繪制的螢屏可見
pygame.display.flip()
run_game()
#game_functions.py
import sys
import pygame
from bullet import Bullet
# def check_events(ship):
# for event in pygame.event.get():
# if event.type==pygame.QUIT:
# sys.exit()
# elif event.type==pygame.KEYDOWN: #每次按鍵都被注冊為一個KEYDOWN 事件
# if event.key==pygame.K_RIGHT:
# ship.moving_right=True
# elif event.key==pygame.K_LEFT:
# ship.moving_left=True
# elif event.type==pygame.KEYUP:
# if event.key==pygame.K_RIGHT:
# ship.moving_right=False
# elif event.key==pygame.K_LEFT:
# ship.moving_left=False
def check_keydown_events(event,ai_settings,screen,ship,bullets):
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key==pygame.K_SPACE:
# 創建一顆子彈,并將其加入到編組bullets中
new_bullet=Bullet(ai_settings,screen,ship)
bullets.add(new_bullet)
def check_keyup_events(event,ship):
"""回應松開"""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ai_settings,screen,ship,bullets):
"""回應按鍵和滑鼠事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,ship,ai_settings,screen,bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
def update_screen(ai_settings,screen,ship,bullets):
#更新螢屏上的影像,并切換到新螢屏
# 每次回圈時都重繪螢屏
screen.fill(ai_settings.bg_color)
# 在飛船和外星人后面重繪所有子彈
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
#讓最近繪制的螢屏可見
pygame.display.flip()
#ship.py
import pygame
class Ship():
def __init__(self,ai_settings,screen):
#初始化飛船并設定其初始位置
self.screen=screen
self.ai_settings=ai_settings
# 加載飛船影像并獲取其外接矩形
self.image=pygame.image.load(r'D:\py\pycode\alien_invasion\images\ship.bmp')
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)
#bullet.py
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
#一個對飛船發射的子彈進行管理的類
def __init__(self,ai_settings,screen,ship):
#在飛船所處的位置創建一個子彈物件
super(Bullet,self).__init__() #沿用2.7寫法,可用super().__init__()
self.screen=screen
# 在(0,0)處創建一個表示子彈的矩形,再設定正確的位置
self.rect=pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
self.rect.centerx=ship.rect.centerx
self.rect.top=ship.rect.top
#存盤用小數表示的子彈位置
self.y = float(self.rect.y)
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor
def update(self):
#向上移動子彈
#更新表示子彈位置的小數值
self.y -= self.speed_factor
#更新表示子彈的rect的位置
self.rect.y = self.y
def draw_bullet(self):
#在螢屏上繪制子彈
pygame.draw.rect(self.screen,self.color,self.rect)
#set.py
class Setting():
#存盤所有設定
def __init__(self):
#螢屏設定
self.screen_width=800
self.screen_height=600
self.bg_color=(255,255,255)
#飛船設定
self.ship_speed_factor=1.5
#子彈設定
self.bullet_speed_factor=1
self.bullet_width=3
self.bullet_height=15
self.bullet_color=60,60,60
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/110807.html
上一篇:halcon中傅立葉描述子
下一篇:各位大神幫幫忙!!
