// -----------------------------------------------------------------------------
// DANBOARD 〜 面倒臭いミウラちゃん〜
// -----------------------------------------------------------------------------
// かなりやっつけですが、
// ・3D コントロール
// ・アニメーション
// ・LiveBinding
//  の複合的なデモとなっています。
// -----------------------------------------------------------------------------
// "ダンボー" が何者かわからない方は　-> http://yotuba.com/yotuba28_01.html
// -----------------------------------------------------------------------------
unit frmuDanboard;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Layouts, FMX.ListBox,
  FMX.Types3D, FMX.Objects3D, FMX.Ani, Data.Bind.EngExt, Fmx.Bind.DBEngExt,
  System.Rtti, System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.Components;

type
  TForm_Danboard = class(TForm)
    Viewport3D1: TViewport3D;
    Light1: TLight;
    Dummy_Danboard: TDummy;
    Cube_Head: TCube;
    Cube_Body: TCube;
    ArcDial_X: TArcDial;
    ArcDial_Y: TArcDial;
    ArcDial_Z: TArcDial;
    Cube_LefttLeg: TCube;
    Cube_RightLeg: TCube;
    Cube_RightArm: TCube;
    Cube_LeftArm: TCube;
    Plane_Skirt_Front: TPlane;
    Plane_Skirt_Back: TPlane;
    Plane_Skirt_Right: TPlane;
    Dummy_Skirt: TDummy;
    Plane_Skirt_Left: TPlane;
    Layout1: TLayout;
    Dummy_Head: TDummy;
    Cylinder_RightEye: TCylinder;
    Cylinder_LeftEye: TCylinder;
    Path3D_Mouth: TPath3D;
    Cube_SwitchShield: TCube;
    Cube_SwitchBevel: TCube;
    Cube_Switch: TCube;
    Dummy_Switch: TDummy;
    Dummy_Coin: TDummy;
    Cube_Coin: TCube;
    Cylinder_Coin: TCylinder;
    Light_LeftEye: TLight;
    Light_RightEye: TLight;
    Timer1: TTimer;
    FloatAnimation_X: TFloatAnimation;
    FloatAnimation_Y: TFloatAnimation;
    FloatAnimation_Z: TFloatAnimation;
    BindingsList1: TBindingsList;
    BindExpressionArcDial_X: TBindExpression;
    BindExpressionArcDial_Y: TBindExpression;
    BindExpressionArcDial_Z: TBindExpression;
    Label_X: TLabel;
    Label_Y: TLabel;
    Label_Z: TLabel;
    procedure ArcDial_Change(Sender: TObject);
    procedure Cube_SwitchClick(Sender: TObject);
    procedure Cube_CoinClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private 宣言 }
    procedure ArcDial_Enabler;
    procedure EyeLight_Enabler;
  public
    { public 宣言 }
  end;

var
  Form_Danboard: TForm_Danboard;

implementation

{$R *.fmx}

// フォーム作成時
procedure TForm_Danboard.FormCreate(Sender: TObject);
begin
  // アニメーションのフレームレート
//FMX.Types.AniFrameRate := 60; // 規定値は 30
end;

// ダイヤル値変更
procedure TForm_Danboard.ArcDial_Change(Sender: TObject);
begin
  // X / Y / Z 軸回転 ノーティファイア
  BindingsList1.Notify(Sender, 'Value');
end;

// コイン投入
// (投入口をクリック)
procedure TForm_Danboard.Cube_CoinClick(Sender: TObject);
begin
  Cube_Coin.Tag := 1;
  ArcDial_Enabler;
  Timer1.Enabled := True;
end;

// スイッチをトグル
// (顔右側面のスイッチをクリック)
procedure TForm_Danboard.Cube_SwitchClick(Sender: TObject);
begin
  Cube_Switch.Tag := Cube_Switch.Tag xor 1;
  EyeLight_Enabler;
end;

// 「私はお金で動く (但し 20 秒)」
// (コイン投入口後 20 秒で動作停止)
procedure TForm_Danboard.Timer1Timer(Sender: TObject);
begin
  Cube_Coin.OnClick   := nil;
  Cube_Switch.OnClick := nil;
  try
    // アイライト消灯
    Cube_Switch.Tag := 0;
    EyeLight_Enabler;

    // 動作停止
    Cube_Coin.Tag := 0;
    ArcDial_Enabler;

    // アニメーションしながらニュートラル位置に復帰
    FloatAnimation_X.Start;
    FloatAnimation_Y.Start;
    FloatAnimation_Z.Start;
  finally
    Cube_Coin.OnClick   := Cube_CoinClick;
    Cube_Switch.OnClick := Cube_SwitchClick;
    Timer1.Enabled := False;
  end;
end;

// ダイアルイネーブラ
procedure TForm_Danboard.ArcDial_Enabler;
begin
  ArcDial_X.Enabled := (Cube_Coin.Tag = 1);
  ArcDial_Y.Enabled := (Cube_Coin.Tag = 1);
  ArcDial_Z.Enabled := (Cube_Coin.Tag = 1);
end;

// アイライトイネーブラ
procedure TForm_Danboard.EyeLight_Enabler;
begin
  Light_LeftEye.Enabled  := (Cube_Switch.Tag = 1);
  Light_RightEye.Enabled := (Cube_Switch.Tag = 1);
  if Cube_Switch.Tag = 0 then
    begin
      // スイッチ OFF
      Cylinder_LeftEye.Material.Ambient  := TAlphaColorRec.Black;
      Cylinder_LeftEye.Material.Diffuse  := TAlphaColorRec.Black;
      Cylinder_RightEye.Material.Ambient := TAlphaColorRec.Black;
      Cylinder_RightEye.Material.Diffuse := TAlphaColorRec.Black;
      Cube_Switch.Position.X := -0.4;
    end
  else
    begin
      // スイッチ ON (カッ！！)
      Cylinder_LeftEye.Material.Ambient  := TAlphaColorRec.Yellow;
      Cylinder_LeftEye.Material.Diffuse  := TAlphaColorRec.Yellow;
      Cylinder_RightEye.Material.Ambient := TAlphaColorRec.Yellow;
      Cylinder_RightEye.Material.Diffuse := TAlphaColorRec.Yellow;
      Cube_Switch.Position.X := 0.8
    end;
end;

end.
