2020年5月13日 星期三

week12

電腦圖學 第12週 2020-05-13
1. 主題: 聲音、音效、音樂
2. 實作: 播放 WAV檔
3. 實作: 播放 MP3檔
4. 實作: GLUT .cbp 專案檔 的設定 (執行目錄、include/lib目錄、link lib檔)
5. 確認作業4(多個3D模型+GLUT)繳交狀況


架設好freeglut的環境>開啟專案>刪除起始內容程式>打上下方程式


#include<windows.h>
#include<mmsystem.h>
int main()
{
    PlaySoundA("檔名.wav",NULL , SND_SYNC);

}

因為沒檔案會報錯,位址顯示要把檔案放在freeglut/bin中...


網路隨便下載WAV檔>放到資料夾中>添加檔名





創一個完整的檔案

下載do,re,mi檔案>寫上下方程式

#include<windows.h>
#include<mmsystem.h>
#include <GL/glut.h>
void display(void)
{

}
void keyboard(unsigned char key,int x, int y)
{
   if(key=='1')
    PlaySoundA("do.wav",NULL , SND_ASYNC);
   if(key=='2')
    PlaySoundA("re.wav",NULL , SND_ASYNC);
   if(key=='3')
    PlaySoundA("mi.wav",NULL , SND_ASYNC);
   if(key=='4')
    PlaySoundA("fa.wav",NULL , SND_ASYNC);
   if(key=='5')
    PlaySoundA("so.wav",NULL , SND_ASYNC);
}
int main(int argc, char *argv[])
{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("12");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);


    glutMainLoop();

}


SND_ASYNC 為即時同步SND_SYNC 先完整撥放 


讀入做出MP3檔

下載需要檔案(mp3檔,mp3引入程式)>

mp3檔放至(Freeglut/bin資料夾),mp3引入程式語言放至(專案目錄資料夾)>

寫入下方程式並填上檔名



#include<windows.h>

#include<mmsystem.h>
#include <GL/glut.h>
#include "CMP3_MCI.h"///這樣就可以直接讀入目錄中程式語言
CMP3_MCI mp3;///宣告一個宣告物件變數
void display(void)
{

}
void keyboard(unsigned char key,int x, int y)
{
   if(key=='1')
    PlaySoundA("do.wav",NULL , SND_ASYNC);
   if(key=='2')
    PlaySoundA("re.wav",NULL , SND_ASYNC);
   if(key=='3')
    PlaySoundA("mi.wav",NULL , SND_ASYNC);
   if(key=='4')
    PlaySoundA("fa.wav",NULL , SND_ASYNC);
   if(key=='5')
    PlaySoundA("so.wav",NULL , SND_ASYNC);
}
int main(int argc, char *argv[])
{
    mp3.Load("檔名.mp3");
    mp3.Play();
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("12");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);


    glutMainLoop();
}

上面DOREMI無法同時撥放做出和弦,我們要利用使用mp3的方法解決

如下:


#include<windows.h>

#include<mmsystem.h>
#include <GL/glut.h>
#include "CMP3_MCI.h"
CMP3_MCI mp3;///宣告一個宣告物件變數
CMP3_MCI Do ,Re ,Mi ,Fa ,So;
void display(void)
{

}
void keyboard(unsigned char key,int x, int y)
{
   if(key=='1') Do.Play();///PlaySoundA("do.wav",NULL , SND_ASYNC);
   if(key=='2') Re.Play();///PlaySoundA("re.wav",NULL , SND_ASYNC);
   if(key=='3') Mi.Play();///PlaySoundA("mi.wav",NULL , SND_ASYNC);
   if(key=='4') Fa.Play();///PlaySoundA("fa.wav",NULL , SND_ASYNC);
   if(key=='5') So.Play();///PlaySoundA("so.wav",NULL , SND_ASYNC);
}
int main(int argc, char *argv[])
{
    Do.Load("do.wav"); Re.Load("re.wav"); Mi.Load("mi.wav");
    Fa.Load("fa.wav");So.Load("so.wav");
    mp3.Load("Dreams.mp3");
    ///mp3.Play();
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("12");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);


    glutMainLoop();
}

如何把檔案放在目錄資料夾

把目錄 .cbp檔 working.dir改成"."> bin中的音樂檔 注意還有freeglut.dll 就可以放到目錄之中

最終版乒乓球小遊戲

#include <windows.h>
#include <mmsystem.h>
#include <GL/glut.h>
#include "CMP3_MCI.h" /// TODO3: 雙引號,在專案同一個目錄裡
CMP3_MCI mp3;///ex. int a; TODO3: 宣告一個物件變數,叫 mp3
CMP3_MCI Do, Re, Mi, Fa, So; ///TODO4: 有5個物件變數

float ballX=0, ballY=0, dx=0.05, dy=0.03;///ballX會加上dx, ballY會加上dy
void display()
{///想法: 可不可以做個小遊戲....有個球,會動來來動
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///TODO6: 備份
        glTranslatef(ballX, ballY, 0);///TODO6: 移到ballX,ballY
        glutSolidSphere(0.1, 30,30);///TODO6:圓球
    glPopMatrix();///TODO6:還原
    glutSwapBuffers();
}
void timer(int t)///TODO6: timer
{
    glutTimerFunc(50, timer, t+1);///TODO6: 用timer
    ballX+=dx; ballY+=dy;///TODO6: 球會動
    if(ballX>=1){
        Do.Play(); dx= -dx;
    }
    if(ballX<=-1){
        Re.Play(); dx= -dx;
    }
    if(ballY>=1){
        Mi.Play(); dy= -dy;
    }
    if(ballY<=-1){
        Fa.Play(); dy= -dy;
    }
    glutPostRedisplay();///TODO6: 重畫畫面
}
void mouse(int button, int state, int x, int y)///TODO6: mouse會有槍聲
{
    if(state==GLUT_DOWN) PlaySoundA("shot.wav", NULL, SND_ASYNC);
}
void keyboard(unsigned char key, int x, int y)
{                                 //不要同步,不等結束,繼續
    if(key=='1') Do.Play();///TODO4 PlaySoundA("do.wav",NULL,SND_ASYNC);
    if(key=='2') Re.Play();///TODO4//PlaySoundA("re.wav",NULL,SND_ASYNC);
    if(key=='3') Mi.Play();///TODO4//PlaySoundA("mi.wav",NULL,SND_ASYNC);
    if(key=='4') Fa.Play();///TODO4//PlaySoundA("fa.wav",NULL,SND_ASYNC);
    if(key=='5') So.Play();///TODO4//PlaySoundA("so.wav",NULL,SND_ASYNC);
}///TODO4: 上面的程式, 現在可以有合弦 (ex. Do+Mi+So => 只會有個音出來...)
int main(int argc, char**argv)
{
    Do.Load("do.wav"); Re.Load("re.wav"); Mi.Load("mi.wav");
    Fa.Load("fa.wav"); So.Load("so.wav");///TODO4: 5個物件變數 設好檔案
    mp3.Load("music.mp3");///TODO3:
    ///mp3.Play();///TODO3:
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE |GLUT_DEPTH);
    glutCreateWindow("week12 sound");
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);///TODO2:鍵盤有函式
    glutTimerFunc(50, timer, 0);///TODO6
    glutMouseFunc(mouse);///TODO6
    glutMainLoop();
}



沒有留言:

張貼留言