張子の虎をキー・タップすると頭が上下に動くLeap Motionプログラムを作る

2013年11月15日(金)
薬師寺 国安

LeapListener.vbのプログラム・コード

リスト6(LeapListener.vb)

01・・・・コード略・・・・
02  Public Overrides Sub OnFrame(ctlr As Controller)
03    ・・・・コード略・・・・
04  If (Not fingers.IsEmpty) Then
05                Dim gestures As GestureList = currentFrame.Gestures
06                For Each gst As Gesture In gestures
07              ' GestureTypeがTYPEKEYTAPであった場合は、
08              ' TapActionメソッドを実行する。
09                  If gst.Type = Gesture.GestureType.TYPEKEYTAP Then
10                    TapAction(fingers, TapDirection.Tap)
11                  End If
12                  Next
13          End If
14      End If
15  End Sub
16 
17' TapEventデリゲート経由で、LeapTapメソッドを呼び出す。
18Public Delegate Sub TapEvent(ByVal sd As TapDirection)
19Public Event LeapTap As TapEvent
20 
21' GestureTypeがTYPEKEYTAPであった場合のTapActionメソッドの処理。
22Private Sub TapAction(ByVal fingers As FingerList, ByVal sd As TapDirection)
23    fingersCount = fingers.Count
24    If (fingersCount = 1) Then
25      Select Case sd
26        Case TapDirection.Tap
27          ' RaiseEventでLeapTapイベントを発生させる。
28          RaiseEvent LeapTap(TapDirection.Tap)
29          Exit Select
30      End Select
31    End If
32  End Sub

クラスの作成(ToraModel.vb)

第1回のサンプルの、SwipeDirection.vbを作成した方法で、ToraModel.vbクラスを作成します。

第1回の「UpDownModel.vb」と同じコードが多いので異なる個所のみ解説します。

(1) 「Private dispatcher = Application.Current.Dispatcher」メンバー変数を宣言しし、ワーカースレッドからUIスレッドに処理を任せます。
(2) Public Sub New内に「AddHandler listener.LeapTap, AddressOf TapAction」を追加します。

上記の変更を行った後、リスト7のコードを作成します。

ToraModel.vbのプログラム・コード

リスト7(ToraModel.vb)

01・・・・コード略・・・・
02Public Class ToraModel
03  Implements INotifyPropertyChanged
04' メンバー変数の宣言
05  Private ctlr As Controller
06  Private listener As LeapListener
07  Private dispatcher = Application.Current.Dispatcher
08 
09' Newメソッド内で、AddHandlerステートメントに、listenerオブジェクトのLeapTap
10' イベントに、TapActionベントハンドラ—を追加する。
11  Public Sub New()
12  ・・・コード略・・・
13    AddHandler listener.LeapTap, AddressOf TapAction
14  End Sub
15・・・・コード略・・・・

TapActionメソッドの処理

TapDirection列挙体の値がTapであった時の処理を記述します。

モジュール変数Indexが1の場合の処理、すなわち、張り子の虎のheadの座標値が取得された場合の処理です。

dispatcher.Invokeを使って、ワーカースレッドからUIスレッドに処理を任せます。
StoryboardをBeginメソッドで開始します。

具体的なコードはリスト8のようになります。

リスト8 張り子の虎の頭をタップしてストーリーボードが実行される処理(TapActionメソッド)

01Private Sub TapAction(ByVal sd As TapDirection)
02    Select Case sd
03      Case TapDirection.Tap
04        If Index = 1 Then
05          dispatcher.Invoke(Sub()' dispatcher.Invokeを使って、ワーカースレッドからUIスレッドに処理を任せる。
06                            strb.Begin()' Storyboardを開始する
07                          End Sub)
08      End If
09      Exit Select
10    End Select
11  End Sub

MainWindow.xaml内に[ToraTapModel]を取り込む。

まず名前空間として「xmlns:local="clr-namespace:ToraTapLeapMotion"」を定義します。

次にプロパティ要素内に「」と記述します。MainWindow.xaml内に「ToraModel」クラスが取り込まれます。リスト9のようになります。

イージング処理も記述されています(ストーリーボードコード内の太字部分)

リスト9 「ToraModel」を取り込んだMainWindo.xaml

01<Window x:Class="MainWindow"
04  xmlns:local="clr-namespace:ToraTapLeapMotion"
05  Title="MainWindow" Height="350" Width="525">
06  <Window.DataContext>
07    <local:ToraModel/>
08  </Window.DataContext>
09  <Window.Resources>
10 
11<!--Blendから設定したStoryboadの設定-->
12      <Storyboard x:Key="Storyboard1">
13        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[1].(SkewTransform.AngleY)" Storyboard.TargetName="head">
14          <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="-20"/>
15          <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0">
16            <EasingDoubleKeyFrame.EasingFunction>
17              <BounceEase EasingMode="EaseIn" Bounces="2" Bounciness="1"/>
18            </EasingDoubleKeyFrame.EasingFunction>
19          </EasingDoubleKeyFrame>
20        </DoubleAnimationUsingKeyFrames>
21        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="head">
22          <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="2"/>
23          <EasingDoubleKeyFrame KeyTime="0:0:1" Value="5">
24            <EasingDoubleKeyFrame.EasingFunction>
25              <BounceEase EasingMode="EaseIn" Bounces="2" Bounciness="1"/>
26            </EasingDoubleKeyFrame.EasingFunction>
27          </EasingDoubleKeyFrame>
28        </DoubleAnimationUsingKeyFrames>
29        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="head">
30          <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="10"/>
31          <EasingDoubleKeyFrame KeyTime="0:0:1" Value="3">
32            <EasingDoubleKeyFrame.EasingFunction>
33              <BounceEase EasingMode="EaseIn" Bounces="2" Bounciness="1"/>
34            </EasingDoubleKeyFrame.EasingFunction>
35          </EasingDoubleKeyFrame>
36        </DoubleAnimationUsingKeyFrames>
37      </Storyboard>
38    </Window.Resources>
39  
40    <Canvas>
41      <Image x:Name="head" HorizontalAlignment="Left" Height="74" VerticalAlignment="Top" Width="90" Source="Images/虎頭.png"  Canvas.Left="165" Canvas.Top="128" Stretch="None">
42        <Image.RenderTransform>
43          <TransformGroup>
44            <ScaleTransform/>
45            <SkewTransform/>
46            <RotateTransform/>
47            <TranslateTransform/>
48          </TransformGroup>
49        </Image.RenderTransform>
50      </Image>
51  
52      <Image x:Name="body" HorizontalAlignment="Left" Height="182" VerticalAlignment="Top" Width="126" Source="Images/虎身体.png" Canvas.Left="221" Canvas.Top="69" Stretch="None" />
53   
54      <InkPresenter Name="paintCanvas"/>
55    </Canvas>
56</Window>

※注意
今回紹介したサンプルコードを動かす際には、「LeapCSharp.NET4.0.dll」や「LeapCSharp.dll」、「Leap.dll」を読者自身のフォルダ内にあるDLLファイルに指定し直さなければ動かない可能性があるので、動かない場合は再指定してください。

  • 張子の虎をキー・タップで動かすLeap Motionプログラム

    『新世代モーションコントローラー Leap Motion -Visual Basicによる実践プログラミング-』 第6回のサンプルプログラムです。
薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています