這一次要加入主要的遊戲模式程式碼,這裡因為OpenGL不是物件導向,所以必須要自己定義箭頭(Arrow)這個物件,在上一篇我已經把他先定義好了: x,y,list_Num 也就是箭頭的編號(上、下、左、右)
接下來產生箭頭的方式我使用std的vector去記錄每一個出現的箭頭資訊,並透過glutTimerFunc()產生動畫效果,使得箭頭看起來會不斷地向下移動。我設置了一個全域的二維陣列分別代表每一次該出現上、下、左、右那些箭頭/*
樂譜設計:
每列為每個dis執行時的時間軸,每欄分別是上下左右的位置
這邊要注意與timer的配合,太過密集出現的話會圖案重疊
*/
int sheet_Music1[500][4] =
{
0,0,0,1,
0,0,0,0,
0,1,0,0,
0,0,0,0,
1,1,1,1,
0,0,0,0,
0,0,0,0,
1,0,0,1
};
接下來是遊戲模式的副程式,把全域的二維陣列一列一列讀,判斷那些箭頭該出現,並將她該出現的x,y,出現哪種方向的箭頭等資訊push_back()到vector中。 同時也更新已存在vector內的箭頭的y值,每次都讓他往下掉,這樣看起來就會有向下移動的效果
然後為了避免執行次數太快,用了一個frequence變數去做delay,所以需要在dis()中加入frequence++;的code
void play() |
再來更新buttom_UI()做按鍵特效,這邊判斷Press_Stat[]和text_Press_Stat[]來讓對應的Arrow與文字變換顏色,然後加點delay即可int main(int argc, char** argv)
{
glutInit(&argc, argv);//初始化glut
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
glutInitWindowSize(ww, wh);
glutInitWindowPosition(450, 0);
glutCreateWindow("Music Dancing");
init();
glutDisplayFunc(dis);
glutMouseFunc(mymouse);
glutSpecialFunc(mykey);//上下左右要用特殊的偵測
glutTimerFunc(50, timer, 0);
glutMainLoop();//glutMainLoop()會反覆執行是回呼函數的function
return 0;
}
最後更新一下main的內容
int main(int argc, char** argv) |
到這邊就有遊戲的大概了,滑鼠點擊偵測的部分就只是小功能,就不再介紹了,我把上一篇的Code加上這篇重新整理了一下順序 完整程式碼在: Github-%E9%81%8A%E6%88%B2%E8%A8%AD%E8%A8%88)
至於如何加入音樂?教授有請我做了一篇教學,就直接放上來了xD
如果有問題歡迎詢問