玩《休むなP龀狻8分音符ちゃん?》有感

嗨起來

最近有一款日本小游戲劝篷,比較火,就是我標題中寫的這款游戲民宿。用音量來控制角色的移動和跳躍娇妓。感興趣的可以看看這篇文章http://mp.weixin.qq.com/s/5kwX_h-Z6tS5SVJ_S-B6wg
  那作為一個資深程序猿,看到這款游戲的第一想法活鹰,肯定是探究下背后的原理了9 !V救骸(但我的第一想法卻是錄了個視頻發(fā)給朋友娛樂着绷。。赖舟。)

寫了個小Demo

大致效果如下:


效果圖

  <li>小精靈的行動通過獲取麥克風采集到的音量來控制
  <li>小精靈只能上下移動蓬戚,代表跳躍和墜落
  <li>下面的白色溝壑,是一個UIView宾抓,通過移動溝壑子漩,來制造小精靈前進的錯覺豫喧。
  <li>白色UIView在滾動出屏幕后再次從屏幕右側出現,以達到重復出現陷阱的目的
  <li>通過判斷角色是否落在了溝壑上來進行游戲失敗的處理

麥克風的調用

麥克風輸入AVFoundation框架幢泼,所以我們導入:

#import <AVFoundation/AVFoundation.h>

再加兩個屬性紧显,一個用于引用我們調用的麥克風,一個用于定期檢測麥克風的音量大小缕棵。

// 檢測音量的定時器
@property (nonatomic, strong) NSTimer *levelTimer;

// 麥克風
@property (nonatomic, strong) AVAudioRecorder *recorder;

請求麥克風權限孵班,并開始錄音

# pragma mark - 麥克風相關
- (void)askForRecorder {
    // 獲取麥克風權限
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    
    /* 不需要保存錄音文件 */
    NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
    NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
                              [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
                              [NSNumber numberWithInt: 2], AVNumberOfChannelsKey,
                              [NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
                              nil];
    
    NSError *error;
    self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
    if (self.recorder) {
        [self.recorder prepareToRecord];
        self.recorder.meteringEnabled = YES;
        [self.recorder record];
        self.levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
    } else {
        NSLog(@"%@", [error description]);
    }
}

這里iOS10需要在info.plist中加入申請麥克風權限的描述,防止崩潰

<key>NSMicrophoneUsageDescription</key>
<string>讓我調用下相機唄~</string>

timer調用的方法招驴,就能獲取麥克風的音量了

/* 該方法確實會隨環(huán)境音量變化而變化篙程,但具體分貝值是否準確暫時沒有研究 */
- (void)levelTimerCallback:(NSTimer *)timer {
    [self.recorder updateMeters];
    
    float   level;                // The linear 0.0 .. 1.0 value we need.
    float   minDecibels = -80.0f; // Or use -60dB, which I measured in a silent room.
    float   decibels    = [self.recorder averagePowerForChannel:0];
    
    if (decibels < minDecibels)
    {
        level = 0.0f;
    }
    else if (decibels >= 0.0f)
    {
        level = 1.0f;
    }
    else
    {
        float   root            = 2.0f;
        float   minAmp          = powf(10.0f, 0.05f * minDecibels);
        float   inverseAmpRange = 1.0f / (1.0f - minAmp);
        float   amp             = powf(10.0f, 0.05f * decibels);
        float   adjAmp          = (amp - minAmp) * inverseAmpRange;
        
        level = powf(adjAmp, 1.0f / root);
    }
    
    /* level 范圍[0 ~ 1], 轉為[0 ~120] 之間 */
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"%f", level*120);
    });
}

額外再補全UI邏輯就OK了。

附上Demo

https://github.com/ZhaoheMHz/SpeakerDemo 可以在這個基礎上增加陷阱的隨機寬度别厘、角色跳躍高度根據聲音大小來調整等虱饿,能完善好,也是個不錯的仿品触趴。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末氮发,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子冗懦,更是在濱河造成了極大的恐慌爽冕,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件披蕉,死亡現場離奇詭異颈畸,居然都是意外死亡,警方通過查閱死者的電腦和手機没讲,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門承冰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人食零,你說我怎么就攤上這事困乒。” “怎么了贰谣?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵娜搂,是天一觀的道長。 經常有香客問我吱抚,道長百宇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任秘豹,我火速辦了婚禮携御,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己啄刹,他們只是感情好涮坐,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著誓军,像睡著了一般袱讹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昵时,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天捷雕,我揣著相機與錄音,去河邊找鬼壹甥。 笑死救巷,一個胖子當著我的面吹牛,可吹牛的內容都是我干的句柠。 我是一名探鬼主播征绸,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俄占!你這毒婦竟也來了?” 一聲冷哼從身側響起淆衷,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤缸榄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后祝拯,有當地人在樹林里發(fā)現了一具尸體甚带,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年佳头,在試婚紗的時候發(fā)現自己被綠了鹰贵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡康嘉,死狀恐怖碉输,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情亭珍,我是刑警寧澤敷钾,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站肄梨,受9級特大地震影響阻荒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜众羡,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一侨赡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦羊壹、人聲如沸蓖宦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽球昨。三九已至,卻和暖如春眨攘,著一層夾襖步出監(jiān)牢的瞬間主慰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工鲫售, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留共螺,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓情竹,卻偏偏與公主長得像藐不,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秦效,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容