如何用Pygame寫遊戲(十八)

2021-08-21 17:18:59 字數 3141 閱讀 1300

本文**:

3d是非常酷的技術,同時也就意味著更多的工作,上次的簡單介紹之後,這次還要講更多2d到3d的新概念。

我們使用vector3類來進行3d上的移動,與2d非常類似,看下面乙個例子:

***a在(-6, 2, 2)的位置上,目標是***b(7, 5, 10),a想摧毀b,所以發**一枚火箭ab,現在我們得把火箭的運動軌跡過程給畫出來,否則一點發射敵機就炸了,多沒意思啊~~ 通過計算出兩者之間的向量為(13, 3, 8),然後單位化這個向量,這樣就可以在運動中用到了,下面的**做了這些事情。

from gameobjects.vector3 

import *

a = (–

6, 2,

2)b = (

7, 5,

10)plasma_speed =

100.

# meters per second

ab = vector3.from_points(a, b)

print

「vector to droid is」, ab

distance_to_target = ab.get_magnitude()

print

「distance to droid is」, distance_to_target,

「meters」

plasma_heading = ab.get_normalized()

print

「heading is」, plasma_heading

#######輸出結果#########

vector to droid

is (

13,

3, 8)

distance to droid

is15.5563491861 meters

heading

is (

0.835672,

0.192847,

0.514259)

然後不停的重繪火箭的位置,用這個語句:

rocket_location += heading * time_passed_seconds * speed

不過我們還不能直接在pygame中繪製3d物體,得先學習一下下面講的,「如何把3d轉換為2d」。

如果您初中美術認真學了的話,應該會知道這裡要講什麼,還記得當初我們是如何在紙上畫立方體的?

忘了?ok,從頭開始說起吧,儲存、計算3d座標是非常容易的,但是要把它展現到螢幕上就不那麼簡單了,因為pygame中所有的繪圖函式都只接受2d座標,因此,我們必須把這些3d的座標投影到2d的圖面上。

平行投影

最簡單的投影方法是——把第三個座標z座標給丟棄,用這樣的乙個簡單的函式就可以做到:

立體投影

與上乙個轉換函式不同的是,這個轉換函式還接受乙個d引數(後面討論),然後所有的x、y座標都會接受這個d的洗禮,同時z也會插一腳,把原本的座標進行縮放。

d的意思是視距(viewing distance),也就是攝像頭到3d世界物體在螢幕上的畫素體現之間的距離。比如說,乙個在(10, 5, 100)的物體移動到了(11, 5, 100),視距是100的時候,它在螢幕上就剛好移動了1個畫素,但如果它的z不是100,或者視距不是100,那麼可能移動距離就不再是1個畫素的距離。有些抽象,不過玩過3d遊戲的話(這裡指國外的3d大作),都有一種滾輪調節遠近的功能,這就是視距(當然調的時候視野也會變化,這個下面說)。

在我們玩遊戲的時候,視距就為我們的眼睛到螢幕的直線距離(以畫素為單位)。

視野那麼我們怎麼選取乙個好的d呢?我們當然可以不斷調整實驗來得到乙個,不過我們還可以通過視野(field of view)來計算乙個出來。視野也就是在乙個時刻能看到的角度。看一下左圖的視野和視距的關係,可以看到兩者是有制約關係,當視野角度(fov)增大的時候,d就會減小;而d增加的話,視野角度就會減小,能看到的東西也就變少了。

視野是決定在3d畫面上展現多少東西的絕好**,然後我們還需要乙個d來決定透視深度,使用一點點三角只是,我們就可以從fov計算出d,寫一下下面的**學習學習:

在internet上,你總是能找到99%以上的需要的別人寫好的**。不過偶爾還是要自己寫一下的,不用擔心自己的數學是不及格的,這個很簡單~ 很多時候實際動手試一下,你就能明白更多。

from math 

import tan

defcalculate_viewing_distance

(fov, screen_width):

d = (screen_width/

2.0) / tan(fov/

2.0)

return d

fov角度可能取45~60°比較合適,這樣看起來很自然。當然每個人每個遊戲都有特別的地方,比如fps的話,fov可能比較大;而策略性遊戲的fov角度會比較小,這樣可以看到更多的東西。很多時候還需要不停的變化fov,最明顯的cs中的狙擊槍(從沒玩過,不過聽過),開出來和關掉是完全不同的效果,改的就是視野角度。

今天又是補充了一大堆知識,等不及了吧~我們下一章就能看到乙個用pygame畫就的3d世界了!

Python學習模組 Pygame寫遊戲

第乙個例項程式 建立 main game.py 一張背景 001.jpg 一張跟隨滑鼠!初始化pygame,為使用硬體做準備 pygame.init 建立乙個視窗 screen pygame.display.set mode 640,480 0,32 設定視窗標題 pygame.display.se...

用Python和Pygame寫遊戲 入門

windows7 下安裝pygame 安裝好,可以用下面的方法確認有沒有安裝成功 import pygame print pygame.ver 2.新的hello world coding utf 8 背景 游標 mouse image filename fugu.png import pygame...

初學Python和pygame寫小遊戲

alien.py 外星人的類,負責外星人的載入 位置 繪製和更新等屬性。alien invasion.py 主函式。bullet.py 對子彈進行管理的類,負責子彈的繪製 更新。button.py 按鈕類,繪製play按鈕。game function.py 包含實現各種操作所需的函式。game da...