通过该服务,可以轻松查询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.