網站后臺無上傳圖片按鈕免費申請網站com域名
無論如何,我們今天有一些調試工作要做,因為昨天做了一些修改,結果沒有時間進行調試和處理。我們知道自己還有一些需要解決的問題,卻沒有及時完成,所以我們想繼續(xù)進行這些調試。對我們來說,拖延調試工作總是很煩人。
一些論壇上的人已經猜測了可能存在的錯誤,他們的推測或許是對的,但我們并不確定。正如之前提到的,我們昨晚停下來了,沒能抽出時間來逐步調試,因此我們不清楚實際情況以及具體的錯誤在哪里。
修復 IsInRectangle 剪切/粘貼錯誤
有人報告了一個錯誤,肯定是一個問題,無論是不是我們自己引起的,但確實是個 bug。昨天在進行剪切和粘貼操作時,我們沒有檢查矩形三的 Z 坐標。這個問題顯而易見,但我們的數學庫可能還有很多問題。為了澄清,我們目前并不太關注這些 bugs,主要是想在架構方面做一些實驗,等一切都準備好之后,再進行更多的測試和修正。
當有問題被指出時,及時修復是很好的。這次問題是我們在處理矩形時沒有考慮 Z 坐標,尤其是在從二維變成三維時,矩形的維度發(fā)生了變化,導致了這個問題。其他的內容似乎并沒有太大變化,主要還是在潛在的向量處理上,沒有什么需要改動的地方。
修復 ChunkPositionFromTilePosition 錯誤
有一個錯誤被報告了,出現在世界代碼中。昨天的更改涉及到將所有操作轉換為三維,但在處理臨時世界構建時,我們使用了錯誤的坐標系統(tǒng)。具體來說,在計算瓷磚空間中的物體位置時,錯誤地使用了“ChunkDimInMeters”,而實際上應該使用“TileSideInMeters”。這種錯誤導致了世界變得更加稀疏,因為我們錯誤地將物體放置在了瓷磚邊界處,而現在沒有瓷磚的概念了。
此外,這個問題暴露了一個更深層次的錯誤,雖然這只是一個定位輔助工具,用來幫助我們在處理更復雜的世界時做一些瓷磚相關的操作,但它顯然是個 bug。幸運的是,大家在論壇上指出了這個問題,讓我們能夠修正它。通過這種方式,仿佛擁有了一大批代碼審查員,可以實時幫忙尋找并指出錯誤,這對調試過程來說是一個非常有價值的補充。
盡管修復了這些問題,我們不確定它們能否完全解決最初的問題。可能并不會完全修復,還需要進一步的檢查和修正。
調試 MapIntoChunkSpace 精度問題
出現了一個問題,似乎在更改代碼時,導致了地圖切分的錯誤。特別是,我們在將地圖坐標映射到大塊空間時,存在精度問題。當數字變得較大時,精度下降,導致難以準確確定物體應該位于哪個瓷磚或哪個大塊區(qū)域。這種問題本來是可以預料到的,尤其是在處理大規(guī)模世界構建時。
為了解決這個問題,未來我們可能會采用將世界分割成局部區(qū)域的策略,并在浮點坐標系統(tǒng)中進行處理。這樣,在構建較大的世界時,可以通過移動焦點來優(yōu)化處理,而不是讓世界變得過于龐大而難以管理。我們將繼續(xù)在本地坐標系下進行操作,并將整個區(qū)域移動到新的位置,以確保精度問題不會影響到整個世界的構建。
這意味著,我們的目標是能夠構建更大的世界,而不僅僅是將所有內容都放入一個浮點系統(tǒng)中,從而避免讓世界變得過于復雜或龐大。這個方法將使我們能夠處理更大、更復雜的虛擬世界。
目前,關于構建一個龐大的游戲世界,雖然我們面臨精度問題,但并不特別擔心。通過增加局部坐標原點附近的精度,我們希望能夠在將來解決這些問題,尤其是在不依賴大范圍世界構建的情況下。雖然當前存在一些問題,但我們計劃在未來通過調整epsilon值,使其趨近于零,避免這些問題影響最終效果。
我們遇到的一些錯誤,如世界構建時的精度問題,其實并不算嚴重。盡管地圖的計算誤差可能較大,但這并沒有阻止世界的繼續(xù)擴展。當前的錯誤主要是由于坐標范圍的擴大導致的精度損失。盡管如此,錯誤的程度并不會對整體結構產生根本性影響,仍然能夠順利進行其他方面的工作。
總的來說,這些問題雖然存在,但并不會阻止項目的繼續(xù)發(fā)展。將來,當世界構建逐步轉向局部坐標系統(tǒng)時,我們將能夠更加高效地處理這些問題,并確保游戲世界的質量。
調試跳過世界問題
目前,我們可以跳躍進入下一個層級并返回地面,但Z軸的處理存在一些問題,尚未完全正確。問題出現在跳躍時,雖然Z軸的加速度已經包括了重力(負9.8 m/s2),并與水平方向的運動方程一起計算,但跳躍的表現仍有些異常。
首先,跳躍的代碼應該在按下空格鍵時設置一個向上的速度,但跳躍的行為看起來并不像預期的那樣。雖然在處理Z軸時沒有出現明顯錯誤,我們仍然需要仔細檢查,可能是由于某些細節(jié)未完全調整好。
在跳躍過程中,如果角色跳得足夠高,可能會進入一個新的Z軸區(qū)間,導致角色未能回到地面。為了進一步解決這個問題,需要查看并調試代碼,特別是涉及Z軸運動方程和跳躍邏輯的部分。
總體來說,雖然有些異常情況出現,但問題并不嚴重,需要進一步檢查Z軸的跳躍和回歸地面的邏輯。
圖示跳躍到下一個更高的塊
在跳躍代碼的處理過程中,角色的Z軸位置是根據相對于相機的位置進行檢查的。當角色跳躍并超越當前的Z軸位置時,假設跳躍高度足夠,角色會進入下一個Z軸區(qū)間。然而,代碼僅檢查角色的Z軸位置是否小于零,而沒有檢測是否與其他物體發(fā)生碰撞,導致角色可以穿越平臺并繼續(xù)跳躍。
具體而言,跳躍的邏輯目前存在一個問題:由于代碼只判斷Z軸位置是否小于零來確定角色是否已經落地,這樣的檢查方式忽略了平臺間的相對位置,導致角色跳過平臺后并不會停在上面。實際上,跳躍的行為應該像平臺游戲一樣,角色能夠穿越上面的平臺,但落地時應該停在平臺上。
另外,關于相機的更新,當前的代碼似乎只使用了大塊Z來進行相機的跟蹤,而沒有進行完整的Z軸跟蹤。這可能是導致跳躍行為異常的原因之一。因此,調試需要首先集中在角色跳躍時Z軸行為的異常上,確認是否是由于相機跟蹤的處理不完全導致的問題。
發(fā)現問題!
問題的根本原因在于相機的Z軸跟蹤。之前,角色的Z軸位置與相機同步,導致跳躍時相機也跟著角色的Z軸變化,從而使得角色的跳躍行為發(fā)生偏移。當禁用了相機跟隨功能后,角色的跳躍行為恢復正常,看起來是正確的。接下來,目標是通過調整Z軸偏移來防止相機繼續(xù)跟蹤角色的Z軸位置,避免影響跳躍過程。
在進一步調整時,可以采取只處理X和Y坐標的方法,保存Z軸偏移量,并在需要時恢復相機的原始Z軸偏移。通過這種方式,跳躍過程中的Z軸變化就不會影響到相機的位置跟蹤。
盡管目前仍然可以通過無限跳躍來實現角色逐層上升,但接下來可能會需要進行更多的思考和調整。這些調整雖然可能看起來不必要,但為了實現更加精確的控制,還是決定繼續(xù)進行優(yōu)化,即便這種優(yōu)化可能看似沒有多大意義。
接下來:Minkowski 包含測試
接下來,將繼續(xù)處理其他任務,比如實現Minkowski包含測試和可更新反彈等功能。
Frinstancesδ
接下來的工作將集中在實現起伏不定的局面處理,這需要通過多個實例進行思考。例如,需要處理一些場景,如上下樓層、進入洞穴、與樓下的BOSS互動等。這些問題的處理方式與Minkowski包含測試相關,盡管Minkowski本身并不是強制要求使用的概念,但它是討論空間內實體交互和模擬的一種方法。
目前在模擬區(qū)域內,有一個實體聚集的概念,我們通過檢查某個邊界內的所有實體,判斷哪些實體與邊界重疊,并將這些實體放入模擬區(qū)域。這個過程主要用于在有限的地理區(qū)域內模擬實體的交互,因為我們不能在一個時間內模擬整個世界中的所有實體。因此,通過分區(qū)域模擬,可以更有效地處理實體間的互動。
然而,現有的代碼存在問題,主要是沒有考慮到實體本身的大小。之前的處理方式未能準確反映實體的尺寸,導致在模擬過程中出現問題。因此,接下來的任務是更新代碼,使其能夠更加精確地處理實體的大小,以確保更高效和更清晰的模擬過程。
圖示問題
在當前的實現中,實體的邊界只考慮了二維空間的寬度和高度,但為了更精確地模擬實體在三維空間中的交互,必須加入實體的深度信息。因此,需要將實體的尺寸概念改為三維(v3),以存儲所有三個坐標軸上的尺寸。
此外,在模擬區(qū)域的聚集過程中,現有的包含測試只檢查實體的中心點位置是否在邊界內,這對大尺寸的實體來說可能不夠準確。因為即使實體的中心點在邊界內,實體的實際邊界可能超出了該范圍,因此需要改進這一測試。
一種改進的方法是使用Minkowski包含測試,它可以通過擴展邊界來考慮實體的尺寸,將距離添加到矩形的每一邊,從而生成一個新的測試矩形進行重疊檢測。另一種方法是直接進行矩形重疊測試,檢查兩個矩形是否相交。兩種方法的效果相似,選擇哪一種方式并不會產生顯著的差別,但必須進行其中的一種。
此外,還存在一個相關問題,需要進一步探討是否解決。
AABB(Axis-Aligned Bounding Box,軸對齊包圍盒)是一種用于表示物體空間范圍的幾何形狀,常用于碰撞檢測、物體篩選等應用中。AABB的特點是它的邊界與坐標軸對齊,即盒子的每一條邊都與坐標系的X、Y(以及Z軸,在三維空間中)平行。它是一個矩形(二維)或長方體(三維),并且其邊界不隨物體的旋轉而旋轉,因此稱為“軸對齊”。
AABB的特性:
- 簡易計算:由于AABB的邊界與坐標軸平行,計算其是否與其他物體重疊或是否包含其他物體的范圍非常簡單,通常只需要比較邊界的坐標。
- 空間效率:AABB通常用于快速判斷兩個物體是否相交,尤其在3D游戲和物理引擎中用于簡化碰撞檢測的計算。
- 局限性:AABB并不考慮物體的旋轉,導致在某些情況下,物體可能會被包裹在一個比實際需要的空間更大的AABB內,從而降低精度。
示例:
- 在二維空間中,一個AABB可以由兩個點表示:左下角和右上角。這兩個點的坐標分別代表該AABB的最小和最大邊界。
- 在三維空間中,一個AABB則由前述的兩個點擴展為六個數值(最小和最大X、Y、Z坐標)。
由于其計算簡單,AABB在許多實時系統(tǒng)中非常常見,尤其是游戲開發(fā)和物理模擬中。
相關問題:在測試區(qū)域外查找碰撞實體
目前面臨的問題是如何有效地處理實體聚集的區(qū)域。我們有一些瓦塊(tile chunks),這些瓦塊存儲了實體。當我們進行聚集操作時,我們遍歷與聚集區(qū)域接觸的瓦塊。這些瓦塊的范圍通常是9個正方形,我們對這些區(qū)域內的實體進行測試,以避免每次都遍歷整個世界中的所有實體,這樣做是為了提高效率。
然而,問題在于,如果一個實體恰好位于某個瓦塊的邊緣,且該瓦塊沒有被當前聚集區(qū)域包含,那么這個實體就會被忽略,即使它的邊界可能部分超出了當前區(qū)域。如果聚集區(qū)域不恰好對齊,或者實體本身比較大,這個問題會變得更加明顯。
為了解決這個問題,有幾種可能的方法。首先,我們可以考慮雙重存儲實體:任何跨越多個瓦塊的實體都可以同時存儲在這些瓦塊中,這樣就能確保這些實體在所有涉及的區(qū)域內被正確處理。另一個方法是擴展聚集區(qū)域,考慮到最大實體的半徑,這樣即使某個實體的邊界超出了聚集區(qū)域的邊緣,也能夠被包含在內。
擴展聚集區(qū)域的優(yōu)點是能夠確保所有實體都能被正確測試,但缺點是如果大多數實體比較小,而只有個別實體非常大,那么每次進行聚集操作時,系統(tǒng)會浪費大量資源去檢查這些不必要的大范圍區(qū)域。因此,這種方法的效率可能會受到影響。
另一方面,雙重存儲方法能夠處理跨瓦塊的實體,但如果所有實體大小差異不大,雙重存儲會導致大量不必要的重復操作,浪費存儲和計算資源。
目前,還不清楚哪種方法最為有效,因為缺乏關于實體大小分布的具體信息??紤]到實現的簡易性和避免不必要的復雜性,選擇擴展聚集區(qū)域的方法可能更為合理,尤其是在大多數實體相對較小的情況下。
實現更簡單的選項
這段內容描述了一個游戲開發(fā)過程中,關于實體半徑、速度、區(qū)域更新、碰撞檢測等方面的實現和調整。主要涉及以下幾個方面:
-
實體半徑和區(qū)域更新:
游戲中有一個最大實體半徑(約為五米),用來定義實體的最大影響范圍。模擬區(qū)域會根據該半徑進行更新,確保區(qū)域的大小能夠適應所有可能的實體。 -
最大半徑和速度限制:
通過設定最大實體半徑和最大速度,防止出現過大的實體或過快的速度。為了確保物理模擬的穩(wěn)定性,開發(fā)者考慮通過多種方式(如增加安全邊際)來防止實體超出設定的最大值。速度被定義為最大實體速度與時間步長(DT)的乘積。 -
實體速度和碰撞檢測:
對實體的速度進行校驗,確保它不會超過設定的最大速度。開發(fā)者使用了長度平方的方式來避免計算實際的速度值,從而優(yōu)化性能。為了確保速度不超過限制,開發(fā)者考慮使用斷言(assert)來檢查速度,如果超出最大速度,可以進行限制。 -
跳躍和重力處理:
游戲中的跳躍功能存在問題,實體的速度沒有在接觸地面時清零,導致速度繼續(xù)增長。通過調整代碼,確保實體在接觸地面時將垂直方向的速度歸零,從而避免跳躍速度不正常。 -
區(qū)域碰撞檢測和維度處理:
在模擬區(qū)域內,開發(fā)者計劃添加基于矩形的碰撞檢測,以確保實體和區(qū)域的交集能夠被正確檢測到。實體的維度被定義為寬度、高度和深度,開發(fā)者將相關代碼中的“高度”改為實體的維度,以提高代碼的通用性。 -
后續(xù)計劃:
游戲開發(fā)者計劃進一步調整和優(yōu)化與Z軸相關的運動代碼(如跳躍和物理反應),并進行更多的探索和實驗,以改進實體的垂直運動。預計未來會對這些部分進行更深入的開發(fā)。
這些更改和改進旨在確保游戲中的實體運動和碰撞系統(tǒng)更加穩(wěn)定和真實,避免出現過大的實體或速度問題,同時改進游戲體驗。
你在 APCS 上的成績是什么?
參加AP計算機科學考試時,即使已經有七年沒有使用考試所用語言編程,依然獲得了滿分5分。考試所用的語言是Pascal,這對于大多數人來說并不是常見的編程語言。盡管早在9歲時就學習過Pascal,但已經很久沒有使用它。盡管如此,仍然能夠取得滿分,這令人感到驚訝和困惑。這種現象讓人懷疑,盡管存在某種程度的成績膨脹,考試的評分標準可能存在不合理之處,因為如果一個人很久沒有使用考試所用的編程語言,通常不應該輕易取得最高分。
但你在高中上過哪些數學課,成績如何?
回顧高中時所修的數學課程以及獲得的成績,雖然這些內容與當前討論的話題無關,但并不妨礙提及。既然沒有特別相關的主題問題,那么談論一些離題的內容也無妨。
我注意到你有很多函數是內聯(lián)的。使用常規(guī)函數和內聯(lián)函數有什么區(qū)別?
在編程中使用內聯(lián)函數時,其意義和效果并不像以前那樣直接。使用內聯(lián)函數通常是為了提示編譯器,將函數展開到每個調用處。然而,在現代編譯器中,內聯(lián)函數并不總是如預期那樣進行展開。由于采用了“統(tǒng)一構建”方式,所有代碼都在同一個文件中,編譯器能夠訪問所有的函數,并根據需要自行決定是否進行內聯(lián)優(yōu)化。因此,在這種構建方式下,inline
關鍵字更多的是作為一種提示,而不是強制指令。實際上,編譯器可能會對未標記為內聯(lián)的函數進行優(yōu)化內聯(lián)處理。
此外,現代鏈接時代碼生成(Link Time Code Generation, LTO)也可以自動進行函數內聯(lián),無需顯式標記。因此,即使某些函數沒有顯式聲明為內聯(lián),編譯器仍可能會對它們進行內聯(lián)優(yōu)化。如果希望確保某些函數被強制內聯(lián),可能需要使用其他編譯器指令,而不僅僅依賴inline
關鍵字。
總的來說,inline
現在更多的是一個編程上的提示,而不再是編譯器執(zhí)行內聯(lián)優(yōu)化的絕對指令。
你覺得還需要多久?
如果每天只一個小時,那么完成一個完整的游戲開發(fā)項目將需要相當長的時間。假設需要三到四個月的時間來編寫整個游戲的代碼,而每天只投入一個小時,這樣計算下來大約需要600天,差不多是兩年左右。雖然游戲的開發(fā)可能看起來每一天都能完成一些小任務,但實際進展較慢,每天工作一小時意味著每次能做的事情有限。因此,整個過程會持續(xù)很長時間,因為每天的工作量并不多。
你能看看玩家的碰撞嗎?他們生成時很接近彼此
玩家在游戲中生成的位置非常接近彼此,導致可能發(fā)生碰撞或其他相關問題。這里提到的問題可能是玩家生成時,位置相互重疊或接近過近,導致游戲中的物體或角色發(fā)生意外的交互。
四維向量有任何好的使用案例嗎?
四維向量有兩個非常常見的用途,幾乎可以說是無處不在的應用,雖然之前已經看過其中一個案例,但尚未實際使用過。因此,可能會為此添加一個四維向量。
四維向量
四維向量(例如四元數)有兩個非常常見的用途。第一個用例是四元數,它是一個四元素的向量,通常存儲為 X、Y、Z 和 W。四元數通常用于表示旋轉,其中前三個元素表示旋轉軸,最后一個元素 W 表示旋轉角度的余弦值的一半。四元數的 V 部分,即 XYZ,表示旋轉軸的正弦值的一半與旋轉軸本身的乘積。四元數在許多引擎代碼中有廣泛應用,盡管在某些項目中可能不需要完整的3D旋轉。
第二個常見用途是顏色存儲,通常使用 RGBA 格式,其中 A 表示透明度。顏色可以通過一個四元素的向量表示,其中 RGB 表示顏色,A 表示透明度。這種存儲方式在很多情況下都非常實用。
一般編程問題:你是否傾向于以某種順序排列你的函數——公共/私有/靜態(tài)——或者是按流向——函數A調用函數B?你通常會把它們一個個放在一起嗎?還是你從不考慮這些?
函數的排序主要是根據它們的調用關系進行的。通常會將被調用的函數放在調用它們的函數之前,這樣就不需要額外的聲明。除此之外,函數的排序還會根據文件來進行,將功能相關的函數放在一起。例如,所有與模擬相關的函數放在一個文件中,所有與實體相關的函數放在另一個文件中。這樣做是為了保持代碼的整潔,方便查看和管理。盡管編輯器對代碼的可視化支持有限,但這種排序方式能夠幫助提高代碼的可維護性和可讀性。
你會將 Minkowski 碰撞實現擴展到處理旋轉/任意凸多邊形嗎?
目前關于旋轉和任意凸多邊形的碰撞檢測是否會擴展的問題尚不明確。對于旋轉,可能并不需要,因為目前不涉及旋轉的操作。雖然將來可能會需要處理旋轉,但不確定是否會實現,尤其是在動畫旋轉方面。碰撞檢測本身通常不適用于動畫旋轉,現有的碰撞求解器并沒有很好地處理旋轉,特別是持續(xù)旋轉??梢酝ㄟ^基于搜索的方式來處理這種情況,但通常沒有非迭代的方式來精確處理動畫旋轉。
對于旋轉,常見的做法是使用起始或結束位置的旋轉,或者取中間位置的旋轉,但沒有一種方法能夠精確地處理正在旋轉的物體之間的碰撞,除非增加維度?,F有的如GJK算法也無法處理這種情況。因此,旋轉的處理通常并不完全準確,尤其是動態(tài)旋轉的碰撞檢測,通常會用一些近似方法,例如通過細分、計算旋轉可能覆蓋的最大面積來進行碰撞測試??偟膩碚f,旋轉動畫導致的碰撞檢測要比不動旋轉的情況復雜得多,而且通常需要一種不那么完美的解決方案。因此,最好盡量避免這種情況,以減少碰撞檢測的復雜度。
為什么 Win32 鼠標處理那么麻煩 - WM_LMOUSEDOWN 但如果你離開窗口就沒有 WM_LMOUSEUP,WM_MOUSELEAVE 除非你被 Alt+Tab 走,SetCapture 幫助如果你離開窗口,除非 Alt+Tab…
Windows平臺上的鼠標事件處理存在一些問題,尤其是關于鼠標按下和松開事件的處理。對于這種情況,使用原始輸入(raw input)方式查詢鼠標可能會更好一些。之所以Windows的鼠標處理會讓人覺得煩惱,是因為操作系統(tǒng)本身在輸入事件傳遞給應用程序時存在一些問題,許多平臺在這方面都有類似的缺陷。Windows并沒有很好地將輸入事件傳遞到應用程序中,這個問題一直存在,也可能很難得到解決。
實體的 Z 索引什么時候會發(fā)生?
關于實體的Z索引,Z索引通常用于表示元素在3D空間中的深度或者在2D渲染中的前后層級關系。它指的是一個實體在某一坐標軸(通常是Z軸)上的位置,決定了該實體在視覺上是位于前景還是背景。如果提到Z索引時沒有特別的上下文,可能是指此類深度或層級信息。
這里有誰足夠大,懷念“大太空過山車”嗎?
提到的內容涉及一個過時的電視節(jié)目《The Great Space Coaster》,并且提到節(jié)目中一位名為Gary的人物。盡管沒有具體的細節(jié),但可以推測這是對過去某段時間文化或節(jié)目的一種懷念或調侃。
你預見到項目會發(fā)展到接受其他開發(fā)者的拉取請求和合并請求,來修復bug、添加功能或其他嗎?當然,你得先開始使用版本控制,避免硬盤損壞
提到的內容討論了項目未來是否會接受其他開發(fā)者的拉取請求(pull request)以修復 bug 或添加功能。目前沒有明確計劃接收外部貢獻。項目的代碼將在游戲發(fā)布兩年后進入公共領域,屆時任何人都可以托管自己的代碼庫,并可能會有社區(qū)參與維護。
我從大概第12集跳到現在的直播,所以如果這個問題之前已經回答過,抱歉,為什么玩家需要跳躍?
提到的內容解釋了玩家跳躍機制的設計。玩家本身并不需要跳躍,這一功能是因為有人提議而加入的,用來測試 Z 軸的運動。雖然跳躍并不是游戲的核心功能,但它在測試飛行敵人等元素時起到了作用,因此暫時保留。最終,當 Z 軸的功能完善后,跳躍功能可能會被移除。
使用 Xbox 控制器創(chuàng)建第二個玩家,它會非常接近由鍵盤創(chuàng)建的玩家,導致兩者無法同時移動
在處理多個角色生成時,如果它們相互重疊,游戲目前沒有處理這些重疊的機制。為了增強程序的健壯性,計劃通過重投影等方法解決實體重疊問題。這不僅能解決實體間的碰撞問題,還能修正由于浮動點不精確而導致的實體進入另一個實體的情況。開發(fā)計劃是讓這些問題得到處理,以便在未來不會成為阻礙,確保碰撞檢測能更加健壯。雖然這項工作可能不會很快完成,但會在后續(xù)的碰撞檢測修復中逐步完善。
目前游戲中最優(yōu)雅/最性感的代碼是哪一段?
目前游戲中最具吸引力的部分可能是實現了循環(huán)即時代碼編輯功能。這項技術使得整個游戲能夠回溯并執(zhí)行一些非??岬牟僮鳌T诰幊虝r,可以設置所謂的循環(huán)點并重復播放這一部分內容,且在播放的過程中,開發(fā)者可以實時編輯代碼。例如,可以直接更改角色的外觀,甚至給角色添加額外的元素,如頭部。通過這種方式,游戲的代碼可以在運行時被動態(tài)編輯,從而即時反映出用戶輸入或其他變動,極大提高了開發(fā)效率。很多游戲引擎,甚至一些商業(yè)引擎,通常并不具備這樣的功能,因此這一功能非常特別和強大。
如果我沒記錯的話,你的代碼中到目前為止沒有使用任何前向聲明,也沒有遇到循環(huán)依賴。這是巧合嗎,還是你在編寫新函數/結構體時有意避免它們?
在編寫代碼時,采取了一種排序方法,即按照函數之間的調用關系進行排序,確保需要先聲明的函數位于調用它們的函數之上。這種做法避免了使用前置聲明,減少了不必要的依賴。至于循環(huán)依賴的情況,通常并不常見,因此也很少需要進行前置聲明。只有在少數情況下,例如在處理“添加實體”時,因為該操作可能會引入新的實體,這時才需要使用前置聲明。總體而言,排序方法讓代碼更加整潔,避免了過多的復制和粘貼,也不必處理復雜的前置聲明問題。
實體的從后到前繪制
關于敵人繪制順序,目前還沒有確定何時實現從后到前的繪制。首先可能會實現實體的從后到前的繪制,至于敵人的繪制,可能會繼續(xù)采用從前到后的順序,因為這種方法通常更快。敵人的從前到后的繪制可能會在實現渲染器時才會考慮。
你有在實現任何高級數據結構嗎?你會推薦學習匯編語言來幫助優(yōu)化 C 語言程序嗎?有什么練習建議嗎?
在項目中,已經實現了一些較為復雜的數據結構,例如一個基于哈希表并包含鏈表的“塊存儲”結構。雖然它不是非常復雜,但相比于簡單的鏈表或哈希表,它融合了兩者的特性,因此可以算作一個進階數據結構。不過,目前沒有實現完全獨特或無法分類的數據結構,常見的數據結構已經能滿足需求,因為它們可以用來構建大部分所需的功能。
至于學習匯編語言,關鍵并不是要能編寫匯編代碼,而是能夠閱讀它。了解編譯器的工作原理,并通過分析 CPU 執(zhí)行的內容來理解性能瓶頸,是優(yōu)化程序的一個重要方面。能讀懂匯編代碼對于理解程序運行的底層機制至關重要,盡管大多數情況下,不需要用匯編語言編寫完整的程序。
是否存在所謂的“硬件”光標與“軟件”鼠標光標的區(qū)別?
關于硬件光標與軟件光標的區(qū)別,歷史上經歷了幾個階段。在最初的時代,硬件光標和軟件光標并沒有區(qū)別,因為顯示器只是簡單地設置像素并顯示,沒有專門的硬件光標。在這種情況下,如果要繪制一個光標,就需要多次繪制,常用XOR繪制方法來避免重復覆蓋,避免額外的資源消耗。
隨著鼠標光標變得越來越重要,尤其是在游戲硬件中,光標通常作為精靈(sprites)來實現。硬件開始支持覆蓋顯示,專門處理鼠標光標,這時硬件光標和軟件光標之間的區(qū)別顯而易見。
然而,隨著3D圖形技術的發(fā)展,硬件開始處理所有的位圖合成,包括鼠標光標和窗口的渲染?,F在,所有內容,包括光標,都是通過圖形硬件進行合成的,因此將鼠標光標稱為硬件光標已經不再具有實際意義??偟膩碚f,硬件光標和軟件光標的區(qū)別經歷了多次變化,現在已經趨于模糊。
倉庫: https://gitee.com/mrxiao_com/2d_game