• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            劍孤寒的小站

            人生的價(jià)值不是用時(shí)間,而是用深度去衡量的!
            posts - 75, comments - 290, trackbacks - 0, articles - 0

                在一個(gè)優(yōu)秀的游戲中,音樂(lè)和音效往往能起到畫龍點(diǎn)睛的作用,這一節(jié)我們就來(lái)學(xué)習(xí)如何在GGE中播放音樂(lè)和音效。
                GGE自帶了音頻解碼播放功能,不需要使用base或fmod等音效庫(kù)。在GGE中提供了一個(gè)Sound_Load()函數(shù)用于載入音樂(lè)和音效,支持wav和ogg格式的音頻文件,如果載入成功則返回一個(gè)ggeSound指針,例如:

               m_sound = Sound_Load("Fire1.ogg"); //載入音效
                m_music = Sound_Load("eyes on me.ogg"true); //載入音樂(lè)

                要載入音效只需簡(jiǎn)單的調(diào)用Sound_Load()函數(shù),并傳入音效文件名即可,如果是載入音樂(lè)的話,一般需要將音樂(lè)轉(zhuǎn)換成ogg格式,并且將Sound_Load()函數(shù)的第二個(gè)參數(shù)傳入true,表示以流方式載入。需要注意的是,以流方式載入的ogg文件比較節(jié)省內(nèi)存(wav格式無(wú)效),但無(wú)法同一時(shí)間播放多次,例如碰到同時(shí)響起兩聲槍響這種情況,如果以流方式載入,調(diào)用兩次播放函數(shù)實(shí)際上只能聽(tīng)到一聲槍響,所以音效一般不使用流方式載入。
                音樂(lè)和音效載入后都可以調(diào)用ggeSound::Play()函數(shù)來(lái)播放,播放時(shí)可以動(dòng)態(tài)修改音量、頻率、聲道平衡,也可以暫停和恢復(fù)播放。例如在OnUpdate(float dt)函數(shù)中添加如下代碼對(duì)音樂(lè)和音效進(jìn)行控制:

             switch (Input_GetKey())
                    
            {
                    
            case 'Q':
                        m_music
            ->Play(true); //音樂(lè)循環(huán)播放
                        break;

                    
            case 'W':
                        m_music
            ->Stop();
                        
            break;

                    
            case 'A':
                        m_music
            ->Pause();
                        
            break;

                    
            case 'S':
                        m_music
            ->Resume();
                        
            break;

                    
            case 'Z':
                        
            if (m_musicVolume > 0) m_musicVolume--;
                        m_music
            ->SetVolume(m_musicVolume);
                        
            break;

                    
            case 'X':
                        
            if (m_musicVolume < 100) m_musicVolume++;
                        m_music
            ->SetVolume(m_musicVolume);
                        
            break;

                    
            case 'E':
                        
            if (m_soundVolume > 0) m_soundVolume--;
                        m_sound
            ->SetVolume(m_soundVolume);
                        
            break;

                    
            case 'R':
                        
            if (m_soundVolume < 100) m_soundVolume++;
                        m_sound
            ->SetVolume(m_soundVolume);
                        
            break;

                    
            case 'D':
                        
            if (m_soundPan > -100) m_soundPan--;
                        m_sound
            ->SetPan(m_soundPan);
                        
            break;

                    
            case 'F':
                        
            if (m_soundPan < 100) m_soundPan++;
                        m_sound
            ->SetPan(m_soundPan);
                        
            break;

                    
            case 'C':
                        m_soundpPitch 
            -= dt * 0.5f;
                        
            if (m_soundpPitch < 0) m_soundpPitch = 0;
                        m_sound
            ->SetPitch(m_soundpPitch);
                        
            break;

                    
            case 'V':
                        m_soundpPitch 
            += dt  * 0.5f;
                        
            if (m_soundpPitch > 10.0f) m_soundpPitch = 10.0f;
                        m_sound
            ->SetPitch(m_soundpPitch);
                        
            break;

                    
            case VK_SPACE:
                        m_sound
            ->Play();
                        
            break;
                    }

                因?yàn)橐魳?lè)是以流方式載入的,每次按下Q鍵會(huì)讓音樂(lè)重新開(kāi)始播放,音效不是以流方式載入的,所以每次按下空格鍵即使之前的音效沒(méi)播放完也能聽(tīng)到新的聲音。
                在GGE中還提供了一個(gè)ggeMusic模塊,這個(gè)是專門用來(lái)播放midi音樂(lè)的,不過(guò)這個(gè)現(xiàn)在用得比較少,就不詳細(xì)介紹了,大致使用方法跟ggeSound一樣,如果有需要可以查看文檔。


            Feedback

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-04-23 17:01 by 小白
            期待博主什么時(shí)候來(lái)個(gè)小型完整的RPG游戲教材就好了,方便下我們這些個(gè)新手

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效  回復(fù)  更多評(píng)論   

            2010-04-24 18:07 by 劍孤寒
            嗯,如果有時(shí)間的話會(huì)弄一個(gè)綜合性的小游戲來(lái)做教材,真希望一天能有48小時(shí),可以每天有點(diǎn)時(shí)間做自己的東西啊-_-

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-04-25 12:41 by 斷桿破槍頭
            3.1
            ggeFont 里的print函數(shù)是不是有問(wèn)題啊?

            我在代碼里面
            初始坐標(biāo)是300,200
            移動(dòng)增量是1.5
            m_RolePosFon->print(680,30,"角色坐標(biāo): %d,%d",m_RolePos.x,m_RolePos.y);
            坐標(biāo)顯示有問(wèn)題 還是我用的有問(wèn)題呢

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-04-25 15:03 by 斷桿破槍頭
            截圖的函數(shù)是不是也有問(wèn)題啊

            老是默認(rèn)生成一個(gè)這個(gè)文件 snapshot.png

            我代碼是這樣的
            PATH_GAME_SCRNSHOT 宏定義為"ScrnShot\\"目錄下面

            if (Input_IsKeyDown(GGEK_F12))
            {
            char fnstr[200];
            static SYSTEMTIME t;
            GetSystemTime(&t);
            sprintf(fnstr,"%sSword%d%d%d_%d.jpg",PATH_GAME_SCRNSHOT,
            t.wYear,t.wMonth,t.wDay,
            GetTickCount());
            Graph_Snapshot(fnstr,IMAGE_JPG);
            }

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效  回復(fù)  更多評(píng)論   

            2010-04-26 09:17 by 劍孤寒
            @斷桿破槍頭
            1.請(qǐng)確定m_RolePos.x和m_RolePos.y是否是浮點(diǎn)數(shù),如果是,應(yīng)該這樣調(diào)用:m_RolePosFon->print(680,30,"角色坐標(biāo): %f,%f",m_RolePos.x,m_RolePos.y);
            2.可能是因?yàn)楦J(rèn)的截圖快捷鍵沖突了,你可以試著換一個(gè)按鍵作為截圖鍵看看是否有效,下個(gè)版本加一個(gè)默認(rèn)截圖按鍵開(kāi)關(guān)好了

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-04-26 16:22 by 斷桿破槍頭
            第二個(gè)問(wèn)題解決了,第一個(gè)問(wèn)題加類型轉(zhuǎn)換就好了(int)

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-04-26 19:09 by 斷桿破槍頭
            大場(chǎng)景卷動(dòng) 怎么做啊 ?
            就是你那個(gè)演示里面 地圖的移動(dòng)

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效  回復(fù)  更多評(píng)論   

            2010-04-27 11:47 by 劍孤寒
            這個(gè)可以用ggeImage來(lái)實(shí)現(xiàn),
            先用ggeImage載入地圖:
            ggeImage *MapImage = Image_Load("map.jpg");
            可以載入任意大小的圖片,
            不受顯卡最大紋理尺寸的限制,
            (因?yàn)橄瘛盾庌@劍3》等游戲有些地圖尺寸是非常大的,
            如果超過(guò)了顯卡的最大紋理尺寸地圖就顯示不出來(lái)了,
            用ggeImage就不用擔(dān)心這個(gè)問(wèn)題了)

            然后再用下面的代碼把地圖畫出來(lái):
            MapImage->SetRect((int)sceneX, (int)sceneY, (int)sceneX + ScreenWidth, (int)sceneY + ScreenHeight);
            MapImage->Render(0, 0);

            調(diào)用ggeImage::SetRect()函數(shù)設(shè)置要顯示的地圖區(qū)域,
            ScreenWidth和ScreenHeight表示屏幕尺寸,
            如果你的屏幕大小為640x480,
            則ScreenWidth=640,ScreenHeight = 480,
            sceneX和sceneY為地圖顯示區(qū)域左上角坐標(biāo),
            假設(shè)主角的實(shí)際坐標(biāo)為(400, 400),
            為了讓主角在屏幕中間即主角的坐標(biāo)屏幕坐標(biāo)為(320, 240),
            所以要將地圖往左上角移動(dòng),
            即sceneX = 400 - 320; sceneY = 400 - 240;
            最后調(diào)用ggeImage::Render()將地圖畫出來(lái)就可以了

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效[未登錄](méi)  回復(fù)  更多評(píng)論   

            2015-10-03 13:39 by shepherd
            正在寫一個(gè)語(yǔ)音播放類,發(fā)現(xiàn)老是出錯(cuò),就做了個(gè)簡(jiǎn)單的演示程序。
            具體問(wèn)題是:加載同一個(gè)聲音資源后,不疊加,一次一次的播放沒(méi)問(wèn)題,但是疊加播放就出錯(cuò)。大神幫忙看一下唄。
            #include <stdlib.h>
            #include "inc/ggebase.h"
            #include "inc/ggesound.h"

            using namespace gge;

            ggeSound *st;
            gUInt changing_color = 0xFFFFFFFF;

            //幀函數(shù)
            bool Frame()
            {
            //開(kāi)始渲染
            if (Graph_BeginScene())
            {
            //清屏
            Graph_Clear();

            if(Input_GetKey() == VK_SPACE)
            {
            changing_color = 0xFF000000 + (gUInt)(rand() * 0xFFFFFF);
            st->PlayEx();
            }
            Graph_RenderQuad(100.0f, 120.0f, 140.0f, 160.0f, changing_color);

            //結(jié)束渲染
            Graph_EndScene();
            }
            return false;
            }

            int main(HINSTANCE, HINSTANCE, LPSTR, int)
            {
            //創(chuàng)建游戲引擎
            if (!Engine_Create(GGE_VERSION)) return 0;

            System_SetState(GGE_TITLE, "Galaxy2D Game Engine - Initiate");
            //設(shè)置幀函數(shù)
            System_SetState(GGE_FRAMEFUNC, Frame);
            //設(shè)置幀率
            System_SetState(GGE_FPS, 60);
            System_SetState(GGE_USESOUND, true); //是否開(kāi)啟聲音:是


            //系統(tǒng)初始化
            if (System_Initiate())
            {
            st = Sound_Load("d://1.wav", false);
            //開(kāi)始運(yùn)行幀函數(shù)
            System_Start();
            }

            //關(guān)閉引擎,釋放資源
            Engine_Release();
            return 0;
            }

            # re: Galaxy2D游戲引擎教程6 - 音樂(lè)和音效  回復(fù)  更多評(píng)論   

            2015-10-04 19:01 by 劍孤寒
            @shepherd
            已經(jīng)修復(fù)了,請(qǐng)下載最新版引擎,感謝反饋
            9999国产精品欧美久久久久久| 偷偷做久久久久网站| 久久久久久久久66精品片| 久久这里只有精品久久| 久久久一本精品99久久精品66| 一本色道久久88综合日韩精品| 久久99中文字幕久久| 粉嫩小泬无遮挡久久久久久| 亚洲精品乱码久久久久66| 亚洲伊人久久成综合人影院 | 久久久99精品成人片中文字幕| 国内精品久久久久久久97牛牛| 一本久道久久综合狠狠爱| 久久只有这里有精品4| 久久综合色区| 久久青青草原精品国产不卡| 久久精品?ⅴ无码中文字幕| 国产精品成人精品久久久| 欧美777精品久久久久网| 久久精品www| 久久国产精品99久久久久久老狼 | 国产A三级久久精品| 一级女性全黄久久生活片免费 | 伊人久久大香线焦AV综合影院 | 亚洲欧美成人综合久久久 | 久久精品久久久久观看99水蜜桃| 国产精品久久婷婷六月丁香| 久久精品人妻中文系列| 久久亚洲精品人成综合网| 久久午夜伦鲁片免费无码| 狠狠色婷婷综合天天久久丁香| 2022年国产精品久久久久| 久久九九亚洲精品| 久久精品中文字幕有码| 久久人妻少妇嫩草AV蜜桃| 久久久精品国产sm调教网站| 久久综合中文字幕| 日本精品久久久久影院日本 | 久久综合九色综合网站| 99久久er这里只有精品18| 久久国产乱子伦精品免费午夜|