[OpenGL]音樂節奏遊戲(2)-遊戲設計

Posted by John on 2017-02-24
Words 865 and Reading Time 3 Minutes
Viewed Times

這一次要加入主要的遊戲模式程式碼,這裡因為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()
{
int shift = 0;
//cout<< frequence << endl;
if (frequence == 10)
{
for (int i = 1; i <= 4; ++i)
{
if (sheet_Music1[music_Sheet_counter][(i - 1)] == 1)
{
glPushMatrix();
arrow temp;
temp.x = 75 + shift;
temp.y = 550 - distance_y;
temp.list_Num = GAME_Up + (i - 1);
arrow_list.push_back(temp);
glPopMatrix();
}
shift += 100;
}
frequence = 0;
music_Sheet_counter++;
}
for (it = arrow_list.begin(); it != arrow_list.end() && !gameover; it++)
{

glPushMatrix();
//cout << time_counter << ": " <x << " " <y << " " <list_Num y, 0.0);
it->y -= distance_y;//向下移動
glCallList(it->list_Num);
glPopMatrix();
if (it->y list_Num == GAME_Up)
{
if (abs(it->y) y) y) list_Num == GAME_Down)
{
if (abs(it->y) y) y) list_Num == GAME_Left)
{
if (abs(it->y) y) y) list_Num == GAME_Right)
{
if (abs(it->y) y) y) <= 32)
{
combo++;
strcpy(text_Press_Stat[3], "Good");
printf("20\n");
score += 20 * (1 + ((float)combo / 100.0));
it = arrow_list.erase(it);//eraser會回傳下一個位置
}
else
{
combo = 0;
strcpy(text_Press_Stat[3], "Miss");
printf("MISS\n");
}
break;
}
glPopMatrix();
}
break;
}
}
}

再來更新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)
{
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;
}

到這邊就有遊戲的大概了,滑鼠點擊偵測的部分就只是小功能,就不再介紹了,我把上一篇的Code加上這篇重新整理了一下順序 完整程式碼在: Github-%E9%81%8A%E6%88%B2%E8%A8%AD%E8%A8%88)

至於如何加入音樂?教授有請我做了一篇教學,就直接放上來了xD

14

如果有問題歡迎詢問


>