用Python寫飛機(jī)大戰(zhàn)游戲之pygame入門(4):獲取鼠標(biāo)的位置及運動
目標(biāo)是拷貝微信的飛機(jī)大戰(zhàn),當(dāng)然拷貝完以后大家就具備自己添加不同內(nèi)容的能力了。
首先是要拿到一些圖片素材,熟悉使用圖像處理軟件和繪畫的人可以自己制作,并沒有這項技能的同學(xué)只能和我一樣從網(wǎng)上下載相應(yīng)的素材了。
網(wǎng)上可以找到相應(yīng)的這樣的圖片,注意,所有的元件圖片要是png類型的圖片,那樣可以有透明的背景,否則會有白色的邊框露出來。
找到素材以后我們就要開始搭建我們的飛機(jī)大戰(zhàn)了。
微信上的飛機(jī)大戰(zhàn)是由手指控制的,在電腦上,我們就先用鼠標(biāo)代替了。
按照之前我們在天空上移動云的那個程序,我們可以知道該怎么做。
無非是將背景和前景換一下。代碼如下:
# -*- coding: utf8 -*- background_image_filename = 'background.png' mouse_image_filename = 'hero.png' #指定圖像文件名稱 import pygame #導(dǎo)入pygame庫 from sys import exit #向sys模塊借一個exit函數(shù)用來退出程序 pygame.init() #初始化pygame,為使用硬件做準(zhǔn)備 screen = pygame.display.set_mode((480, 650), 0, 32) #創(chuàng)建了一個窗口 pygame.display.set_caption("PlaneFight!") #設(shè)置窗口標(biāo)題 background = pygame.image.load(background_image_filename).convert() mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha() #加載并轉(zhuǎn)換圖像 while True: #游戲主循環(huán) for event in pygame.event.get(): if event.type == pygame.QUIT: #接收到退出事件后退出程序 pygame.quit() exit() screen.blit(background, (0,0)) #將背景圖畫上去 x, y = pygame.mouse.get_pos() #獲得鼠標(biāo)位置 x-= mouse_cursor.get_width() / 2 y-= mouse_cursor.get_height() / 2 #計算光標(biāo)的左上角位置 screen.blit(mouse_cursor, (x, y)) #把光標(biāo)畫上去 pygame.display.update() #刷新一下畫面
顯示結(jié)果就會如下:
上次沒有說明鼠標(biāo)圖片跟隨鼠標(biāo)位置的具體說法,這里說明一下,用pygame.mouse.get_pos()可以得到一個鼠標(biāo)的當(dāng)前坐標(biāo)位置的元組,將這個值賦值給x, y ,之后可以用它方便調(diào)用,但是如果我們直接用這個量,圖片將會出現(xiàn)在鼠標(biāo)的右下角,這是圖片的坐標(biāo)系決定的。如果我們想讓它鼠標(biāo)在圖片中心,必須讓鼠標(biāo)坐標(biāo)和圖片中心對齊。對于任何一個Surface對象,可以用get_width(), get_height()和gei_size()對象,來獲得它的尺寸,這樣我們就可以將鼠標(biāo)中點和圖像尺寸對齊。
當(dāng)然,美中不足的是鼠標(biāo)本身出現(xiàn)在了游戲上,可能看起來不是那么和諧,可以通過pygame.mouse.set_visible(False)來設(shè)置鼠標(biāo)的可見性。把這一句加入程序就可以隱藏鼠標(biāo)。
好的,我們完成了一個部分,飛機(jī)可以顯示在了屏幕上并能自由移動,但是,這個移動是完全由我們移動的,那些自己移動的飛機(jī)和子彈又是怎么做到移動的呢?
我們現(xiàn)在知道游戲的動畫本質(zhì)是由一張張圖的變化而來的,子彈的運動也是這樣,我們需要它每一幅圖比上一幅圖都向前多移動一點,這樣就可以實現(xiàn)子彈的移動。
我們用總結(jié)一下子彈的特點:
1、子彈從飛機(jī)前端射出,發(fā)射的坐標(biāo)應(yīng)該是鼠標(biāo)所在的位置。
2、每一幀子彈都向前多移動一些。
3、子彈飛出屏幕底部時,不再處理該子彈。(這里我用一個技巧,讓子彈重新回到鼠標(biāo)所在的位置)
4、為了使子彈從飛機(jī)下面飛出去,我們需要先繪制子彈,再在上面繪制飛機(jī)。
子彈有這樣三個特點,根據(jù)這三個特點,可以寫出它的代碼:
# -*- 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ù)用來退出程序 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() bullet = pygame.image.load(bullet_image_filename).convert_alpha() #加載并轉(zhuǎn)換圖像 bullet_x, bullet_y = 0, -100 #初始化子彈坐標(biāo) while True: #游戲主循環(huán) for event in pygame.event.get(): if event.type == pygame.QUIT: #接收到退出事件后退出程序 pygame.quit() exit() screen.blit(background, (0,0)) #將背景圖畫上去 x, y = pygame.mouse.get_pos() #獲得鼠標(biāo)位置 if bullet_y < -1 : #移動子彈 bullet_x, bullet_y = x, y else: bullet_y -= 1 x-= mouse_cursor.get_width() / 2 y-= mouse_cursor.get_height() / 2 #計算光標(biāo)的左上角位置 screen.blit(bullet, (bullet_x, bullet_y)) screen.blit(mouse_cursor, (x, y)) #把光標(biāo)畫上去 pygame.display.update() #刷新一下畫面
可以得到這樣的效果:
子彈會從飛機(jī)打出,到屏幕頂端時就會重置。
上面的代碼似乎是解決了子彈運動的問題,如此而來,敵機(jī)的運動也顯得非常的簡單。暫時不講具體顯示敵機(jī)的代碼,讓大家思考。
可其實有一個很容易發(fā)現(xiàn)的問題,那就是每一臺機(jī)器的處理速度不一樣,雖然每次循環(huán)時都讓坐標(biāo)自減一,實際上,還是有很大的差別的,處理速度快的機(jī)器可能一秒鐘處理一千次循環(huán),而處理慢的機(jī)器可能才30次循環(huán),兩臺機(jī)器看到的動畫幀率完全不同,子彈速度也完全不同,這應(yīng)該怎么處理呢?
還好pygame早就幫我們做好了這一點,我們只需要這么去做就可以讓所有的機(jī)子都有同樣的速度。
pygame.time模塊給我們提供了一個Clock()對象,讓我們輕易做到控制幀率:
clock = pygame.time.Clock()
time_passed = clock.tick()
time_passed = clock.tick(50)
第一行初始化了一個Cloc對象,第二行返回了一個從上一次到現(xiàn)在調(diào)用的時間(毫秒計的單位),第三行就是控制幀率的好辦法了。在每一次循環(huán)過程中加上它,在clock.tick()里加入?yún)?shù),代表了你設(shè)定的最大幀率,你的畫面的最大幀率就是你寫的值,當(dāng)然,有的時候動畫過于復(fù)雜,它可能沒辦法到達(dá)這個幀率,那時我們需要別的優(yōu)化方式。那么怎么保證控制的勻速呢?
將上面的代碼再一次變化:
# -*- 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ù)用來退出程序 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() bullet = pygame.image.load(bullet_image_filename).convert_alpha() #加載并轉(zhuǎn)換圖像 bullet_x, bullet_y = 0, -100 #初始化子彈坐標(biāo) bullet_speed = 600 #初始化子彈速度 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)位置 if bullet_y < -1 : #移動子彈 bullet_x, bullet_y = x, y else: bullet_y -= time_passed_second * bullet_speed x-= mouse_cursor.get_width() / 2 y-= mouse_cursor.get_height() / 2 #計算光標(biāo)的左上角位置 screen.blit(bullet, (bullet_x, bullet_y)) screen.blit(mouse_cursor, (x, y)) #把光標(biāo)畫上去 pygame.display.update() #刷新一下畫面
我比較懶,直接貼了全部的代碼。。。
這里面,我們每次讀取了經(jīng)過的時間,然后根據(jù)每次經(jīng)過的時間不同,乘以速度系數(shù)來得到應(yīng)該變化多少位移。用這種方法調(diào)整的動畫,在不同的電腦上都有相同的顯示。
敵機(jī)怎么顯示,看大家怎么做了。明天繼續(xù)講,關(guān)于敵機(jī)的顯示和隨機(jī)性。
- python版飛機(jī)大戰(zhàn)代碼分享
- python實現(xiàn)飛機(jī)大戰(zhàn)
- python實現(xiàn)飛機(jī)大戰(zhàn)小游戲
- python實現(xiàn)飛機(jī)大戰(zhàn)游戲(pygame版)
- python pygame模塊編寫飛機(jī)大戰(zhàn)
- python飛機(jī)大戰(zhàn)pygame碰撞檢測實現(xiàn)方法分析
- python實現(xiàn)飛機(jī)大戰(zhàn)游戲
- 使用python實現(xiàn)飛機(jī)大戰(zhàn)游戲
- python實現(xiàn)飛機(jī)大戰(zhàn)項目
- python實現(xiàn)簡單飛機(jī)大戰(zhàn)小游戲
相關(guān)文章
python使用arp欺騙偽造網(wǎng)關(guān)的方法
這篇文章主要介紹了python使用arp欺騙偽造網(wǎng)關(guān)的方法,涉及Python偽造網(wǎng)關(guān)的相關(guān)技巧,需要的朋友可以參考下2015-04-04Python腳本簡單實現(xiàn)打開默認(rèn)瀏覽器登錄人人和打開QQ的方法
這篇文章主要介紹了Python腳本簡單實現(xiàn)打開默認(rèn)瀏覽器登錄人人和打開QQ的方法,涉及Python針對瀏覽器及應(yīng)用程序的相關(guān)操作技巧,代碼非常簡單實用,需要的朋友可以參考下2016-04-04c++生成dll使用python調(diào)用dll的方法
這篇文章主要介紹了使用c++為python寫dll庫的方法,開發(fā)環(huán)境是VS2013+Python3.3,vs2013寫cpp的dll擴(kuò)展,然后用python3.3解釋執(zhí)行。下面看詳細(xì)步驟吧2014-01-01Python 實現(xiàn)圖片色彩轉(zhuǎn)換案例
我們在看動漫、影視作品中,當(dāng)人物在回憶過程中,體現(xiàn)出來的畫面一般都是黑白或者褐色的。本文將提供將圖片色彩轉(zhuǎn)為黑白或者褐色風(fēng)格的案例詳解,感興趣的小伙伴可以了解一下。2021-11-11淺談使用Python內(nèi)置函數(shù)getattr實現(xiàn)分發(fā)模式
這篇文章主要介紹了淺談使用Python內(nèi)置函數(shù)getattr實現(xiàn)分發(fā)模式,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01python中websockets與主線程傳遞參數(shù)的實現(xiàn)
本文主要介紹了python中websockets與主線程傳遞參數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02