飛機(jī)大戰(zhàn)獨(dú)眼外星人

摘要

在游戲《飛機(jī)大戰(zhàn)獨(dú)眼外星人》中,玩家控制著一艘最初出現(xiàn)在屏幕底部中央的飛機(jī)。玩家可以使用箭頭鍵左右移動飛機(jī),還可使用空格鍵進(jìn)行射擊。游戲開始時,一群外星人出現(xiàn)在天空中,他們在屏幕中向下移動。玩家的任務(wù)是射殺這些外星人。玩家將所有外星人都消滅干凈后,將出現(xiàn)一群新的外星人,他們移動的速度更快。只要有外星人撞到了玩家的飛機(jī)或到達(dá)了屏幕底部,玩家就損失一艘飛機(jī)。玩家損失三艘飛機(jī)后,游戲結(jié)束。

1.引言

???Pygame最初是由Pete Shinner編寫的,該項目于2000年10月啟動,六個月后,pygame版本1.0發(fā)布。pygame是一個利用SDL(Simple

DirectMedia Layer)寫就的游戲庫。SDL 是一個用于控制多媒體的跨平臺C庫,與DirectX相當(dāng),它已被用于數(shù)百種商業(yè)和開源游戲。Pete Shinner對Python和SDL兩個項目的簡潔與優(yōu)雅印象深刻,他決定將Python和SDL結(jié)合起來,組建一個真正利用Python的項目,目標(biāo)是讓做簡單的事情變得容易,讓困難的事情變簡單。

2. 系統(tǒng)結(jié)構(gòu)


飛機(jī)

* alien_invasion.py

主文件alien_invasion.py創(chuàng)建一系列整個游戲都要用到的對象:存儲在ai_settings 中的設(shè)置、存儲在 screen 中的主顯示surface以及一個飛機(jī)實(shí)例。文件 alien_invasion.py 還包含游戲的主循環(huán),這是一個調(diào)用 check_events() 、 ship.update() 和 update_screen() 的 while 循環(huán)。要玩游戲,只需運(yùn)行文件alien_invasion.py。其他文件(settings.py、

game_functions.py、ship.py)包含的代碼被直接或間接地導(dǎo)入到這個文件中。


* settings.py

文件settings.py包含 Settings 類,這個類只包含方法 __init__() ,它初始化控制游戲外觀和飛機(jī)速度的屬性。


* game_functions.py

文件game_functions.py包含一系列函數(shù),游戲的大部分工作都是由它們完成的。函數(shù)

check_events() 檢測相關(guān)的事件,如按鍵和松開,并使用輔助函數(shù)check_keydown_events() 和check_keyup_events() 來處理這些事件。就目前而言,這些函數(shù)管理飛機(jī)的移動。模塊game_functions 還包含函數(shù) update_screen() ,它用于在每次執(zhí)行主循環(huán)時都重繪屏幕。


* ship.py

文件ship.py包含 Ship 類,這個類包含方法 __init__() 、管理飛機(jī)位置的方法 update() 以及在屏幕上繪制飛機(jī)的方法 blitme() 。表示飛機(jī)的圖像存儲在文件夾images下的文件ship.bmp中。


* bullet.py

用來添加射擊功能。將編寫玩家按空格鍵時發(fā)射子彈(小矩形)的代碼。子彈將在屏

幕中向上穿行,抵達(dá)屏幕上邊緣后消失。


外星人

* alien.py

alien.py用來控制每個外星人的行為,創(chuàng)建Ship 類那樣創(chuàng)建這個類,同樣的,需要在alien_invasion.py中創(chuàng)建一個 Alien 實(shí)例


* game_stats.py

game_stats.py用于跟蹤游戲統(tǒng)計信息,記錄飛機(jī)被撞了多少次,同時跟蹤統(tǒng)計信息還有助于記分。幫助確定外星人與飛機(jī)發(fā)生碰撞時,該做些什么


記分

* button.py

創(chuàng)建一個 Button 類,用于創(chuàng)建帶標(biāo)簽的實(shí)心矩形。


* scoreboard.py

為在屏幕上顯示得分,需要創(chuàng)建一個新類 Scoreboard 。這個類用于顯示當(dāng)前得分、最高得分、等級和余下的飛機(jī)數(shù)。同樣的在alien_invasion.py中創(chuàng)建一個 Scoreboard 實(shí)例


介紹系統(tǒng)的結(jié)構(gòu),對使用的相關(guān)技術(shù),相關(guān)模塊進(jìn),實(shí)現(xiàn)功能的原理進(jìn)行介紹,采用框架圖,示例圖等進(jìn)行表述,使人可以對系統(tǒng)的框架和原理有個比較好的把握;

3. 實(shí)現(xiàn)代碼

alien.py

import pygame

from pygame.sprite import Sprite


class Alien(Sprite):

???"""表示單個外星人的類"""


??? def__init__(self,ai_settings,screen):

???????"""初始化外星人并設(shè)置其起始位置"""

???????super().__init__()

???????self.screen=screen

???????self.ai_settings=ai_settings


???????#加載外星人圖像,并設(shè)置其rect屬性

???????self.image=pygame.image.load('D:/zixue/python/Project-Alien-Invasion/images/alien.bmp')

???????self.rect=self.image.get_rect()


???????#每個外星人最初都在屏幕左上角附近

???????self.rect.x=self.rect.width

???????self.rect.y=self.rect.height


???????#存儲外星人的準(zhǔn)確位置

???????self.x=float(self.rect.x)


??? defblitme(self):

???????"""在指定位置繪制外星人"""

???????self.screen.blit(self.image,self.rect)


??? defcheck_edges(self):

???????"""如果外星人位于屏幕邊緣,就返回True"""

???????screen_rect=self.screen.get_rect()

???????if self.rect.right>=screen_rect.right:

???????????return True

???????elif self.rect.left<=0:

???????????return True



??? defupdate(self):

???????"""向左或向右移動外星人"""

???????self.x+=(self.ai_settings.alien_speed_factor*self.ai_settings.fleet_direction)

???????self.rect.x=self.x


alien_invasion.py

import pygame

from?pygame.sprite import Group

from settings import Settings

from game_stats import GameStats

from scoreboard import Scoreboard

from ship import Ship

from button import Button

import game_functions as gf





def run_game():


??? #初始化pygame、設(shè)置和屏幕對象

???pygame.init()

???ai_settings=Settings() #創(chuàng)建一個Settings實(shí)例

???screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))

???pygame.display.set_caption("飛機(jī)大戰(zhàn)獨(dú)眼外星人")


??? #創(chuàng)建開始按鈕

???play_button=Button(ai_settings,screen,"Play")


??? #創(chuàng)建存儲游戲統(tǒng)計信息的實(shí)例,并創(chuàng)建記分牌

???stats=GameStats(ai_settings)

???sb=Scoreboard(ai_settings,screen,stats)


??? #創(chuàng)建一艘飛機(jī)、一個子彈編組和一個外星人編組

???ship=Ship(ai_settings,screen)


??? #創(chuàng)建一個用于存儲子彈的編組

???bullets=Group()


??? #創(chuàng)建一個外星人

???aliens=Group()


??? #創(chuàng)建外星人群

???gf.create_fleet(ai_settings,screen,ship,aliens)





??? #開始游戲的主循環(huán)

???while True:

???????gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets)


???????if stats.game_active:

???????????ship.update()

???????????gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)

???????????gf.update_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets)


???????gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button)


run_game()


bullet.py

import pygame

from pygame.sprite import Sprite


class Bullet(Sprite):

???"""一個對飛機(jī)發(fā)射的子彈進(jìn)行管理的類"""


??? def__init__(self,ai_settings,screen,ship):

???????"""在飛機(jī)所處的位置創(chuàng)建一個子彈對象"""

???????super().__init__()

???????self.screen=screen


???????#在(0,0)處創(chuàng)建一個表示子彈的矩形,再設(shè)置正確的位置

???????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

???????#存儲用小數(shù)表示的子彈位置

???????self.y=float(self.rect.y)


???????self.color=ai_settings.bullet_color

???????self.speed_factor=ai_settings.bullet_speed_factor


??? defupdate(self):

???????"""向上移動子彈"""

???????#更新表示子彈位置的小數(shù)值

???????self.y-=self.speed_factor

???????#更新表示子彈的rect的位置

???????self.rect.y=self.y


??? defdraw_bullet(self):

???????"""在屏幕上繪制子彈"""

???????pygame.draw.rect(self.screen,self.color,self.rect)


button.py

import pygame.font


class Button():


??? def__init__(self,ai_settings,screen,msg):

???????"""初始化按鈕的屬性"""

???????self.screen=screen

???????self.screen_rect=screen.get_rect()


???????#設(shè)置按鈕的尺寸和其他屬性

???????self.width,self.height=200,50

?? ?????self.button_color=(0,255,0)

???????self.text_color=(255,255,255)

???????self.font=pygame.font.SysFont(None,48)


???????#創(chuàng)建按鈕的rect對象,并使其居中

???????self.rect=pygame.Rect(0,0,self.width,self.height)

???????self.rect.center=self.screen_rect.center


???????#按鈕的標(biāo)簽只需創(chuàng)建一次

???????self.prep_msg(msg)



??? defprep_msg(self,msg):

???????"""將msg渲染為圖像,并使其在按鈕上居中"""

???????self.msg_image=self.font.render(msg,True,self.text_color,self.button_color)

???????self.msg_image_rect=self.msg_image.get_rect()

???????self.msg_image_rect.center=self.rect.center



??? defdraw_button(self):

???????#繪制一個用顏色填充的按鈕,再繪制文本

???????self.screen.fill(self.button_color,self.rect)

???????self.screen.blit(self.msg_image,self.msg_image_rect)



game_functions.py

import sys

from time import sleep

import pygame

from bullet import Bullet

from alien import Alien


leveling = 2


deffire_bullet(ai_settings,screen,ship,bullets):

???"""如果還沒有到達(dá)限制,就發(fā)射一顆子彈"""

??? #創(chuàng)建一顆子彈,并將其加入到編組bullets中

??? iflen(bullets) < ai_settings.bullets_allowed:

???????new_bullet = Bullet(ai_settings, screen, ship)

???????bullets.add(new_bullet)



def check_keydown_events(event,ai_settings,screen,ship,bullets):


???"""響應(yīng)按鍵"""

??? ifevent.key == pygame.K_RIGHT:

???????#向右移動飛機(jī)?

???????ship.moving_right = True

???elif event.key == pygame.K_LEFT:

???????ship.moving_left = True

???elif event.key==pygame.K_SPACE:

???????fire_bullet(ai_settings,screen,ship,bullets)

???elif event.key==pygame.K_q:

???????sys.exit()



def check_keyup_events(event, ship):


???"""響應(yīng)松開"""

??? ifevent.key == pygame.K_RIGHT:

???????ship.moving_right = False

???elif event.key == pygame.K_LEFT:

???????ship.moving_left = False



def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets):

???"""響應(yīng)按鍵和鼠標(biāo)事件"""

??? #監(jiān)視鍵盤和鼠標(biāo)時間

??? forevent in pygame.event.get():

???????if event.type == pygame.QUIT:

???????????sys.exit()


???????elif event.type==pygame.KEYDOWN:

???????????check_keydown_events(event,ai_settings,screen,ship,bullets)

???????????check_keydown_events(event,ai_settings,screen,ship,bullets)


???????elif event.type==pygame.KEYUP:

???????????check_keyup_events(event,ship)


???????elif event.type==pygame.MOUSEBUTTONDOWN:

???????????mouse_x,mouse_y=pygame.mouse.get_pos()

???????????check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y)



def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y):

???"""在玩家單擊Play按鈕時開始新游戲"""

???button_clicked=play_button.rect.collidepoint(mouse_x,mouse_y)

??? ifbutton_clicked and not stats.game_active:

???????#重置游戲設(shè)置

???????ai_settings.initialize_dynamic_settings()

???????#隱藏光標(biāo)

???????pygame.mouse.set_visible(False)

???????#重置游戲統(tǒng)計信息

???????stats.reset_stats()

???????stats.game_active=True


???????#重置記分牌圖像

???????sb.prep_score()

???????sb.prep_high_score()

???????sb.prep_level()

???????sb.prep_ships()



???????#清空外星人列表和子彈列表

???????aliens.empty()

???????bullets.empty()


???????#創(chuàng)建一群新的外星人,并讓飛機(jī)居中

???????create_fleet(ai_settings,screen,ship,aliens)

???????ship.center_ship()




defupdate_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button):

???"""更新屏幕上的圖像,并切換到新屏幕"""

??? #調(diào)用screen.fill 方法:每次循環(huán)時都重繪屏幕

???screen.fill(ai_settings.bg_color)


??? #在飛機(jī)和外星人后面重繪所有的子彈

??? forbullet in? bullets:

???????bullet.draw_bullet()

???ship.blitme()

???aliens.draw(screen)

?? ?sb.show_score()


??? #如果游戲處于非活動狀態(tài),就繪制Play按鈕

??? ifnot stats.game_active:

???????play_button.draw_button()


??? #讓最近繪制的屏幕可見

???pygame.display.flip()



defupdate_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):

???"""更新子彈的位置,并刪除已消失的子彈"""

??? #更新子彈的位置

???bullets.update()


??? #刪除已消失的子彈

??? forbullet in bullets.copy():

???????if bullet.rect.bottom <= 0:

???????????bullets.remove(bullet)


? ??check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets)



defcheck_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):

???"""響應(yīng)子彈和外星人的碰撞"""

??? #刪除發(fā)生碰撞的子彈和外星人

???collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)


??? ifcollisions:

???????for aliens in collisions.values():

???????????stats.score+=ai_settings.alien_points*len(aliens)

???????????sb.prep_score()

???????check_high_score(stats,sb)


??? iflen(aliens) == 0:

???????#如果整群外星人都被消滅,就提高一個等級

???????bullets.empty()

???????ai_settings.increase_speed()


???????#提高等級?

???????stats.level+=1

???????leveling = stats.level

???????sb.prep_level()


???????create_fleet(ai_settings, screen, ship, aliens)




def get_number_aliens_x(ai_settings,alien_width):

???"""計算每行可容納多少個外星人"""

???available_space_x = ai_settings.screen_width - 2 * alien_width

???number_aliens_x = int(available_space_x / (2 * alien_width)-4)? #向下圓整

???return number_aliens_x



def create_alien(ai_settings,screen,aliens,alien_number,row_number):

???"""創(chuàng)建一個外星人并將其放在當(dāng)前行"""

???alien = Alien(ai_settings, screen)

???alien_width = alien.rect.width

???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

???aliens.add(alien)



defcreate_fleet(ai_settings,screen,ship,aliens):

???"""創(chuàng)建外星人群"""

??? #創(chuàng)建一個外星人,并計算每行可容納多少個外星人

???alien = Alien(ai_settings, screen)

???number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)

???number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)


??? #創(chuàng)建外星人群

??? forrow_number in range(number_rows):

???????for alien_number in range(number_aliens_x):

???????????create_alien(ai_settings,screen,aliens,alien_number,row_number)


defget_number_rows(ai_settings,ship_height,alien_height):

???"""計算屏幕可容納多少行外星人"""

???available_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)

???number_rows=int(available_space_y/(2*alien_height)+leveling-8)

???return number_rows


def check_fleet_edges(ai_settings,aliens):

???"""有外星人到達(dá)邊緣時采取相應(yīng)的措施"""

??? foralien in aliens.sprites():

???????if alien.check_edges():

???????????change_fleet_direction(ai_settings,aliens)

???????????break



defchange_fleet_direction(ai_settings,aliens):

???"""將整群外星人下移,并改變它們的方向"""

??? foralien in aliens.sprites():

???????alien.rect.y+= ai_settings.fleet_drop_speed

???ai_settings.fleet_direction*=-1



defship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets):

???"""響應(yīng)被外星人撞到的飛機(jī)"""

??? ifstats.ships_left > 0:

???????#將ships_left減1

???????stats.ships_left-=1


???????#更新記分牌

???????sb.prep_ships()


???????#清空外星人列表和子彈列表?

???????aliens.empty()

???????bullets.empty()


???????#創(chuàng)建一群新的外星人,并將飛機(jī)放到屏幕底端中央

???????create_fleet(ai_settings,screen,ship,aliens)

???????ship.center_ship()


???????#暫停

???????sleep(0.5)


???else:

???????stats.game_active=False

???? ???pygame.mouse.set_visible(True)



defcheck_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets):

???"""檢查是否有外星人到達(dá)了屏幕底端"""

???screen_rect=screen.get_rect()

??? foralien in aliens.sprites():

???????if alien.rect.bottom>=screen_rect.bottom:

???????????#像飛機(jī)被撞到一樣進(jìn)行處理

???????????ship_hit(ai_settings,stats,screen,sb,ship,aliens,bullets)

???????????break



defupdate_aliens(ai_settings,stats,screen,sb,ship,aliens,bullets):

???"""

??? 檢查是否有外星人位于屏幕邊緣,并更新整群外星人的位置

???"""

???check_fleet_edges(ai_settings,aliens)

???aliens.update()

??? #檢測外星人和飛機(jī)之間的碰撞

??? ifpygame.sprite.spritecollideany(ship,aliens):

???????ship_hit(ai_settings,screen,stats,sb,ship,aliens,bullets)


??? #檢查是否有外星人抵達(dá)屏幕底端

???check_aliens_bottom(ai_settings,stats,screen,sb,ship,aliens,bullets)



def check_high_score(stats,sb):

???"""檢查是否誕生了新的最高得分"""

??? ifstats.score>stats.high_score:

???????stats.high_score=stats.score

???????sb.prep_high_score()



game_stats.py

class GameStats():

???"""跟蹤游戲的統(tǒng)計信息"""

??? def__init__(self,ai_settings):

???????"""初始化統(tǒng)計信息"""

???????self.ai_settings=ai_settings

???????self.reset_stats()


???????#讓游戲一開始處于非活動狀態(tài)

???????self.game_active=False


???????#在任何情況下都不應(yīng)重置最高得分

???????self.high_score=0


??? defreset_stats(self):

???????"""初始化在游戲運(yùn)行期間可能變化的統(tǒng)計信息"""

???????self.ships_left=self.ai_settings.ship_limit

???????self.score=0

???????self.level=1




scoreboard.py

import pygame.font

from pygame.sprite import Group

from ship import Ship


class Scoreboard():

???"""顯示得分信息的類"""


??? def__init__(self,ai_settings,screen,stats):

???????"""初始化顯示得分涉及的屬性"""

???????self.screen=screen

???????self.screen_rect=screen.get_rect()

???????self.ai_settings=ai_settings

???????self.stats=stats


???????#顯示得分信息時使用的字體設(shè)置


???????self.text_color=(30,30,30)

???????self.font=pygame.font.SysFont(None,48)



???????# #準(zhǔn)備包含最高得分和當(dāng)前得分的圖像

???????self.prep_score()

???????self.prep_high_score()

???????self.prep_level()

???????self.prep_ships()




??? defprep_score(self):

???? ???"""將得分轉(zhuǎn)換為一幅渲染的圖像"""

???????rounded_score = round(self.stats.score, -1)

???????score_str="{:,}".format(rounded_score)

???????self.score_image=self.font.render(score_str,True,self.text_color,self.ai_settings.bg_color)


???????#將得分放在屏幕右上角

???????self.score_rect=self.score_image.get_rect()

???????self.score_rect.right=self.screen_rect.right-20

???????self.score_rect.top=20



??? defshow_score(self):

???????"""在屏幕上顯示飛機(jī)和得分"""

???????self.screen.blit(self.score_image,self.score_rect)

???????self.screen.blit(self.high_score_image,self.high_score_rect)

???????self.screen.blit(self.level_image,self.level_rect)

???????#繪制飛機(jī)

???????self.ships.draw(self.screen)




??? defprep_high_score(self):

???????"""將最高得分轉(zhuǎn)換為渲染的圖像"""

???????high_score=round(self.stats.high_score,-1)

???????high_score_str="{:,}".format(high_score)

???????self.high_score_image=self.font.render(high_score_str,True,self.text_color,self.ai_settings.bg_color)


???????#將最高得分放在屏幕頂部中央

???????self.high_score_rect=self.high_score_image.get_rect()

???????self.high_score_rect.centerx=self.screen_rect.centerx

???????self.high_score_rect.top=self.score_rect.top




??? defprep_level(self):

???????"""將等級轉(zhuǎn)換為渲染的圖像"""

???????self.level_image=self.font.render(str(self.stats.level),True,self.text_color,self.ai_settings.bg_color)


???????#將等級放在得分下方

???????self.level_rect=self.level_image.get_rect()

???????self.level_rect.right=self.score_rect.right

???????self.level_rect.top=self.score_rect.bottom+10



??? defprep_ships(self):

???????"""顯示還余下多少艘飛機(jī)"""

???????self.ships=Group()

???????for ship_number in range(self.stats.ships_left):

???????????ship=Ship(self.ai_settings,self.screen)

???????????ship.rect.x=10+ship_number*ship.rect.width

???????????ship.rect.y=10

???????????self.ships.add(ship)


settings.py

class Settings():

???"""存儲的所有設(shè)置的類"""


??? def__init__(self):

???????"""初始化游戲的靜態(tài)設(shè)置"""

???????#屏幕設(shè)置

???????self.screen_width=1000

???????self.screen_height=600

???????self.bg_color=(230,230,230) #設(shè)置背景色:RGB


???????#飛機(jī)的設(shè)置

???????self.ship_speed_factor=1.3

???????self.ship_limit=10



???????#子彈設(shè)置

???????self.bullet_speed_factor=3

???????self.bullet_width=3

???????self.bullet_height=15

???????self.bullet_color=60,60,60

???????self.bullets_allowed=3


???????#外星人設(shè)置

???????self.alien_speed_factor=1

???????self.fleet_drop_speed=5

???????# fleet_direction為1表示向右移,為-1表示向左移

???????self.fleet_direction=1


???????#以什么樣的速度加快游戲節(jié)奏

???????self.speedup_scale=1.2


???????#外星人點(diǎn)數(shù)的提高速度

???????self.score_scale=1.2


???????self.initialize_dynamic_settings()



??? definitialize_dynamic_settings(self):

???????"""初始化隨游戲進(jìn)行而變化的設(shè)置"""

???????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



??? defincrease_speed(self):

???????"""提高速度設(shè)置和外星人點(diǎn)數(shù)"""

???????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)



ship.py

import pygame

from pygame.sprite import Sprite


class Ship(Sprite):


??? def__init__(self,ai_settings,screen):

???????"""初始化飛機(jī)并設(shè)置其初始位置"""

???????super().__init__()

???????self.screen=screen

???????self.ai_settings=ai_settings


???????#加載飛機(jī)圖像并獲取其外接矩形

???????self.image=pygame.image.load('D:/zixue/python/Project-Alien-Invasion/images/ship.bmp')

???????self.rect=self.image.get_rect()

???????self.screen_rect=screen.get_rect()


???????#將每艘新飛機(jī)放在屏幕底部中央?

???????self.rect.centerx=self.screen_rect.centerx # x坐標(biāo)

???????self.rect.bottom=self.screen_rect.bottom # y坐標(biāo)


???????#在飛機(jī)的屬性center中存儲小數(shù)值

???????self.center=float(self.rect.centerx)


???????#移動標(biāo)志

???????self.moving_right=False

???????self.moving_left=False


??? defupdate(self):

???????"""根據(jù)移動標(biāo)志調(diào)整飛機(jī)的位置"""

???????#更新飛機(jī)的center值,而不是rect

???????if self.moving_right and self.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


???????#根據(jù)self.center更新rect對象

???????self.rect.centerx=self.center


??? defblitme(self):

???????"""在指定位置繪制飛機(jī)"""

???????self.screen.blit(self.image,self.rect)


??? defcenter_ship(self):

???????"""讓飛機(jī)在屏幕上居中"""

???????self.center=self.screen_rect.centerx

4. 實(shí)驗

?

開始界面


敵人左右移動

消滅部分?jǐn)橙?/div>

子彈

第二關(guān)

5. 總結(jié)和展望

???游戲關(guān)卡設(shè)計不夠合理,沒有呈現(xiàn)明顯的難度遞增,未加入音效和背景音樂,游戲游玩時顯得有點(diǎn)枯燥,不能自定義難度,任意選擇關(guān)卡,游戲里面沒有各種加狀態(tài)的道具,敵人的攻擊模式單一。未來完善時會一一加入,參照飛機(jī)大戰(zhàn)、雷霆戰(zhàn)機(jī)等優(yōu)秀游戲進(jìn)行修改和加入新功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容