Delphi/Lazarus/Pascal基于Castle Engine的IOS人体活动识别

通过该服务,可以轻松查询iPhone上当前的用户活动(步行,跑步,骑自行车等)。

服务是使用具有特定于平台的实现并可以与第三方库链接的其他代码来增强应用程序的方法。查看有关iOS服务和Android服务的更多信息。您可以在CastleEngineManifest.xml中声明它们,然后使用我们的构建工具来构建您的应用程序。

现在,我们有了一个名为activity_recognition的新iOS服务。泰山老父演示位于引擎源的examples / mobile / activity_recognition子目录下。该演示是跨平台的,但是目前不会报告除iOS以外的其他平台上的任何活动。

Pascal API 记录在CastleActivityRecognition单元中(特别是参见TActivityRecognition类)。

{
  Copyright 2020-2020 Michalis Kamburelis.
  This file is part of "Castle Game Engine".
  "Castle Game Engine" is free software; see the file COPYING.txt,
  included in this distribution, for details about the copyright.
  "Castle Game Engine" is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  ----------------------------------------------------------------------------
}

{ Main state, where most of the application logic takes place. }
unit GameStateMain;

interface

uses CastleUIState, CastleScene, CastleControls,
  CastleKeysMouse, CastleColors, CastleViewport, CastleUIControls,
  CastleActivityRecognition;

type
  { Main state, where most of the application logic takes place. }
  TStateMain = class(TUIState)
  private
    ActivityRecognition: TActivityRecognition;
    LabelStatus: TCastleLabel;
    ButtonStartListening: TCastleButton;
    ButtonStopListening: TCastleButton;
    procedure ClickStartListening(Sender: TObject);
    procedure ClickStopListening(Sender: TObject);
    procedure ActivityRecognitionChange(Sender: TObject);
    procedure UpdateStatus;
  public
    procedure Start; override;
  end;

var
  StateMain: TStateMain;

implementation

uses SysUtils, Classes,
  CastleUtils, CastleComponentSerialize;

{ TStateMain ----------------------------------------------------------------- }

procedure TStateMain.Start;
var
  UiOwner: TComponent;
begin
  inherited;

  { Load designed user interface }
  InsertUserInterface('castle-data:/state_main.castle-user-interface', FreeAtStop, UiOwner);

  { Find components, by name, that we need to access from code }
  LabelStatus := UiOwner.FindRequiredComponent('LabelStatus') as TCastleLabel;
  ButtonStartListening := UiOwner.FindRequiredComponent('ButtonStartListening') as TCastleButton;
  ButtonStopListening := UiOwner.FindRequiredComponent('ButtonStopListening') as TCastleButton;

  ButtonStartListening.OnClick := @ClickStartListening;
  ButtonStopListening.OnClick := @ClickStopListening;

  ActivityRecognition := TActivityRecognition.Create(FreeAtStop);
  ActivityRecognition.OnChange := @ActivityRecognitionChange;
  ActivityRecognition.Start;

  UpdateStatus;
end;

procedure TStateMain.UpdateStatus;
var
  S: String;
begin
  S := 'Started:' + BoolToStr(ActivityRecognition.Started, true) + NL + NL;
  if not ActivityRecognition.ActivityValid then
    S += 'Not yet detected anything.' + NL
  else
    S += 'Detected:' + NL +
      NL +
      'Possible Activities:' + NL +
      PossibleActivitiesToStr(ActivityRecognition.PossibleActivities, ',') + NL +
      NL +
      'Most Useful Activity' + NL +
      '(from the Possible set):' + NL +
      ActivityToStr(ActivityRecognition.Activity) + NL +
      NL +
      'Confidence:' + NL +
      ActivityConfidenceToStr(ActivityRecognition.ActivityConfidence) + NL +
      NL +
      'Changed at: ' + FormatDateTime('yyyy"-"mm"-"dd" "tt', ActivityRecognition.ActivityTime) + NL;
  LabelStatus.Caption := S;
end;

procedure TStateMain.ClickStartListening(Sender: TObject);
begin
  ActivityRecognition.Start;
  UpdateStatus;
end;

procedure TStateMain.ClickStopListening(Sender: TObject);
begin
  ActivityRecognition.Stop;
  UpdateStatus;
end;

procedure TStateMain.ActivityRecognitionChange(Sender: TObject);
begin
  UpdateStatus;
end;

end.
{ Game initialization.
  This unit is cross-platform.
  It will be used by the platform-specific program or library file. }
unit GameInitialize;

interface

implementation

uses CastleWindow, CastleLog, CastleApplicationProperties, CastleUIState,
  GameStateMain;

var
  Window: TCastleWindowBase;

{ One-time initialization of resources. }
procedure ApplicationInitialize;
begin
  { Adjust container settings for a scalable UI (adjusts to any window size in a smart way). }
  Window.Container.LoadSettings('castle-data:/CastleSettings.xml');

  StateMain := TStateMain.Create(Application);
  TUIState.Current := StateMain;
end;

initialization
  { Set ApplicationName early, as our log uses it.
    Optionally you could also set ApplicationProperties.Version here. }
  ApplicationProperties.ApplicationName := 'activity_recognition';

  { Start logging. Do this as early as possible,
    to log information and eventual warnings during initialization.
    For programs, InitializeLog is not called here.
    Instead InitializeLog is done by the program main file,
    after command-line parameters are parsed. }
  if IsLibrary then
    InitializeLog;

  { Initialize Application.OnInitialize. }
  Application.OnInitialize := @ApplicationInitialize;

  { Create and assign Application.MainWindow. }
  Window := TCastleWindowBase.Create(Application);
  Application.MainWindow := Window;

  { On desktops, change the initial window size to simulate a tall screen,
    like mobile in a "portrait" orientation. }
  {$if not (defined(CASTLE_IOS) or defined(ANDROID) or defined(CASTLE_NINTENDO_SWITCH))}
  Window.Height := Application.ScreenHeight * 5 div 6;
  Window.Width := Window.Height * 900 div 1600;
  {$endif}

  { You should not need to do *anything* more in the unit "initialization" section.
    Most of your game initialization should happen inside ApplicationInitialize.
    In particular, it is not allowed to read files before ApplicationInitialize
    (because in case of non-desktop platforms,
    some necessary resources may not be prepared yet). }
end.

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值