最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python寫(xiě)飛機(jī)大戰(zhàn)游戲之pygame入門(mén)(4):獲取鼠標(biāo)的位置及運(yùn)動(dòng)

 更新時(shí)間:2015年11月05日 15:39:10   投稿:mrr  
這篇文章主要介紹了用Python寫(xiě)飛機(jī)大戰(zhàn)游戲之pygame入門(mén)(4):獲取鼠標(biāo)的位置及運(yùn)動(dòng),需要的朋友可以參考下

目標(biāo)是拷貝微信的飛機(jī)大戰(zhàn),當(dāng)然拷貝完以后大家就具備自己添加不同內(nèi)容的能力了。

首先是要拿到一些圖片素材,熟悉使用圖像處理軟件和繪畫(huà)的人可以自己制作,并沒(méi)有這項(xiàng)技能的同學(xué)只能和我一樣從網(wǎng)上下載相應(yīng)的素材了。

網(wǎng)上可以找到相應(yīng)的這樣的圖片,注意,所有的元件圖片要是png類型的圖片,那樣可以有透明的背景,否則會(huì)有白色的邊框露出來(lái)。

找到素材以后我們就要開(kāi)始搭建我們的飛機(jī)大戰(zhàn)了。

微信上的飛機(jī)大戰(zhàn)是由手指控制的,在電腦上,我們就先用鼠標(biāo)代替了。

按照之前我們?cè)谔炜丈弦苿?dòng)云的那個(gè)程序,我們可以知道該怎么做。

無(wú)非是將背景和前景換一下。代碼如下:

# -*- coding: utf8 -*-
background_image_filename = 'background.png'
mouse_image_filename = 'hero.png'
#指定圖像文件名稱
import pygame #導(dǎo)入pygame庫(kù)
from sys import exit #向sys模塊借一個(gè)exit函數(shù)用來(lái)退出程序
pygame.init() #初始化pygame,為使用硬件做準(zhǔn)備
screen = pygame.display.set_mode((480, 650), 0, 32)
#創(chuàng)建了一個(gè)窗口
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))
  #將背景圖畫(huà)上去
  x, y = pygame.mouse.get_pos()
  #獲得鼠標(biāo)位置
  x-= mouse_cursor.get_width() / 2
  y-= mouse_cursor.get_height() / 2
  #計(jì)算光標(biāo)的左上角位置
  screen.blit(mouse_cursor, (x, y))
  #把光標(biāo)畫(huà)上去
  pygame.display.update()
  #刷新一下畫(huà)面

顯示結(jié)果就會(huì)如下:

上次沒(méi)有說(shuō)明鼠標(biāo)圖片跟隨鼠標(biāo)位置的具體說(shuō)法,這里說(shuō)明一下,用pygame.mouse.get_pos()可以得到一個(gè)鼠標(biāo)的當(dāng)前坐標(biāo)位置的元組,將這個(gè)值賦值給x, y ,之后可以用它方便調(diào)用,但是如果我們直接用這個(gè)量,圖片將會(huì)出現(xiàn)在鼠標(biāo)的右下角,這是圖片的坐標(biāo)系決定的。如果我們想讓它鼠標(biāo)在圖片中心,必須讓鼠標(biāo)坐標(biāo)和圖片中心對(duì)齊。對(duì)于任何一個(gè)Surface對(duì)象,可以用get_width(), get_height()和gei_size()對(duì)象,來(lái)獲得它的尺寸,這樣我們就可以將鼠標(biāo)中點(diǎn)和圖像尺寸對(duì)齊。

當(dāng)然,美中不足的是鼠標(biāo)本身出現(xiàn)在了游戲上,可能看起來(lái)不是那么和諧,可以通過(guò)pygame.mouse.set_visible(False)來(lái)設(shè)置鼠標(biāo)的可見(jiàn)性。把這一句加入程序就可以隱藏鼠標(biāo)。

好的,我們完成了一個(gè)部分,飛機(jī)可以顯示在了屏幕上并能自由移動(dòng),但是,這個(gè)移動(dòng)是完全由我們移動(dòng)的,那些自己移動(dòng)的飛機(jī)和子彈又是怎么做到移動(dòng)的呢?

我們現(xiàn)在知道游戲的動(dòng)畫(huà)本質(zhì)是由一張張圖的變化而來(lái)的,子彈的運(yùn)動(dòng)也是這樣,我們需要它每一幅圖比上一幅圖都向前多移動(dòng)一點(diǎn),這樣就可以實(shí)現(xiàn)子彈的移動(dòng)。

我們用總結(jié)一下子彈的特點(diǎn):

1、子彈從飛機(jī)前端射出,發(fā)射的坐標(biāo)應(yīng)該是鼠標(biāo)所在的位置。

2、每一幀子彈都向前多移動(dòng)一些。

3、子彈飛出屏幕底部時(shí),不再處理該子彈。(這里我用一個(gè)技巧,讓子彈重新回到鼠標(biāo)所在的位置)

4、為了使子彈從飛機(jī)下面飛出去,我們需要先繪制子彈,再在上面繪制飛機(jī)。

子彈有這樣三個(gè)特點(diǎn),根據(jù)這三個(gè)特點(diǎn),可以寫(xiě)出它的代碼:

# -*- coding: utf8 -*-
background_image_filename = 'background.png'
mouse_image_filename = 'hero.png'
bullet_image_filename = 'bullet.png'
#指定圖像文件名稱
import pygame #導(dǎo)入pygame庫(kù)
from sys import exit #向sys模塊借一個(gè)exit函數(shù)用來(lái)退出程序
pygame.init() #初始化pygame,為使用硬件做準(zhǔn)備
screen = pygame.display.set_mode((480, 650), 0, 32)
#創(chuàng)建了一個(gè)窗口
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))
  #將背景圖畫(huà)上去
  x, y = pygame.mouse.get_pos()
  #獲得鼠標(biāo)位置
  if bullet_y < -1 : #移動(dòng)子彈
    bullet_x, bullet_y = x, y
  else:
    bullet_y -= 1
  x-= mouse_cursor.get_width() / 2
  y-= mouse_cursor.get_height() / 2
  #計(jì)算光標(biāo)的左上角位置
  screen.blit(bullet, (bullet_x, bullet_y))
  screen.blit(mouse_cursor, (x, y))
  #把光標(biāo)畫(huà)上去
  pygame.display.update()
  #刷新一下畫(huà)面

可以得到這樣的效果:

子彈會(huì)從飛機(jī)打出,到屏幕頂端時(shí)就會(huì)重置。

上面的代碼似乎是解決了子彈運(yùn)動(dòng)的問(wèn)題,如此而來(lái),敵機(jī)的運(yùn)動(dòng)也顯得非常的簡(jiǎn)單。暫時(shí)不講具體顯示敵機(jī)的代碼,讓大家思考。

可其實(shí)有一個(gè)很容易發(fā)現(xiàn)的問(wèn)題,那就是每一臺(tái)機(jī)器的處理速度不一樣,雖然每次循環(huán)時(shí)都讓坐標(biāo)自減一,實(shí)際上,還是有很大的差別的,處理速度快的機(jī)器可能一秒鐘處理一千次循環(huán),而處理慢的機(jī)器可能才30次循環(huán),兩臺(tái)機(jī)器看到的動(dòng)畫(huà)幀率完全不同,子彈速度也完全不同,這應(yīng)該怎么處理呢?

還好pygame早就幫我們做好了這一點(diǎn),我們只需要這么去做就可以讓所有的機(jī)子都有同樣的速度。

pygame.time模塊給我們提供了一個(gè)Clock()對(duì)象,讓我們輕易做到控制幀率:

clock = pygame.time.Clock()
time_passed = clock.tick()
time_passed = clock.tick(50)

第一行初始化了一個(gè)Cloc對(duì)象,第二行返回了一個(gè)從上一次到現(xiàn)在調(diào)用的時(shí)間(毫秒計(jì)的單位),第三行就是控制幀率的好辦法了。在每一次循環(huán)過(guò)程中加上它,在clock.tick()里加入?yún)?shù),代表了你設(shè)定的最大幀率,你的畫(huà)面的最大幀率就是你寫(xiě)的值,當(dāng)然,有的時(shí)候動(dòng)畫(huà)過(guò)于復(fù)雜,它可能沒(méi)辦法到達(dá)這個(gè)幀率,那時(shí)我們需要?jiǎng)e的優(yōu)化方式。那么怎么保證控制的勻速呢?

將上面的代碼再一次變化:

# -*- coding: utf8 -*-
background_image_filename = 'background.png'
mouse_image_filename = 'hero.png'
bullet_image_filename = 'bullet.png'
#指定圖像文件名稱
import pygame #導(dǎo)入pygame庫(kù)
from sys import exit #向sys模塊借一個(gè)exit函數(shù)用來(lái)退出程序
pygame.init() #初始化pygame,為使用硬件做準(zhǔn)備
screen = pygame.display.set_mode((480, 650), 0, 32)
#創(chuàng)建了一個(gè)窗口
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))
  #將背景圖畫(huà)上去
  x, y = pygame.mouse.get_pos()
  #獲得鼠標(biāo)位置
  if bullet_y < -1 : #移動(dòng)子彈
    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
  #計(jì)算光標(biāo)的左上角位置
  screen.blit(bullet, (bullet_x, bullet_y))
  screen.blit(mouse_cursor, (x, y))
  #把光標(biāo)畫(huà)上去
  pygame.display.update()
  #刷新一下畫(huà)面

我比較懶,直接貼了全部的代碼。。。

這里面,我們每次讀取了經(jīng)過(guò)的時(shí)間,然后根據(jù)每次經(jīng)過(guò)的時(shí)間不同,乘以速度系數(shù)來(lái)得到應(yīng)該變化多少位移。用這種方法調(diào)整的動(dòng)畫(huà),在不同的電腦上都有相同的顯示。

敵機(jī)怎么顯示,看大家怎么做了。明天繼續(xù)講,關(guān)于敵機(jī)的顯示和隨機(jī)性。

相關(guān)文章

  • Python安裝本地.whl文件的流程及注意事項(xiàng)

    Python安裝本地.whl文件的流程及注意事項(xiàng)

    在Python的生態(tài)環(huán)境中.whl文件是一種預(yù)編譯的二進(jìn)制包,用于分發(fā)和安裝Python庫(kù),這篇文章主要給大家介紹了關(guān)于Python安裝本地.whl文件的流程及注意事項(xiàng),文中講解了下載文件、安裝pip、使用pip安裝whl文件、驗(yàn)證安裝以及注意事項(xiàng),需要的朋友可以參考下
    2024-11-11
  • Python中使用conda?install還是pip?install好

    Python中使用conda?install還是pip?install好

    這篇文章主要給大家介紹了關(guān)于Python中使用conda?install還是pip?install好的相關(guān)資料,conda install 和 pip install 都是Python的包管理工具,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Python開(kāi)發(fā)游戲自動(dòng)化后臺(tái)腳本的實(shí)現(xiàn)

    Python開(kāi)發(fā)游戲自動(dòng)化后臺(tái)腳本的實(shí)現(xiàn)

    本文主要介紹了Python開(kāi)發(fā)游戲自動(dòng)化后臺(tái)腳本的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 利用python中pymysql操作MySQL數(shù)據(jù)庫(kù)的新手指南

    利用python中pymysql操作MySQL數(shù)據(jù)庫(kù)的新手指南

    PyMySQL是在Python3.x版本中用于連接MySQL服務(wù)器的一個(gè)庫(kù),Python2中是使用mysqldb,這篇文章主要給大家介紹了關(guān)于利用python中pymysql操作MySQL數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • pyside+pyqt實(shí)現(xiàn)鼠標(biāo)右鍵菜單功能

    pyside+pyqt實(shí)現(xiàn)鼠標(biāo)右鍵菜單功能

    這篇文章主要為大家詳細(xì)介紹了pyside+pyqt實(shí)現(xiàn)鼠標(biāo)右鍵菜單功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Django定時(shí)任務(wù)Django-crontab的使用詳解

    Django定時(shí)任務(wù)Django-crontab的使用詳解

    測(cè)試平臺(tái)執(zhí)行測(cè)試用例時(shí),可以借助jenkins之類的CI/CD工具,也可以使用定時(shí)任務(wù)crontab,作為測(cè)試開(kāi)發(fā)工程師,我們可能沒(méi)有權(quán)限去操作服務(wù)器,那么我們就只能使用django-crontab,在指定時(shí)間循環(huán)執(zhí)行測(cè)試用例,對(duì)定時(shí)任務(wù)Django-crontab的使用感興趣的朋友一起看看吧
    2022-07-07
  • Python中使用scapy模擬數(shù)據(jù)包實(shí)現(xiàn)arp攻擊、dns放大攻擊例子

    Python中使用scapy模擬數(shù)據(jù)包實(shí)現(xiàn)arp攻擊、dns放大攻擊例子

    這篇文章主要介紹了Python中使用scapy模擬數(shù)據(jù)包實(shí)現(xiàn)arp攻擊、dns放大攻擊例子,本文重點(diǎn)在于scapy有使用上,需要的朋友可以參考下
    2014-10-10
  • Python繪制正二十面體圖形示例

    Python繪制正二十面體圖形示例

    正二十面體由20個(gè)小的正三角形面組成,每個(gè)頂點(diǎn)周?chē)?5?個(gè)頂點(diǎn),下面這篇文章主要給大家介紹了關(guān)于Python繪制正二十面體圖形的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Pickle模塊中的dump()和load()方法簡(jiǎn)介

    Pickle模塊中的dump()和load()方法簡(jiǎn)介

    Pickle模塊實(shí)現(xiàn)了基本的數(shù)據(jù)序列化與反序列化操作,通過(guò)序列化操作,我們可以將程序中運(yùn)行的對(duì)象信息轉(zhuǎn)化為字節(jié)流保存到文件中去,永久存儲(chǔ)在磁盤(pán)上,這篇文章主要介紹了Pickle模塊中的dump()和load()方法介紹,需要的朋友可以參考下
    2023-03-03
  • Python同步遍歷多個(gè)列表的示例

    Python同步遍歷多個(gè)列表的示例

    今天小編就為大家分享一篇Python同步遍歷多個(gè)列表的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02

最新評(píng)論

武邑县| 上虞市| 包头市| 微山县| 桂平市| 高密市| 建始县| 团风县| 穆棱市| 南木林县| 绥中县| 冀州市| 阜平县| 富顺县| 分宜县| 邵武市| 泽库县| 乌拉特后旗| 竹山县| 山西省| 永安市| 辛集市| 平潭县| 万年县| 曲阜市| 阿坝| 巴里| 乐东| 汽车| 乌拉特前旗| 祁阳县| 潜江市| 金山区| 怀仁县| 山阳县| 山丹县| 蒲城县| 六枝特区| 台北县| 濮阳市| 崇仁县|