昨天的內容裏有了運動的子彈,雖然咱們只添加了一個子彈,但你能夠看到咱們須要記錄子彈的x,y座標,每次要更新它的座標。若是咱們想要有多顆子彈,就須要存儲多個座標。那時候處理起來就不顯得那麼簡單,也許咱們可使用兩個list,一個專門存儲各個子彈的x座標,另外一個專門存儲子彈的y座標,問題彷佛變得沒那麼複雜,寫起來會簡單一些。可是咱們到如今尚未加入過敵機,若是加入了敵機,加入別的東西的設計,咱們將須要不少不一樣的數據的存儲。雖然一個思路清晰的程序員能夠記住全部的座標存儲在哪一個list裏,可是這畢竟比較麻煩。那有什麼方法呢?程序員
這就須要提到程序語言的數據抽象方法了,也就是面向對象的抽象方法,可讓咱們更好地處理數據。dom
面向對象的關鍵在於封裝,咱們來看看應該怎樣封裝一個子彈。函數
描述一個子彈,最主要要用的就是它的圖片,座標的位置。它須要的就這麼多,還有是一段處理子彈顯示的代碼。ui
#定義一個Bullet類,封裝子彈的數據和方法 class Bullet(object): def __init__(self): self.x = 0 self.y = -100 self.speed = 600 self.image = pygame.image.load(bullet_image_filename).convert_alpha() def move(self,passed_time_second): if self.y < 0: mouseX, mouseY = pygame.mouse.get_pos() self.x = mouseX - self.image.get_width()/2 self.y = mouseY - self.image.get_width()/2 else: self.y -= self.speed*passed_time_seconds
這段代碼的寫法和昨天寫的徹底同樣,可是用了面向對象的寫法。而後咱們將昨天的代碼更改一下:spa
# -*- coding: utf8 -*- background_image_filename = 'background.png' mouse_image_filename = 'hero.png' bullet_image_filename = 'bullet.png' #指定圖像文件名稱 import pygame #導入pygame庫 from sys import exit #向sys模塊借一個exit函數用來退出程序 #定義一個Bullet類,封裝子彈的數據和方法 class Bullet(object): def __init__(self): self.x = 0 self.y = -100 self.speed = 600 self.image = pygame.image.load(bullet_image_filename).convert_alpha() def move(self, passed_time_second): if self.y < 0: mouseX, mouseY = pygame.mouse.get_pos() self.x = mouseX - self.image.get_width()/2 self.y = mouseY - self.image.get_width()/2 else: self.y -= self.speed*passed_time_second pygame.init() #初始化pygame,爲使用硬件作準備 screen = pygame.display.set_mode((480, 650), 0, 32) #建立了一個窗口 pygame.display.set_caption("PlaneFight!") #設置窗口標題 pygame.mouse.set_visible(False) background = pygame.image.load(background_image_filename).convert() mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha() #加載並轉換圖像 bullet = Bullet() clock = pygame.time.Clock() while True: #遊戲主循環 for event in pygame.event.get(): if event.type == pygame.QUIT: #接收到退出事件後退出程序 pygame.quit() exit() time_passed = clock.tick(100) time_passed_second = time_passed/1000.0 screen.blit(background, (0,0)) #將背景圖畫上去 x, y = pygame.mouse.get_pos() #得到鼠標位置 bullet.move(time_passed_second)#移動子彈 x-= mouse_cursor.get_width() / 2 y-= mouse_cursor.get_height() / 2 #計算光標的左上角位置 screen.blit(bullet.image, (bullet.x, bullet.y)) screen.blit(mouse_cursor, (x, y)) #把元素畫上去 pygame.display.update() #刷新一下畫面
這樣,咱們就掌握了子彈的建立方法。設計
咱們用一樣的思路去考慮敵機應該怎樣建立。rest
敵機須要封裝的數據,主要也是圖片,座標。以及封裝一個處理它座標變化的方法。code
那麼咱們就能夠定義敵機的類:對象
class Enemy(object):#定義一個Enemy類,封裝敵機的數據和方法 def __init__(self): self.x = 200 self.y = -50 self.speed = 200 self.image = pygame.image.load(enemy_image_filename).convert_alpha() def move(self, passed_time_second): if self.y < 650: self.y += self.speed*passed_time_second else: self.y = -50
而後用相同的方法給它實例化,顯示,就能夠獲得這樣的畫面:blog
敵機和子彈同樣,咱們就將它顯示了出來。
可是,這裏有個很明顯的問題,那就是敵機每次都從上面的中間飛到下面的中間,和真實遊戲相差不少,怎麼才能讓它多變呢?
這裏咱們能夠import另一個經常使用的庫了,也就是random
from random import randint
在開始加上這一句,引入randint(),這個方法用於生成隨機整數,能夠給它兩個參數,分別做爲下界和上界,使用時下界不能比上界大。
而後咱們把這個Enemy類改寫成這樣:
class Enemy(object):#定義一個Enemy類,封裝敵機的數據和方法 def restart(self): self.x = randint(-30,400) self.y = randint(-100, -50) self.speed = randint(100,400) def __init__(self): self.restart() self.image = pygame.image.load(enemy_image_filename).convert_alpha() def move(self, passed_time_second): if self.y < 650: self.y += self.speed*passed_time_second else: self.restart()
這樣,敵機的出現速度,出現位置都會發生變化,就顯得沒有那麼呆板了。
總體的代碼以下:
# -*- coding: utf8 -*- background_image_filename = 'background.png' mouse_image_filename = 'hero.png' bullet_image_filename = 'bullet.png' enemy_image_filename = 'enemy.png' #指定圖像文件名稱 import pygame #導入pygame庫 from sys import exit #向sys模塊借一個exit函數用來退出程序 from random import randint #引入隨機數 #定義一個Bullet類,封裝子彈的數據和方法 class Bullet(object): def __init__(self): self.x = 0 self.y = -100 self.speed = 600 self.image = pygame.image.load(bullet_image_filename).convert_alpha() def move(self, passed_time_second): if self.y < 0: mouseX, mouseY = pygame.mouse.get_pos() self.x = mouseX - self.image.get_width()/2 self.y = mouseY - self.image.get_width()/2 else: self.y -= self.speed*passed_time_second class Enemy(object):#定義一個Enemy類,封裝敵機的數據和方法 def restart(self): self.x = randint(-30,400) self.y = randint(-100, -50) self.speed = randint(100,400) def __init__(self): self.restart() self.image = pygame.image.load(enemy_image_filename).convert_alpha() def move(self, passed_time_second): if self.y < 650: self.y += self.speed*passed_time_second else: self.restart() pygame.init() #初始化pygame,爲使用硬件作準備 screen = pygame.display.set_mode((480, 650), 0, 32) #建立了一個窗口 pygame.display.set_caption("PlaneFight!") #設置窗口標題 pygame.mouse.set_visible(False) background = pygame.image.load(background_image_filename).convert() mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha() #加載並轉換圖像 bullet = Bullet() enemy = Enemy() clock = pygame.time.Clock() while True: #遊戲主循環 for event in pygame.event.get(): if event.type == pygame.QUIT: #接收到退出事件後退出程序 pygame.quit() exit() time_passed = clock.tick(100) time_passed_second = time_passed/1000.0 screen.blit(background, (0,0)) #將背景圖畫上去 x, y = pygame.mouse.get_pos() #得到鼠標位置 bullet.move(time_passed_second)#移動子彈 enemy.move(time_passed_second) x-= mouse_cursor.get_width() / 2 y-= mouse_cursor.get_height() / 2 #計算光標的左上角位置 screen.blit(enemy.image, (enemy.x, enemy.y)) screen.blit(bullet.image, (bullet.x, bullet.y)) screen.blit(mouse_cursor, (x, y)) #把各個元素畫上去 pygame.display.update() #刷新一下畫面
今天除了將程序方法改爲了面向對象之外,基本上也沒有多講什麼。
如今,飛機只有一架,子彈只有一發,敵機也只有一架,感受不出面向對象的威力,但當它數目多起來時,你會以爲面向對象的抽象的確很省事。
明天我就來給出個人多架飛機的方法。
因爲我最近事情比較多,這個更新也寫的很拖沓,天天只講了一點點。對於天天在試着作的人來說是太慢了。不過我天天都會堅持更新,直到把這個遊戲搭建起來。
以爲我講的慢的朋友,有兩個方法,一是本身試着查一些資料,二是先無論個人更新,一週之後再看,到時候就能夠看到比較多的變化。
最近比較忙,沒辦法一鼓作氣,很差意思了。