• Cocos2d-x 3.2 Lua演示样本CocosDenshionTest(音频测试)


    Cocos2d-x 3.2 Lua演示样本CocosDenshionTest(音频测试)


     本篇博客介绍Cocos2d-x 3.2中Lua演示样例的音频測试。Cocos2d-x使用SimpleAudioEngine这个类来实现音频的控制,比方播放、暂停、停止等操作。

    Lua代码中。使用的是AudioEngine,详细实现能够參考AudioEngine.lua文件。仅仅是把SimpleAudioEngin进行了封装。


    演示样例代码:

    --[[
    CocosDenshionTest.lua
    Cocos2d-x 音频支持
    ]]--
    require "AudioEngine"
    local EFFECT_FILE = "effect1.wav" 
    
    local MUSIC_FILE = nil
    -- 获取目标平台
    local targetPlatform = cc.Application:getInstance():getTargetPlatform()
    -- iphone或者ipad
    if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) then
      MUSIC_FILE = "background.caf" -- caf格式
    else
      MUSIC_FILE = "background.mp3" -- mp3格式
    end
    
    local LINE_SPACE = 40 
    
    local function CocosDenshionTest()
      local ret = cc.Layer:create()
      local m_pItmeMenu = nil
      local m_tBeginPos = cc.p(0, 0)
      local m_nSoundId = 0
    
      -- 測试菜单项
      local testItems = {
        "play background music",
        "stop background music",
        "pause background music",
        "resume background music",
        "rewind background music",
        "is background music playing",
        "play effect",
        "play effect repeatly",
        "stop effect",
        "unload effect",
        "add background music volume",
        "sub background music volume",
        "add effects volume",
        "sub effects volume",
        "pause effect",
        "resume effect",
        "pause all effects",
        "resume all effects",
        "stop all effects"
      }
    
      -- 菜单回调方法
      local function menuCallback(tag, pMenuItem)
        local nIdx = pMenuItem:getLocalZOrder() - 10000
        -- play background music
        if nIdx ==  0 then
          AudioEngine.playMusic(MUSIC_FILE, true) -- 播放音乐
        elseif nIdx == 1 then
          -- stop background music
          AudioEngine.stopMusic()  -- 停止背景音乐
        elseif nIdx == 2 then
          -- pause background music
          AudioEngine.pauseMusic() -- 暂停音乐
        elseif nIdx == 3 then
          -- resume background music
          AudioEngine.resumeMusic() -- 继续播放音乐
          -- rewind background music
        elseif nIdx == 4 then
          AudioEngine.rewindMusic()  -- 循环播放
        elseif nIdx == 5 then
          -- is background music playing
          if AudioEngine.isMusicPlaying () then -- 音乐正在播放
            cclog("background music is playing")
          else
            cclog("background music is not playing")
          end
        elseif nIdx == 6 then
          -- play effect
          m_nSoundId = AudioEngine.playEffect(EFFECT_FILE)   -- 播放音效
        elseif nIdx == 7 then
          -- play effect
          m_nSoundId = AudioEngine.playEffect(EFFECT_FILE, true) -- 播放音效,第二个參数表示是否循环,true表示循环
        elseif nIdx == 8 then
          -- stop effect
          AudioEngine.stopEffect(m_nSoundId) -- 停止音效
        elseif nIdx == 9 then
          -- unload effect
          AudioEngine.unloadEffect(EFFECT_FILE)  -- 不载入音效
        elseif nIdx == 10 then
          -- add bakcground music volume
          AudioEngine.setMusicVolume(AudioEngine.getMusicVolume() + 0.1) -- 添加音量
        elseif nIdx == 11 then
          -- sub backgroud music volume
          AudioEngine.setMusicVolume(AudioEngine.getMusicVolume() - 0.1) -- 减小音量
        elseif nIdx == 12 then
          -- add effects volume
          AudioEngine.setEffectsVolume(AudioEngine.getEffectsVolume() + 0.1) -- 添加音效音量
        elseif nIdx == 13 then
          -- sub effects volume
          AudioEngine.setEffectsVolume(AudioEngine.getEffectsVolume() - 0.1) -- 降低音效音量
        elseif nIdx == 14 then
          AudioEngine.pauseEffect(m_nSoundId)  -- 暂停音效
        elseif nIdx == 15 then
          AudioEngine.resumeEffect(m_nSoundId) -- 恢复音效
        elseif nIdx == 16 then
          AudioEngine.pauseAllEffects() -- 暂停全部音效
        elseif nIdx == 17 then
          AudioEngine.resumeAllEffects() -- 恢复全部音效
        elseif nIdx == 18 then
          AudioEngine.stopAllEffects() -- 停止全部音效
        end
      end
      -- add menu items for tests
      m_pItmeMenu = cc.Menu:create() -- 创建菜单
    
      m_nTestCount = table.getn(testItems)
      local i = 1
      for  i = 1, m_nTestCount do
        local  label = cc.Label:createWithTTF(testItems[i], s_arialPath, 24)
        label:setAnchorPoint(cc.p(0.5, 0.5))
        local  pMenuItem = cc.MenuItemLabel:create(label) -- 菜单标签
        pMenuItem:registerScriptTapHandler(menuCallback) -- 注冊菜单回调方法
        m_pItmeMenu:addChild(pMenuItem, i + 10000 -1)
        pMenuItem:setPosition( cc.p( VisibleRect:center().x, (VisibleRect:top().y - i * LINE_SPACE) ))
      end
    
      -- 设置菜单内容大小
      m_pItmeMenu:setContentSize(cc.size(VisibleRect:getVisibleRect().width, (m_nTestCount + 1) * LINE_SPACE))
      m_pItmeMenu:setPosition(cc.p(0, 0))
      ret:addChild(m_pItmeMenu)
    
      -- preload background music and effect
      AudioEngine.preloadMusic( MUSIC_FILE ) -- 预载入音乐
      AudioEngine.preloadEffect( EFFECT_FILE ) -- 预载入音效
    
      -- set default volume
      AudioEngine.setEffectsVolume(0.5) -- 设置音效音量
      AudioEngine.setMusicVolume(0.5) -- 设置音乐音量
    
      local function onNodeEvent(event)
        if event == "enter" then -- 进来时
      
        elseif event == "exit" then --  退出时
          AudioEngine.destroyInstance() -- 销毁对象
        end
      end
    
      -- 注冊层的结点事件
      ret:registerScriptHandler(onNodeEvent)
    
      local prev = {x = 0, y = 0}
      local function onTouchEvent(eventType, x, y)
        if eventType == "began" then -- 開始点击
          prev.x = x
          prev.y = y
          m_tBeginPos = cc.p(x, y) -- 開始点击位置
          return true
        elseif  eventType == "moved" then -- 移动事件
          local touchLocation = cc.p(x, y) -- 获取触摸的位置
          local nMoveY = touchLocation.y - m_tBeginPos.y -- 触摸位置减去開始位置等于移动的距离
          local curPosX, curPosY = m_pItmeMenu:getPosition() -- 获取当前菜单的位置
          local curPos = cc.p(curPosX, curPosY) --  当前位置
          local nextPos = cc.p(curPos.x, curPos.y + nMoveY) -- 下一个位置
    
          if nextPos.y < 0.0 then
            m_pItmeMenu:setPosition(cc.p(0, 0))
          end
    
          if nextPos.y > ((m_nTestCount + 1)* LINE_SPACE - VisibleRect:getVisibleRect().height) then
            m_pItmeMenu:setPosition(cc.p(0, ((m_nTestCount + 1)* LINE_SPACE - VisibleRect:getVisibleRect().height)))
          end
    
          m_pItmeMenu:setPosition(nextPos)
          m_tBeginPos.x = touchLocation.x  -- 又一次记录開始位置
          m_tBeginPos.y = touchLocation.y
    
          prev.x = x
          prev.y = y
        end
      end
    
      -- 触摸開始回调方法
      local function onTouchBegan(touch, event)
        local location = touch:getLocation()
        prev.x = location.x
        prev.y = location.y
        m_tBeginPos = location
        return true
      end
    
      -- 触摸移动的回调方法
      local function onTouchMoved(touch, event)
        local location = touch:getLocation()
        local touchLocation = location
        local nMoveY = touchLocation.y - m_tBeginPos.y
        local curPosX, curPosY = m_pItmeMenu:getPosition()
        local curPos = cc.p(curPosX, curPosY)
        local nextPos = cc.p(curPos.x, curPos.y + nMoveY)
    
        if nextPos.y < 0.0 then
          m_pItmeMenu:setPosition(cc.p(0, 0))
        end
    
        if nextPos.y > ((m_nTestCount + 1)* LINE_SPACE - VisibleRect:getVisibleRect().height) then
          m_pItmeMenu:setPosition(cc.p(0, ((m_nTestCount + 1)* LINE_SPACE - VisibleRect:getVisibleRect().height)))
        end
    
        m_pItmeMenu:setPosition(nextPos)
        m_tBeginPos.x = touchLocation.x
        m_tBeginPos.y = touchLocation.y
    
        prev.x = location.x
        prev.y = location.y
      end
    
      -- 单点触摸
      local listener = cc.EventListenerTouchOneByOne:create()
      listener:setSwallowTouches(true)
      -- 注冊脚本监听事件
      listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
      listener:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED )
      local eventDispatcher = ret:getEventDispatcher()
      eventDispatcher:addEventListenerWithSceneGraphPriority(listener, ret)
    
      return ret
    end
    
    function CocosDenshionTestMain()
      cclog("CocosDenshionTestMain")
      local scene = cc.Scene:create()
      scene:addChild(CocosDenshionTest())
      scene:addChild(CreateBackMenuItem())
      return scene
    end
    




    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    企业远程视频会议云服务EasyRTC-SFU版本支持 https 功能设计逻辑
    企业视频远程办公会议通话系统EasyRTC在Windows2012部署运行出现“计算机中丢失VCRUNTIME140.dll”如何解决?
    IP摄像头RTSP协议客户端EasyNVR视频平台提示加密机授权异常原因分析
    【方案搭建】多个工程如何做监控视频的集中管控?EasyNVR视频平台打造智慧工厂新方向
    IP摄像头RTSP协议客户端EasyNVR视频平台如何调用主码流和子码流?
    如何通过私有化部署自建一套基于RTSP协议的视频流媒体边缘计算系统EasyNVR视频平台来实现网络摄像头的实时直播回看?
    IP网络摄像机RTMP协议互联网直播/点播平台EasyDSS直播间录像录制机制说明
    视频上云网关/网络穿透设备EasyNTS下载表格时后端打印报错信息,但是又不影响下载的问题如何解决
    视频高速上云网关EasyNTS组网服务2.1.1新版本无法兼容低版数据库问题解析
    视频上云/网络穿透/网络映射服务EasyNTS前端组织添加页面出现Vue冲突怎么解决?
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4652590.html
Copyright © 2020-2023  润新知