2014-11-04 119 views
1

嗨同行程序員,SDL2加載屏幕/線程

花費數小時試圖完成SDL2中的加載屏幕,我們沒有這樣做。我們正在創建一個簡單的2D開放世界生存遊戲(自上而下),它需要我們爲不同的實體(兔子,樹木,岩石等)加載大量的tilesets/sprite。

起初我們只有一個tileset,包含樹和背景圖塊。但是,現在,地圖從「樣本」50x50的瓷磚地圖擴展到1500x1500的瓷磚地圖。結果:遊戲似乎凍結,但它正在加載瓷磚/圖像。

我們的解決方案:創建一個加載屏幕,我們可以顯示當前正在加載的進度。由於我們的遊戲使用狀態模式來進行遊戲狀態(或者有點像它),我們會有一個PlayState和一個LoadingState。

我們決定使用一個常規的std :: thread加載所有需要的數據並將它們轉換爲紋理。什麼的線程究竟,是這樣的:

  1. 閱讀JSON文件,其中包含數據,我們的地圖
  2. 過程檢索到的數據,並從中
  3. 加載圖像創建tilesets創造紋理

這一切都沒有線程(除了'凍結',它只是加載所有上述內容),但使用線程,就像成功/失敗的60%/ 40%一樣。經過幾小時和幾個小時的搜索,我們發現原因:SDL2 cannot call SDL_CreateTexture來自主線程以外的其他線程。

現在,我們無能爲力,因爲我們不知道如何顯示加載屏幕,執行上述所有操作,而無需創建不同的線程來執行這些操作。因此,我們的問題:是否有任何方法可以實現加載屏幕,我們上面描述的方式?

在此先感謝!

+0

不是爭論,但..如果你花了幾個小時嘗試創建啓動畫面並失敗,並且你打算編寫一個2D開放式世界生存遊戲..我再讀一些教程。 – 2014-11-04 17:23:29

+0

https://bugzilla.libsdl.org/show_bug.cgi?id=1995 – 2501 2014-11-04 17:27:41

+0

@MarcoA。我可能有點誇張,但遊戲本身就可以運行(運行遊戲)。我們已經創建了塊,以處理實體的處理。愚蠢的是,創建一個簡單的啓動畫面,並顯示加載的百分比比看起來更難。換句話說:我們的遊戲已經開始運行,我們的加載屏幕不是。 – 2014-11-04 17:40:40

回答

1
  1. 在文件的循環中調用IMG_LoadTexture(),直到顯示當前幀爲止。

  2. 渲染顯示進度的簡單圖像。

  3. 如果有任何更多的紋理加載,轉到1

這是在同一個線程中完成的。

+0

你能否詳細解釋一下這個問題?(具體步驟1)? – 2014-11-04 17:42:36

+0

@PimVerlangen你如何創建紋理? – 2501 2014-11-04 17:45:14

+0

'SDL_Texture * tileSet = IMG_LoadTexture(renderer,(RESOURCEPATH + filename).c_str());'。之後,我們檢查tileSet是否爲空指針。通過我們目前擁有的線程,這似乎失敗/以隨機速率成功。 – 2014-11-04 17:46:46