今天要來告訴大家
要怎麼讓機器人發出聲音呢?
由於我們使用的控制板是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檔放入資料夾內喔!