今天要來告訴大家
要怎麼讓機器人發出聲音呢?
由於我們使用的控制板是RoBoard
而剛剛好RoBoard上可以架設Windows的環境
又很巧的Windows可以使用許許多多的函式庫
連寫程式的時間都省了 還不好嘛?
如何在RoBoard上發出聲音呢??
首先 你需要一些材料
RoBoard一台
喇叭一組
應該不難取得吧?
喇叭
喇叭(藏在身體裡面)
由於藏在身體裡面 音量會有點被壓低
不過還是很大聲
比賽時 可能是因為太吵雜 所以比較沒有人聽到
影片:
加上聲音之後 機器人也漸漸活起來囉!
接著
可以寫程式囉
我們需要用一個irrKlang的函式庫
可以到http://www.ambiera.com/irrklang/ 下載所需的檔案
將專案屬性設定完後就可以使用這個函式庫囉!
範例程式碼:
#include <stdio.h> #include <string.h> #include <irrKlang.h> using namespace irrklang; class CMyFileFactory : public irrklang::IFileFactory { public: virtual irrklang::IFileReader* createFileReader(const ik_c8* filename) { FILE* file = fopen((char*)filename, "rb"); if (!file) return 0; return new CMyReadFile(file, filename); } protected: class CMyReadFile : public irrklang::IFileReader { public: CMyReadFile(FILE* openedFile, const ik_c8* filename) { File = openedFile; strcpy(Filename, filename); long cur_offset, end_offset; cur_offset = ftell(openedFile); fseek(openedFile, 0L, SEEK_END); end_offset = ftell(openedFile); fseek(openedFile, cur_offset, SEEK_SET); FileSize = (ik_s32)end_offset; } ~CMyReadFile() { fclose(File); } ik_s32 read(void* buffer, ik_u32 sizeToRead) { return (ik_s32)fread(buffer, 1, sizeToRead, File); } bool seek(ik_s32 finalPos, bool relativeMovement) { return fseek(File, finalPos, relativeMovement ? SEEK_CUR : SEEK_SET) == 0; } ik_s32 getSize() { return FileSize; } ik_s32 getPos() { return ftell(File); } const ik_c8* getFileName() { return Filename; } FILE* File; char Filename[1024]; ik_s32 FileSize; }; //end class CMyReadFile }; //end class CMyFileFactory int main(void) { ISoundEngine* audioEngine = createIrrKlangDevice(ESOD_AUTO_DETECT, ESEO_MULTI_THREADED | ESEO_LOAD_PLUGINS); if (audioEngine){ CMyFileFactory* demofileFactory = new CMyFileFactory(); audioEngine->addFileFactory(demofileFactory); demofileFactory->drop(); printf("sound success\n"); } char c; if (audioEngine) while((c = getchar()) != 'q'){ switch(c){ case 'a': audioEngine->play2D("sound1.wav", false, false, true); break; case 's': audioEngine->play2D("sound2.wav", false, false, true); break; case 'd': audioEngine->play2D("sound3.wav", false, false, true); break; case 'f': audioEngine->removeAllSoundSources(); break; } } if (audioEngine) audioEngine->drop(); return 0; }
Q跳出
A播放聲音 sound1.wav
S播放聲音 sound2.wav
D播放聲音 sound3.wav
F停止目前的聲音
別忘記將音樂檔以及.dll檔放入資料夾內喔!
0 留言:
張貼留言