2023年4月27日 星期四

晚安week11

鍵盤事件

在預設程式碼中按下Ctrl+F找到keyboard函示







依照語法撰寫程式碼:
```
#include <GL/glut.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y)
{
    if(key == 27) exit(1234);  //按下esc鍵後關閉視窗並回傳1234
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week11");
    
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    
    glutMainLoop();
}
```

按下esc鍵後關閉視窗並回傳1234









播放音檔

音檔
wav: 檔案大,容易撥放
mp3: 經壓縮過所以檔案較小,不易播放

WAV檔

按下數字鍵1、2、3撥放音檔do.wav、re.wav、mi.wav
```
#include <windows.h>
#include <GL/glut.h>

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y) //絕對路徑要兩個反斜線
{
    if(key == '1') PlaySound("D:\\222\\do.wav", NULL, SND_ASYNC);
    if(key == '2') PlaySound("D:\\222\\re.wav", NULL, SND_ASYNC);
    if(key == '3') PlaySound("D:\\222\\mi.wav", NULL, SND_ASYNC);
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week11");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);

    glutMainLoop();
}
```


直接撥放音檔需要修改compiler設定
在Linker setting裡的library新增winmm














```
#include <windows.h>
#include <stdio.h>
int main()
{
    PlaySound("D:\\222\\do.wav", NULL, SND_SYNC);
    PlaySound("D:\\222\\re.wav", NULL, SND_SYNC);
    PlaySound("D:\\222\\mi.wav", NULL, SND_SYNC);
    printf("Hello World");
}
```


PlaySound函式的第三個參數:
SND_SYNC: 等待+同步,完整撥放音檔後繼續執行
SND_ASYNC: 不等待+不同步,執行下個指令時結束撥放

程式碼會在完整撥放三個音檔後才列印出"Hellow World"




兩個相同工作目錄(檔案與專案皆存在D:\\)下的檔案可以使用"相對路徑"以縮減程式碼:
   PlaySound("222\\do.wav",NULL,SND_SYNC);

MP3檔案

播放MP3檔需使用外掛程式碼"CMP3_MCI.h"
將檔案存在專案資料夾內,和程式碼相同目錄








```
#include <windows.h>
#include "CMP3_MCI.h" ///匯入外掛程式碼
CMP3_MCI myMP3;  ///宣告物件變數
int main()
{
    char filename[]= "222\\thereisareason.mp3";
    myMP3.Load(filename);
    myMP3.Play();
}
```

解決歷史餘毒(工作執行目錄)
把freeglut/bin裡的freeglut.dll複製到專案裡
音檔也複製到專案的目錄
把project-properties裡的build taregts工作執行目錄working dir改成小數點.代表同一目錄

















沒有留言:

張貼留言