Linderdaum Engineを使用したAndroidのジェスチャーの操作

今日は、 Linderdaum Engineを使用して、Androidでシーンがマルチタッチおよびピンチズームジェスチャーを制御する方法について説明します。



Linderdaum Engineロゴ











1.準備する



Linderdaum Engine SDKはすでにインストールおよび設定されていると想定しています。 postでSDKのセットアップとアプリケーションのコンパイル方法について読むことができますhabrahabr.ru/blogs/gdev/121062さらに必要なのは、マルチタッチをサポートするAndroidデバイスだけです。



2.アプリケーションを作成します



最もコンパクトなコードを記述するために、clPinchZoomHandlerクラスという新しい機能を使用します。 マルチタッチおよび他のジェスチャのハンドラを記述する独立した作業のために、クラスclGestureHandlerがあります。 ハードコアが必要な場合は、L_EVENT_MOTIONイベントをインターセプトできます。これにより、画面上の指のすべてのクリックとリリースを受け取ることができます(PCのマウスを含むため、デバッグがより便利になります)。



プロジェクトウィザードを起動し、次を選択します。







.cppファイルから生成されたすべてをドロップし、そこに次のコードを記述します。



#include "Linderdaum.h" sEnvironment* Env = NULL; clScene* g_Scene = NULL; clPinchZoomHandler* g_PinchZoomHandler = NULL; LMatrix4 Position = LMatrix4::IdentityStatic(); LMatrix4 PositionDelta = LMatrix4::IdentityStatic(); LMatrix4 ZoomDelta = LMatrix4::IdentityStatic(); int g_PlaneID; //      ,     void Event_DRAW( LEvent Event, const LEventArgs& Args ) { //   g_Scene->RenderForward(); //     ,      if ( !g_PinchZoomHandler->IsGestureValid() ) return; if ( g_PinchZoomHandler->IsDraggingValid() ) { //    PositionDelta = g_PinchZoomHandler->GetTranslationMatrix(); } else { //       Position = Position * PositionDelta; PositionDelta = LMatrix4::Identity(); } float ZoomFactor = 1.0f; if ( g_PinchZoomHandler->IsPinchZoomValid() ) { //    ZoomFactor = g_PinchZoomHandler->GetPinchZoomFactor(); ZoomDelta = g_PinchZoomHandler->GetPinchZoomMatrix(); } else { //       Position = Position * ZoomDelta; ZoomDelta = LMatrix4::Identity(); } //      g_Scene->SetLocalTransform( g_PlaneID, Position * PositionDelta * ZoomDelta ); //            size_t NumContacts = g_PinchZoomHandler->GetMotionData()->GetNumTouchPoints(); clCanvas* C = Env->Renderer->GetCanvas(); LString Str1( "Zoom factor: " + LStr::ToStr( ZoomFactor ) ); LString Str2( "Active : " + LStr::ToStr( NumContacts ) ); C->TextStrFreeType( LRect( 0.0f, 0.0f ), Str1, 0.05f, LC_White, NULL, TextAlign_Left ); C->TextStrFreeType( LRect( 0.0f, 0.05f ), Str2, 0.05f, LC_White, NULL, TextAlign_Left ); } //  APPLICATION_ENTRY_POINT { Env = new sEnvironment(); Env->DeployDefaultEnvironment( "", "../../CommonMedia" ); Env->Connect( L_EVENT_DRAWOVERLAY, Utils::Bind( &Event_DRAW ) ); //  ,      clGeom* TestGeom1 = Env->Resources->CreatePlane( 0.1f, 0.2f, 0.9f, 0.8f, -0.1f, 10 ); //     g_Scene = Env->Linker->Instantiate( "clScene" ); g_Scene->SetCameraTransform( LMatrix4::GetTranslateMatrix( LVector3(0.0f) ) ); g_Scene->SetCameraProjection( Env->Renderer->GetCanvas()->GetOrthoMatrices()->GetProjectionMatrix() ); g_Scene->SetUseOffscreenBuffer( false, false ); //      g_PlaneID = g_Scene->AddGeom( TestGeom1 ); //     clMaterial* Mtl = Env->Resources->CreateMaterial(); Mtl->SetPropertyValue( "DiffuseMap", "banner.jpg" ); g_Scene->SetMtl( g_PlaneID, Mtl ); //    -        g_PinchZoomHandler = Env->Linker->Instantiate( "clPinchZoomHandler" ); Env->RunApplication( DEFAULT_CONSOLE_AUTOEXEC ); APPLICATION_EXIT_POINT( Env ); } //  APPLICATION_SHUTDOWN { delete( g_Scene ); delete( g_PinchZoomHandler ); }
      
      





Dataフォルダーにbanner.jpgファイルを保存します。 1つ(256x128):

画像

cygwinを実行して、以下を記述します

ndk-build

ant copy-common-media debug







デバイスの.apkファイルを取得します。



3.結果



これはデバイス上でどのように見えるかです:

画像

1本の指で画像を移動し、2本の指で拡大縮小できます。



SDK自体には、ピンチズームを操作するもう少し複雑な例があります。



All Articles