2015/11/4用Python寫遊戲,pygame入門(4):獲取鼠標的位置及運動

按昨天的說法,今天將開始作一個簡單的遊戲了。前端

目標是拷貝微信的飛機大戰,固然拷貝完之後你們就具有本身添加不一樣內容的能力了。微信

首先是要拿到一些圖片素材,熟悉使用圖像處理軟件和繪畫的人能夠本身製做,並無這項技能的同窗只能和我同樣從網上下載相應的素材了。函數

網上能夠找到相應的這樣的圖片,注意,全部的元件圖片要是png類型的圖片,那樣能夠有透明的背景,不然會有白色的邊框露出來。優化

 

找到素材之後咱們就要開始搭建咱們的飛機大戰了。動畫

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

按照以前咱們在天空上移動雲的那個程序,咱們能夠知道該怎麼作。spa

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

# -*- 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()
    #刷新一下畫面

顯示結果就會以下:對象

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

固然,美中不足的是鼠標自己出如今了遊戲上,可能看起來不是那麼和諧,能夠經過pygame.mouse.set_visible(False)來設置鼠標的可見性。把這一句加入程序就能夠隱藏鼠標。

好的,咱們完成了一個部分,飛機能夠顯示在了屏幕上並能自由移動,可是,這個移動是徹底由咱們移動的,那些本身移動的飛機和子彈又是怎麼作到移動的呢?


咱們如今知道遊戲的動畫本質是由一張張圖的變化而來的,子彈的運動也是這樣,咱們須要它每一幅圖比上一幅圖都向前多移動一點,這樣就能夠實現子彈的移動。

咱們用總結一會兒彈的特色:

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

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

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

四、爲了使子彈從飛機下面飛出去,咱們須要先繪製子彈,再在上面繪製飛機。

子彈有這樣三個特色,根據這三個特色,能夠寫出它的代碼:

# -*- 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()
    #刷新一下畫面

能夠獲得這樣的效果:

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


上面的代碼彷佛是解決了子彈運動的問題,如此而來,敵機的運動也顯得很是的簡單。暫時不講具體顯示敵機的代碼,讓你們思考。

可其實有一個很容易發現的問題,那就是每一臺機器的處理速度不同,雖然每次循環時都讓座標自減一,實際上,仍是有很大的差異的,處理速度快的機器可能一秒鐘處理一千次循環,而處理慢的機器可能才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()
    #刷新一下畫面

我比較懶,直接貼了所有的代碼。。。

這裏面,咱們每次讀取了通過的時間,而後根據每次通過的時間不一樣,乘以速度係數來獲得應該變化多少位移。用這種方法調整的動畫,在不一樣的電腦上都有相同的顯示。

敵機怎麼顯示,看你們怎麼作了。明天繼續講,關於敵機的顯示和隨機性。

相關文章
相關標籤/搜索