【技能开发分享】闹钟炸弹设计开发心得


(jun.lukesmail) #1

#【技能开发分享】闹钟炸弹设计开发心得

大家好,我是 ROKID开发者李俊,我今天要给大家介绍闹钟炸弹的设计过程。

玩法介绍:

闹钟炸弹的玩法呢,是由一位玩家设置一个0-3分钟内的随机时间的炸弹后,开始问下一位玩家问题,此时炸弹移交到下一位玩家的头上,下一位玩家回答完问题后再问下一位玩家问题,如此循环,直至倒计时结束,炸弹爆炸,此时炸弹在哪位玩家头上,那一位需要接受惩罚。

设计来源:

这个skill设计来源于某一次在看一期Runningman的时候,里面的主持人正在玩这个游戏,当时觉得很有趣,但是觉得一个手机传来传去地,还得每次都设置一个时间,实在太麻烦了,就想做一个 纯语音的,完全脱离了手的版本。

开发中碰到的问题:

原本想设计为发起者说话开始,若琪发出嘀嗒嘀嗒的闹钟声音,等时间到的时候自动爆炸,但由于目前受限于引擎暂不支持定时器计时功能,因此修改了方案,改成了每次由当前一位玩家回答完问题后呼唤若琪并向下一位玩家发问,若发问期间炸弹爆炸,则此发问玩家接受惩罚。

代码设计:

####语音交互:

{	
	"intents": [
		{
			"intent": "people_say",		
			"slots": [
				
				{
					
					"name": "any",
					
					"type": "ROKID.ANY"
				
				}
			],
			"user_says": [
				"^$any$"
			]
		},
		{
			"intent": "open_tnt",
			"slots": [],
			"user_says": [
				"设定一个闹钟炸弹",
				"新建一个闹钟炸弹"
			]
		}
	]
}

intent,意为意图,可以认为这是这个skill中涉及到的几个用户想要若琪做的事,在这个小游戏里,用户只需要若琪做两个事情:

  1. 设定一个闹钟炸弹(倒计时);

  2. 在每一个用户发问时,检测是否已经到时;

####服务实现:


配置-后端服务-JS engine

exports.handler = function(event, context, callback) {
    var rokid = Rokid.handler(event, context,callback);
    rokid.registerHandlers(handlers);
    rokid.execute();
};
    
var handlers = {
    'ROKID.INTENT.WELCOME':function(){
        this.emit(':tts',{tts:'欢迎来玩闹钟炸弹,你可以对我说设定一个闹钟炸弹或者新建一个闹钟炸弹'});
        this.callback();
    },
    'open_tnt':function() {
        try{
            var end_time = new Date().getTime() + Math.floor(Math.random() * 180000);
            this.emit(':tts',{tts:'开始计时,请在呼叫若琪后向下一位玩家发问哦'},{end_time:end_time});
            this.callback();
        }catch(e){
            this.emit(e);
        }
    },
    'people_say':function() {
        try{
            if(Rokid.param.session.attributes.end_time - new Date().getTime() <= 0){
                this.emit(':media',{itemType: 'AUDIO', url:'http://rokidweb.oss-cn-hangzhou.aliyuncs.com/skills/%E9%97%B9%E9%92%9F%E7%82%B8%E5%BC%B9/6319.wav' });
                this.callback();
            }else{
                this.emit(':tts',{tts:'' });
                this.callback();
            }
        }catch(e){
            this.callback(e);
        }
    }
};

JS Engine负责实现,我在接到intent的时候,该做什么事情,这里在接到intent为:

  1. 打开Skill(ROKID.INTENT.WELCOME),则播放tts欢迎语并告知简单玩法;
  2. 新建闹钟炸弹(open_tnt),则随机一个3分钟内的时间,以此时间作为炸弹爆炸的结束时间;
  3. 发问时检测(people_say),在玩家每次发问时,检测当前是否到达了结束时间,如已到达,则播放爆炸音效,提示时间已到达。

##感想:
通过以上的方式,算是把闹钟炸弹这一个想法通过另一个方式实现了,但是也感受到了目前js-engine可实现的玩法确实有限,对于js-engine的功能的拓展迫在眉睫,毕竟,有更大的期望值,才会有更多人一起参与进来帮助我们的若琪进步。在开发过程中其实还是很有意思的,特别是自己的想法如果可以得以实现成为一个技能的感觉灰常棒!


Rokid开发者大赛第一季
开发者社区Pebble(月石)开发测试固件发布
(寿凯哲) #2

尬舞,哈哈哈,不过挺有趣的。


(yitang) #3

赞!


(chao.xuc) #4

棒棒哒。