欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

用Python寫飛機大戰游戲之pygame入門(4):獲取鼠標的位置及運動

系統 2159 0

目標是拷貝微信的飛機大戰,當然拷貝完以后大家就具備自己添加不同內容的能力了。

首先是要拿到一些圖片素材,熟悉使用圖像處理軟件和繪畫的人可以自己制作,并沒有這項技能的同學只能和我一樣從網上下載相應的素材了。

用Python寫飛機大戰游戲之pygame入門(4):獲取鼠標的位置及運動_第1張圖片

網上可以找到相應的這樣的圖片,注意,所有的元件圖片要是png類型的圖片,那樣可以有透明的背景,否則會有白色的邊框露出來。

找到素材以后我們就要開始搭建我們的飛機大戰了。

微信上的飛機大戰是由手指控制的,在電腦上,我們就先用鼠標代替了。

按照之前我們在天空上移動云的那個程序,我們可以知道該怎么做。

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

            
# -*- coding: utf8 -*-
background_image_filename = 'background.png'
mouse_image_filename = 'hero.png'
#指定圖像文件名稱
import pygame #導入pygame庫
from sys import exit #向sys模塊借一個exit函數用來退出程序
pygame.init() #初始化pygame,為使用硬件做準備
screen = pygame.display.set_mode((480, 650), 0, 32)
#創建了一個窗口
pygame.display.set_caption("PlaneFight!")
#設置窗口標題
background = pygame.image.load(background_image_filename).convert()
mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
#加載并轉換圖像
while True:
#游戲主循環
  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()
  #獲得鼠標位置
  x-= mouse_cursor.get_width() / 2
  y-= mouse_cursor.get_height() / 2
  #計算光標的左上角位置
  screen.blit(mouse_cursor, (x, y))
  #把光標畫上去
  pygame.display.update()
  #刷新一下畫面
          

顯示結果就會如下:

用Python寫飛機大戰游戲之pygame入門(4):獲取鼠標的位置及運動_第2張圖片

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

當然,美中不足的是鼠標本身出現在了游戲上,可能看起來不是那么和諧,可以通過pygame.mouse.set_visible(False)來設置鼠標的可見性。把這一句加入程序就可以隱藏鼠標。

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

我們現在知道游戲的動畫本質是由一張張圖的變化而來的,子彈的運動也是這樣,我們需要它每一幅圖比上一幅圖都向前多移動一點,這樣就可以實現子彈的移動。

我們用總結一下子彈的特點:

1、子彈從飛機前端射出,發射的坐標應該是鼠標所在的位置。

2、每一幀子彈都向前多移動一些。

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

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

子彈有這樣三個特點,根據這三個特點,可以寫出它的代碼:

            
# -*- 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函數用來退出程序
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 = pygame.image.load(bullet_image_filename).convert_alpha()
#加載并轉換圖像
bullet_x, bullet_y = 0, -100 #初始化子彈坐標
while True:
#游戲主循環
  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()
  #獲得鼠標位置
  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
  #計算光標的左上角位置
  screen.blit(bullet, (bullet_x, bullet_y))
  screen.blit(mouse_cursor, (x, y))
  #把光標畫上去
  pygame.display.update()
  #刷新一下畫面
          

可以得到這樣的效果:

用Python寫飛機大戰游戲之pygame入門(4):獲取鼠標的位置及運動_第3張圖片

子彈會從飛機打出,到屏幕頂端時就會重置。

上面的代碼似乎是解決了子彈運動的問題,如此而來,敵機的運動也顯得非常的簡單。暫時不講具體顯示敵機的代碼,讓大家思考。

可其實有一個很容易發現的問題,那就是每一臺機器的處理速度不一樣,雖然每次循環時都讓坐標自減一,實際上,還是有很大的差別的,處理速度快的機器可能一秒鐘處理一千次循環,而處理慢的機器可能才30次循環,兩臺機器看到的動畫幀率完全不同,子彈速度也完全不同,這應該怎么處理呢?

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

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

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

第一行初始化了一個Cloc對象,第二行返回了一個從上一次到現在調用的時間(毫秒計的單位),第三行就是控制幀率的好辦法了。在每一次循環過程中加上它,在clock.tick()里加入參數,代表了你設定的最大幀率,你的畫面的最大幀率就是你寫的值,當然,有的時候動畫過于復雜,它可能沒辦法到達這個幀率,那時我們需要別的優化方式。那么怎么保證控制的勻速呢?

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

            
# -*- 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函數用來退出程序
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 = pygame.image.load(bullet_image_filename).convert_alpha()
#加載并轉換圖像
bullet_x, bullet_y = 0, -100 #初始化子彈坐標
bullet_speed = 600 #初始化子彈速度
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()
  #獲得鼠標位置
  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
  #計算光標的左上角位置
  screen.blit(bullet, (bullet_x, bullet_y))
  screen.blit(mouse_cursor, (x, y))
  #把光標畫上去
  pygame.display.update()
  #刷新一下畫面
          

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

這里面,我們每次讀取了經過的時間,然后根據每次經過的時間不同,乘以速度系數來得到應該變化多少位移。用這種方法調整的動畫,在不同的電腦上都有相同的顯示。

敵機怎么顯示,看大家怎么做了。明天繼續講,關于敵機的顯示和隨機性。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人国产精品齐天大性 | 尤物国产在线精品福利一区 | 免费视频片在线观看 | 日韩欧美天堂 | 日本不卡中文字幕一区二区 | 麻豆免费永久网址入口网址 | a免费国产一级特黄aa大 | 午夜视频直播 | 青娱乐伊人| 亚洲欧美v国产一区二区 | a久久| 国产欧美精品在线 | 偷拍亚洲制服另类无码专区 | 人人人人干 | 国内精品玖玖玖玖电影院 | 欧美高清一级片 | 四虎海外 | 成人免费视频观看视频 | 欧美99| 国产精品19禁在线观看2021 | 久久这里是精品 | 国产精品成人国产乱一区 | 亚洲欧美在线看 | 91影院| 久久婷婷色 | 美女久久久| 最新中文在线视频 | 福利视频网页 | 亚洲毛片无码专区亚洲A片 日本高清www午色夜黄 | 日本黄a三级三级三级 | 五月综合久久 | 欧美日韩国产网站 | 日韩在线观看中文 | 日本午夜免费无码片三汲大片 | 久久成人一区二区 | 亚洲性一区 | 国产在线视频网址 | 男女啪啪免费观看无遮挡动态图片 | 精品欧美一区二区三区久久久 | 青青草最新网址 | 欧美综合社区 |