国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

2015/11/5用Python寫游戲,pygame入門(5):面向?qū)ο蟮挠螒蛟O(shè)計(jì)

2019-11-14 16:55:49
字體:
供稿:網(wǎng)友

昨天的內(nèi)容里有了運(yùn)動的子彈,雖然我們只添加了一個子彈,但你可以看到我們需要記錄子彈的x,y坐標(biāo),每次要更新它的坐標(biāo)。如果我們想要有多顆子彈,就需要存儲多個坐標(biāo)。那時候處理起來就不顯得那么簡單,也許我們可以使用兩個list,一個專門存儲各個子彈的x坐標(biāo),另一個專門存儲子彈的y坐標(biāo),問題似乎變得沒那么復(fù)雜,寫起來會簡單一些。但是我們到現(xiàn)在還沒有加入過敵機(jī),如果加入了敵機(jī),加入別的東西的設(shè)計(jì),我們將需要很多不同的數(shù)據(jù)的存儲。雖然一個思路清晰的程序員可以記住所有的坐標(biāo)存儲在哪個list里,但是這畢竟比較麻煩。那有什么方法呢?

這就需要提到程序語言的數(shù)據(jù)抽象方法了,也就是面向?qū)ο蟮某橄蠓椒ǎ梢宰屛覀兏玫靥幚頂?shù)據(jù)。


面向?qū)ο蟮年P(guān)鍵在于封裝,我們來看看應(yīng)該怎樣封裝一個子彈。

描述一個子彈,最主要要用的就是它的圖片,坐標(biāo)的位置。它需要的就這么多,還有是一段處理子彈顯示的代碼。

#定義一個Bullet類,封裝子彈的數(shù)據(jù)和方法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

這段代碼的寫法和昨天寫的完全一樣,但是用了面向?qū)ο蟮膶懛āH缓笪覀儗⒆蛱斓拇a更改一下:

# -*- coding: utf8 -*-background_image_filename = 'background.png'mouse_image_filename = 'hero.png'bullet_image_filename = 'bullet.png'#指定圖像文件名稱 import pygame #導(dǎo)入pygame庫from sys import exit #向sys模塊借一個exit函數(shù)用來退出程序#定義一個Bullet類,封裝子彈的數(shù)據(jù)和方法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_secondpygame.init() #初始化pygame,為使用硬件做準(zhǔn)備screen = pygame.display.set_mode((480, 650), 0, 32)#創(chuàng)建了一個窗口pygame.display.set_caption("PlaneFight!")#設(shè)置窗口標(biāo)題pygame.mouse.set_visible(False) background = pygame.image.load(background_image_filename).convert()mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()#加載并轉(zhuǎn)換圖像bullet = Bullet()clock = pygame.time.Clock()while True:#游戲主循環(huán)     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()    #獲得鼠標(biāo)位置    bullet.move(time_passed_second)#移動子彈                x-= mouse_cursor.get_width() / 2    y-= mouse_cursor.get_height() / 2    #計(jì)算光標(biāo)的左上角位置        screen.blit(bullet.image, (bullet.x, bullet.y))    screen.blit(mouse_cursor, (x, y))    #把元素畫上去     pygame.display.update()    #刷新一下畫面

這樣,我們就掌握了子彈的創(chuàng)建方法。


我們用同樣的思路去考慮敵機(jī)應(yīng)該怎樣創(chuàng)建。

敵機(jī)需要封裝的數(shù)據(jù),主要也是圖片,坐標(biāo)。以及封裝一個處理它坐標(biāo)變化的方法。

那么我們就可以定義敵機(jī)的類:

class Enemy(object):#定義一個Enemy類,封裝敵機(jī)的數(shù)據(jù)和方法    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

然后用相同的方法給它實(shí)例化,顯示,就可以得到這樣的畫面:

敵機(jī)和子彈一樣,我們就將它顯示了出來。

但是,這里有個很明顯的問題,那就是敵機(jī)每次都從上面的中間飛到下面的中間,和真實(shí)游戲相差很多,怎么才能讓它多變呢?

這里我們可以import另外一個常用的庫了,也就是random

from random import randint

在開始加上這一句,引入randint(),這個方法用于生成隨機(jī)整數(shù),可以給它兩個參數(shù),分別作為下界和上界,使用時下界不能比上界大。

然后我們把這個Enemy類改寫成這樣:

class Enemy(object):#定義一個Enemy類,封裝敵機(jī)的數(shù)據(jù)和方法    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()

這樣,敵機(jī)的出現(xiàn)速度,出現(xiàn)位置都會發(fā)生變化,就顯得沒有那么呆板了。

整體的代碼如下:

# -*- coding: utf8 -*-background_image_filename = 'background.png'mouse_image_filename = 'hero.png'bullet_image_filename = 'bullet.png'enemy_image_filename = 'enemy.png'#指定圖像文件名稱 import pygame #導(dǎo)入pygame庫from sys import exit #向sys模塊借一個exit函數(shù)用來退出程序from random import randint #引入隨機(jī)數(shù)#定義一個Bullet類,封裝子彈的數(shù)據(jù)和方法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_secondclass Enemy(object):#定義一個Enemy類,封裝敵機(jī)的數(shù)據(jù)和方法    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,為使用硬件做準(zhǔn)備screen = pygame.display.set_mode((480, 650), 0, 32)#創(chuàng)建了一個窗口pygame.display.set_caption("PlaneFight!")#設(shè)置窗口標(biāo)題pygame.mouse.set_visible(False) background = pygame.image.load(background_image_filename).convert()mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()#加載并轉(zhuǎn)換圖像bullet = Bullet()enemy = Enemy()clock = pygame.time.Clock()while True:#游戲主循環(huán)     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()    #獲得鼠標(biāo)位置    bullet.move(time_passed_second)#移動子彈    enemy.move(time_passed_second)                x-= mouse_cursor.get_width() / 2    y-= mouse_cursor.get_height() / 2    #計(jì)算光標(biāo)的左上角位置    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()    #刷新一下畫面

今天除了將程序方法改成了面向?qū)ο笠酝猓旧弦矝]有多講什么。

現(xiàn)在,飛機(jī)只有一架,子彈只有一發(fā),敵機(jī)也只有一架,感覺不出面向?qū)ο蟮耐Γ?dāng)它數(shù)目多起來時,你會覺得面向?qū)ο蟮某橄蟮拇_很省事。

明天我就來給出我的多架飛機(jī)的方法。


由于我最近事情比較多,這個更新也寫的很拖沓,每天只講了一點(diǎn)點(diǎn)。對于每天在試著做的人來講是太慢了。不過我每天都會堅(jiān)持更新,直到把這個游戲搭建起來。

覺得我講的慢的朋友,有兩個方法,一是自己試著查一些資料,二是先不管我的更新,一周以后再看,到時候就可以看到比較多的變化。

最近比較忙,沒辦法一氣呵成,不好意思了。

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 手游| 土默特右旗| 于都县| 北京市| 延川县| 新昌县| 南木林县| 旬阳县| 论坛| 翁源县| 龙川县| 汽车| 蓝山县| 鹿泉市| 白银市| 随州市| 龙海市| 临汾市| 梁河县| 丰县| 眉山市| 鄂尔多斯市| 突泉县| 吕梁市| 鹤岗市| 九龙县| 西平县| 桂平市| 丹棱县| 商丘市| 上林县| 郸城县| 房山区| 阳信县| 浙江省| 孝昌县| 贵港市| 偃师市| 大洼县| 安塞县| 广昌县|