2013-12-19 139 views
0

我繼續我的對話框與openGL和c + +和現在我想做「場景」,這將改變對方。例如屏幕上的按鈕「去下一個」,我按下按鈕,然後開始遊戲。 在C++中爲此使用openGL的最佳方法是什麼?主要的問題是與像供過於求的初始化命令做什麼:在遊戲中改變場景OpenGL

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); 
glutInitWindowSize(screenWidth, screenHeight); 
glutInitWindowPosition(0,0); 
glutCreateWindow("Puzzle quest!"); 

// Registration 
glutDisplayFunc(Draw); 
glutIdleFunc(Draw); 

是我需要實現這兩類這種方法,或僅在一個,然後只「顯示啓動按鈕/隱藏的遊戲功能,隱藏開始按鈕/顯示遊戲功能+啓動計時器「?

+1

你'Draw'功能應該取決於什麼是繪製不同的東西被顯示? –

+0

這是一個主要問題,因爲據我所知 - 如果我有2個類,那麼每個類都必須有自己的繪製實現:1有繪製按鈕,2有繪製遊戲邏輯,所以我是的。但是如果我只有一個類,那麼mb會更好地使bool,如果1 - >畫這個,否則 - >畫這個?我不知道哪個結構更好或更好 – gronzzz

回答

1

我在現場/模式改變不與屏幕設置混亂。屏幕setings改變對無法在某些按鈕事件的OpenGL窗口的大小調整...

你必須寫你的可視化和UI邏輯的東西取決於一些變數,例如:

enum _game_screens_enum 
{ 
_game_screen_main_menu=0, 
_game_screen_game, 
_game_screen_game_over, 
_game_screen_help, 
_game_screen_intro, 
_game_screen_redefine_keys, 
_game_screen_high_score, 
_game_screen_exit, 
}; 

int screen=_game_screen_main_menu; 

現在平局,更新和UI處理功能只需添加相應的IFS例如:

void draw() 
{ 
if (screen==_game_screen_main_menu) 
    { 
    // draw main menu ... 
    } 
else if (screen==_game_screen_game) 
    { 
    // draw in game screen stuff... 
    } 
else ... 
} 

,就是這樣......

+0

最好的答案,簡要而明確。 – gronzzz

1

你在尋找一種淡入淡出的效果,或者它們混合的某種過渡?如果使用Alpha通道...啓用混合,則淡入淡出效果應該很容易,因爲在任何希望淡出發生的時間範圍內,alpha值都會從0增加到1,因此會在所有內容之前繪製黑色四邊形。淡入將是相反的。不確定混合場景效果...可能是累積緩衝區,或讀取像素,然後繪製像素,如果您可以更改Alpha值。

否則,glutDisplayFunc是在場景/繪圖功能之間切換的正確方法。 試試只是淡化效果,它可以有很大的幫助。

+0

是的,我認爲這樣做的結構,以後我可以很容易地創建切換場景效果,而不會改變我的架構。所以主要問題是,如果我需要爲自己的繪製實現製作這兩個不同的類,或者將它放在一個「main.cpp」中,例如? – gronzzz

1

您應該只初始化一次過量。

通常,顯示屏和空閒回調將取決於你在什麼狀態不同的事情要做

在較高水平。

void idle() 
{ 
    if (showingMenu) 
     menu.idle(); 
    else 
     currentScene.idle(); 
} 

您可以通過切換功能做到這一點,但我認爲這會使調試更加困難。

(你可能不應該使用繪圖和空轉相同的功能,但。)

+0

好的,我會尋找更多的空閒功能,我認爲它是類似的功能) 我是否需要重繪功能,或者在定時器我只開關狀態? – gronzzz

+0

嘿,如果我有定時器的方法,那麼glutIdleFunc也會打電話嗎? – gronzzz

+0

@gronzzz你應該多讀一些關於過剩和看更多的樣本。對於這類問題,這是一個非常糟糕的論壇。 – molbdnilo