﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>YuYuYouEr工作室 &#187; Button</title>
	<atom:link href="http://www.yuyuyouer.cn/blog/?feed=rss2&#038;tag=button" rel="self" type="application/rss+xml" />
	<link>http://www.yuyuyouer.cn/blog</link>
	<description>AREA OF 雨雨油儿 ~~ 承接体感互动软件、游戏定制开发 ~~</description>
	<lastBuildDate>Sat, 30 Mar 2024 16:41:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Kinect超时按钮实现 &#8211; 基于qfFSM有限状态自动机类库</title>
		<link>http://www.yuyuyouer.cn/blog/?p=347</link>
		<comments>http://www.yuyuyouer.cn/blog/?p=347#comments</comments>
		<pubDate>Tue, 23 Jul 2013 17:06:20 +0000</pubDate>
		<dc:creator>rabbit5455</dc:creator>
				<category><![CDATA[kinect]]></category>
		<category><![CDATA[qfFSM有限自动机]]></category>
		<category><![CDATA[体感浏览器]]></category>
		<category><![CDATA[Button]]></category>
		<category><![CDATA[fsm]]></category>
		<category><![CDATA[Web体感应用]]></category>
		<category><![CDATA[YuYuYouEr]]></category>
		<category><![CDATA[有限状态自动机]]></category>
		<category><![CDATA[有限自动机]]></category>
		<category><![CDATA[状态机]]></category>

		<guid isPermaLink="false">http://www.yuyuyouer.cn/blog/?p=347</guid>
		<description><![CDATA[qfFSM有限状态自动机类库目前拥有C++、C#、Java、JavaScript版本，对于同一份UML状态图，不同语言均可用qfFSM来实现。 本文使用JavaScript版本在浏览器中实现一个超时按钮，为方便测试，我使用鼠标指针来模拟Kinect关节，接入Kinect数据后，只需将手部关节坐标替换进来即可。 首先看超时按钮的UML状态图： 主状态机中有STATE_Normal、STATE_PointIn、STATE_PointOut三个状态，其中后面两个作为子状态机存在，他们内部分别含有3个状态：激活/非激活开始状态、正在激活/非激活状态、已激活/非激活状态。 设计 正在激活/非激活状态 是为了配合相应动画机制，如经典的按钮注水、按钮转满一周等计时方式。 事件方面支持UserLeave、PointIn、PointOut，以及MultiActive（多次连续激活）。 MultiActive机制可以很方便的实现 保持按住按钮，系统会周期触发某个事件。 源码中分为以下几个部分： 1、首先定义了各种常量：状态名称、事件名称、属性名称： var timeoutButton_const_def = { &#8230; }; 2、定义数据模型Model实现类： var TimeoutButton_Model = { &#8230; }; 在Model中定义各种属性，如激活时间、指针是否在对象可视范围内、计时器开始和结束。 3、定义各个子状态机、状态的实现类，他们分别继承自qfStateMachine/qfState基类，并实现doAction()事件： var State_Normal = { &#8230; }; var STATE_PointIn = { &#8230; }; var STATE_PointOut = { &#8230; }; var STATE_Active_start = { &#8230; }; var STATE_Activing = { [...]]]></description>
			<content:encoded><![CDATA[<p>qfFSM有限状态自动机类库目前拥有C++、C#、Java、JavaScript版本，对于同一份UML状态图，不同语言均可用qfFSM来实现。</p>
<p>本文使用JavaScript版本在浏览器中实现一个超时按钮，为方便测试，我使用鼠标指针来模拟Kinect关节，接入Kinect数据后，只需将手部关节坐标替换进来即可。</p>
<p>首先看超时按钮的UML状态图：</p>
<p><a href="http://www.yuyuyouer.cn/blog/wp-content/uploads/2013/07/kinect_NUI_Button_timeout_detect.jpg"><img class="alignnone size-full wp-image-348" title="kinect_NUI_Button_timeout_detect" src="http://www.yuyuyouer.cn/blog/wp-content/uploads/2013/07/kinect_NUI_Button_timeout_detect.jpg" alt="" width="491" height="293" /></a></p>
<p>主状态机中有STATE_Normal、STATE_PointIn、STATE_PointOut三个状态，其中后面两个作为子状态机存在，他们内部分别含有3个状态：激活/非激活开始状态、正在激活/非激活状态、已激活/非激活状态。</p>
<p>设计 正在激活/非激活状态 是为了配合相应动画机制，如经典的按钮注水、按钮转满一周等计时方式。</p>
<p>事件方面支持UserLeave、PointIn、PointOut，以及MultiActive（多次连续激活）。</p>
<p>MultiActive机制可以很方便的实现 保持按住按钮，系统会周期触发某个事件。</p>
<p>源码中分为以下几个部分：</p>
<p><span id="more-347"></span></p>
<p>1、首先定义了各种常量：状态名称、事件名称、属性名称：</p>
<blockquote><p>var timeoutButton_const_def = { &#8230; };</p></blockquote>
<p>2、定义数据模型Model实现类：</p>
<blockquote><p>var TimeoutButton_Model = { &#8230; };</p>
<p>在Model中定义各种属性，如激活时间、指针是否在对象可视范围内、计时器开始和结束。</p></blockquote>
<p>3、定义各个子状态机、状态的实现类，他们分别继承自qfStateMachine/qfState基类，并实现doAction()事件：</p>
<blockquote><p>var State_Normal =  { &#8230; };</p>
<p>var STATE_PointIn = { &#8230; };</p>
<p>var STATE_PointOut = { &#8230; };</p>
<p>var STATE_Active_start = { &#8230; };</p>
<p>var STATE_Activing = { &#8230; };</p>
<p>var STATE_Actived = { &#8230; };</p>
<p>var STATE_DeActive_start = {&#8230; };</p>
<p>var STATE_DeActiving = { &#8230; };</p>
<p>var STATE_DeActived = { &#8230; };</p></blockquote>
<p>4、定义了主逻辑状态机，继承自qfFsmLogic基类：</p>
<blockquote><p>var timeoutButton_Logic = { &#8230; };</p>
<p>其中核心方法为状态机初始化函数（initTimeoutButtonMachine()成员函数），包含三个方面：</p>
<p>1）设置状态机环境变量，此处只设置数据模型Model，以便各个状态获取数据属性。</p>
<p>2）实例化各个子状态机、状态，并绑定到各自父状态机中。</p>
<p>3）配置状态转移规则，这里完成对UML状态图的描述翻译。</p></blockquote>
<p>5、实例化主逻辑状态机，并调用他的start()方法：</p>
<blockquote><p>var timeoutButton = timeoutButton_Logic.createNewInstance();</p>
<p>timeoutButton.start();</p></blockquote>
<p>6、绑定mouseover、mouseout事件，完成OnTimer()函数，将来的Kinect数据获取也是一个周期性事件，直接放在此处即可。</p>
<p>7、最后是界面的Html代码，其中包含一个多次激活标志checkbox、还有一个支持超时激活的按钮（DIV实现），如下图：</p>
<blockquote><p>其中Current State为状态机当前状态，可以实时看到状态转移过程。</p>
<p><a href="http://www.yuyuyouer.cn/blog/wp-content/uploads/2013/07/kinect_timeoutButton_UI.jpg"><img class="alignnone size-full wp-image-356" title="kinect_timeoutButton_UI" src="http://www.yuyuyouer.cn/blog/wp-content/uploads/2013/07/kinect_timeoutButton_UI.jpg" alt="" width="394" height="356" /></a></p></blockquote>
<p>实现DEMO展示Url：<a href="http://www.YuYuYouEr.cn/code/qfFSM_for_javascript_kinect_timeoutButton/timeoutButton_State_Machine_Test.html" target="_blank">qfFSM_for_javascript_kinect_timeoutButton</a></p>
<p>源代码右键查看即可。</p>
<p>qfFSM各版本源码下载：<a href="http://www.yuyuyouer.cn/blog/?p=290" target="_blank">http://www.YuYuYouEr.cn/blog/?p=290</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yuyuyouer.cn/blog/?feed=rss2&#038;p=347</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>kinect体感交互 &#8211; 按钮激活 &#8211; 超时检测</title>
		<link>http://www.yuyuyouer.cn/blog/?p=271</link>
		<comments>http://www.yuyuyouer.cn/blog/?p=271#comments</comments>
		<pubDate>Sat, 01 Dec 2012 08:29:51 +0000</pubDate>
		<dc:creator>rabbit5455</dc:creator>
				<category><![CDATA[kinect]]></category>
		<category><![CDATA[Button]]></category>

		<guid isPermaLink="false">http://www.yuyuyouer.cn/blog/?p=271</guid>
		<description><![CDATA[整理一下最近kinect交互项目中按钮激活时用到的状态图，希望对大家有帮助。 上图为Button对于某个kinect骨骼节点的响应，处理进入、离开、激活。 状态列表： State_Normal: 常规状态 State_PointOut: 点离开状态 State_PointIn: 点进入 State_CountDown_start: 倒计时开始 State_Active: 激活 State_DeActive: 非激活 事件列表： 无名称的事件弧为AutoTransferEvent，实现状态间的自动转移； event_PointIn: 点进入 event_PointOut: 点离开 event_UserLeave: 用户离开 event_CountDown_end: 倒计时结束 event_enableMultiActive: 允许连续多次激活 最近在项目中使用与kinect手部节点交互的按钮，需要处理手部进入、离开按钮范围，进入后0.5s达到激活态，激活后若手部节点没有离开，则允许连续激活。 在我的项目中Button内部有StateMachine实现，同时持有一个EventListenerManager，允许其他对象注册为EventListener，State_Active/State_DeActive状态会有事件产生。 如果需要实现激活Loading动画，如常见的转满一周或者类似注水的效果，可以在State_CountDown_start状态增加事件通知。 &#160;]]></description>
			<content:encoded><![CDATA[<p>整理一下最近kinect交互项目中按钮激活时用到的状态图，希望对大家有帮助。</p>
<div id="attachment_272" class="wp-caption alignnone" style="width: 523px"><a href="http://www.yuyuyouer.cn/blog/wp-content/uploads/2012/12/kinect_NUI_Button_timeout_detect.jpg"><img class="size-full wp-image-272  " title="kinect_NUI_Button_timeout_detect" src="http://www.yuyuyouer.cn/blog/wp-content/uploads/2012/12/kinect_NUI_Button_timeout_detect.jpg" alt="kinect体感交互 - 按钮激活 - 超时检测" width="513" height="279" /></a><p class="wp-caption-text">kinect体感交互 - 按钮激活 - 超时检测</p></div>
<p>上图为Button对于某个kinect骨骼节点的响应，处理进入、离开、激活。</p>
<p>状态列表：</p>
<p style="padding-left: 30px;">State_Normal: 常规状态<br />
State_PointOut: 点离开状态<br />
State_PointIn: 点进入<br />
State_CountDown_start: 倒计时开始<br />
State_Active: 激活<br />
State_DeActive: 非激活</p>
<p>事件列表：</p>
<p style="padding-left: 30px;">无名称的事件弧为AutoTransferEvent，实现状态间的自动转移；<br />
event_PointIn: 点进入<br />
event_PointOut: 点离开<br />
event_UserLeave: 用户离开<br />
event_CountDown_end: 倒计时结束<br />
event_enableMultiActive: 允许连续多次激活</p>
<p>最近在项目中使用与kinect手部节点交互的按钮，需要处理手部进入、离开按钮范围，进入后0.5s达到激活态，激活后若手部节点没有离开，则允许连续激活。</p>
<p>在我的项目中Button内部有StateMachine实现，同时持有一个EventListenerManager，允许其他对象注册为EventListener，State_Active/State_DeActive状态会有事件产生。</p>
<p>如果需要实现激活Loading动画，如常见的转满一周或者类似注水的效果，可以在State_CountDown_start状态增加事件通知。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yuyuyouer.cn/blog/?feed=rss2&#038;p=271</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
