月別アーカイブ: 2014年4月

花火 アニメーションサンプル


unit untFireworks;

interface

uses
  System.Types,
  System.UITypes,
  System.Classes,
  System.UIConsts,
  FMX.Filter.Effects,
  FMX.Controls,
  FMX.Effects,
  FMX.Ani,
  FMX.Types,
  FMX.Objects;


type
  TFireWorksStatus = record
  private
  public
    StartX: Single;
    FireY: Single;
    FireRadius: Single;
    FireColorHue:  Single;      // -1 から 1 までの値を取る
    LauncherDelay:  Single;
    LauncherDuration:  Single;
    FireDuration:  Single;

    BallRadius: Single;
    BallCount:  Integer;
    BallBitmap: TBitmap;

    LauncherWidth: Single;
    LauncherHeight: Single;

  end;

type
  TFireworks = class
  private
    FTimer: TTimer;

    FParentImage: TImage;
    FOwner:       TComponent;

    FStatus: TFireWorksStatus;

    FLauncher:    TRectangle;
    FLauncherPositionYAnimation: TFloatAnimation;
    FLauncherBlur: TBlurEffect;


    FBall:                  Array of TCircle;
    FBallImage:             Array of TImage;
    FBallPositionAnimation: Array of TPathAnimation;
    FBallOpacityAnimation:  Array of TFloatAnimation;
    FBallHueAdjustEffect:   Array of THueAdjustEffect;

    procedure OnTimer(Sender: TObject);
    procedure OnFLauncherPositionYAnimationFinish(Sender: TObject);
    procedure OnBallOpacityAnimationFinish(Sender: TObject);

    function getScreenHeight: Single;
    function getScreenWidth: Single;

    property ScreenWidth:  Single read getScreenWidth;
    property ScreenHeight: Single read getScreenHeight;

  public

    constructor Create(aOwner: TComponent;
                              aParent: TImage;
                              aFireWorksStatus: TFireWorksStatus);
    destructor Destroy(); override;

    procedure Fire();


  end;

const
  START_POSITION_V_MARGIN  = 0.1;
  START_POSITION_H_MARGIN  = 0.1;
  FINISH_POSITION_V_MARGIN = 0.1;

implementation


{ TFireworks }

constructor TFireworks.Create(aOwner: TComponent;
                              aParent: TImage;
                              aFireWorksStatus: TFireWorksStatus);
var
  i: Integer;
  tmpRad: Single;
begin

  FTimer          := TTimer.Create(nil);
  FTimer.OnTimer  := OnTimer;
  FTimer.Enabled  := False;

  FOwner := aOwner;
  FParentImage := aParent;
  FParentImage.ClipChildren := True;

  FStatus := aFireWorksStatus;

  //
  FTimer.Interval := Round(FStatus.LauncherDelay * 1000);
  FTimer.Enabled := False;
  //
  FLauncher := TRectangle.Create(FOwner);
  FLauncher.Parent := FParentImage;
  FLauncher.Visible := False;

  FLauncherBlur := TBlurEffect.Create(FOwner);
  FLauncherBlur.Parent := FLauncher;
  FLauncherBlur.Softness := 0.1;

  with FStatus do
  begin
    FLauncherPositionYAnimation := TFloatAnimation.Create(FOwner);
    FLauncherPositionYAnimation.Parent := FLauncher;
    FLauncherPositionYAnimation.PropertyName := 'Position.Y';
    FLauncherPositionYAnimation.OnFinish  := OnFLauncherPositionYAnimationFinish;

    FLauncher.Width      := LauncherWidth;
    FLauncher.Height     := LauncherHeight;
    FLauncher.Position.X := StartX - LauncherWidth  / 2;
    FLauncher.Position.Y := Self.ScreenHeight * 0.95 - LauncherHeight / 2;

    FLauncherPositionYAnimation.StartValue := FLauncher.Position.Y;
    FLauncherPositionYAnimation.StopValue  := FireY - LauncherHeight / 2;
    FLauncherPositionYAnimation.Duration   := LauncherDuration;
    FLauncherPositionYAnimation.AnimationType := TAnimationType.atOut;
    FLauncherPositionYAnimation.Interpolation := TInterpolationType.itCubic;
  end;


  //
  SetLength(FBall,                  FStatus.BallCount);
  SetLength(FBallPositionAnimation, FStatus.BallCount);
  SetLength(FBallOpacityAnimation,  FStatus.BallCount);
  SetLength(FBallImage,             FStatus.BallCount);
  SetLength(FBallHueAdjustEffect,   FStatus.BallCount);

  for i := 0 to FStatus.BallCount - 1 do
  begin

    FBallImage[i]            := TImage.Create(FOwner);
    FBallImage[i].Parent     := FParentImage;
    FBallImage[i].Bitmap.Assign(FStatus.BallBitmap);
    FBallImage[i].Width      := FStatus.BallRadius * 2;
    FBallImage[i].Height     := FStatus.BallRadius * 2;
    FBallImage[i].Position.X := FStatus.StartX - FStatus.BallRadius;
    FBallImage[i].Position.Y := FStatus.FireY - FStatus.BallRadius;
    FBallImage[i].RotationAngle := (360 / FStatus.BallCount) * i + 90;
    FBallImage[i].Visible     := False;

    //
    FBallPositionAnimation[i] := TPathAnimation.Create(FOwner);
    FBallPositionAnimation[i].Parent := FBallImage[i];
    FBallPositionAnimation[i].Duration := FStatus.FireDuration * 0.8;
    FBallPositionAnimation[i].AnimationType := TAnimationType.atOut;
    FBallPositionAnimation[i].Interpolation := TInterpolationType.itCubic;
    FBallPositionAnimation[i].Path.Clear;
    FBallPositionAnimation[i].Path.MoveTo(PointF(0, 0));
    tmpRad := (2 * PI / FStatus.BallCount) * i;
    FBallPositionAnimation[i].Path.LineTo(PointF(Cos(tmpRad) * FStatus.FireRadius,
                                                 Sin(tmpRad) * FStatus.FireRadius));

    //
    FBallOpacityAnimation[i] :=TFloatAnimation.Create(FOwner);
    FBallOpacityAnimation[i].Parent := FBallImage[i];
    FBallOpacityAnimation[i].PropertyName := 'Opacity';
    FBallOpacityAnimation[i].Duration   := FStatus.FireDuration;
    FBallOpacityAnimation[i].StartValue := 1;
    FBallOpacityAnimation[i].StopValue  := 0.1;
    FBallOpacityAnimation[i].AnimationType := TAnimationType.atIn;
    FBallOpacityAnimation[i].Interpolation := TInterpolationType.itCubic;

    //
    FBallHueAdjustEffect[i] := THueAdjustEffect.Create(FOwner);
    FBallHueAdjustEffect[i].Parent := FBallImage[i];
    FBallHueAdjustEffect[i].Hue := FStatus.FireColorHue;

  end;

  // 代表として Index 0 を基準にする
  FBallOpacityAnimation[0].OnFinish := OnBallOpacityAnimationFinish;

end;

destructor TFireworks.Destroy;
begin
  FTimer.Free;
  inherited;
end;

function TFireworks.getScreenHeight: Single;
begin
  Result := FParentImage.Height;
end;

function TFireworks.getScreenWidth: Single;
begin
  Result := FParentImage.Width;
end;

procedure TFireworks.OnBallOpacityAnimationFinish(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to FStatus.BallCount - 1 do
  begin
    FBallImage[i].Visible := False;
  end;

  self.Free;
end;

procedure TFireworks.OnFLauncherPositionYAnimationFinish(Sender: TObject);
var
  i: Integer;
begin
  FLauncher.Visible := False;
  for i := 0 to FStatus.BallCount - 1 do
  begin
    FBallImage[i].Visible := True;
    FBallPositionAnimation[i].Start();
    FBallOpacityAnimation[i].Start();
  end;
end;

procedure TFireworks.OnTimer(Sender: TObject);
begin
  FLauncher.Visible := True;
  FLauncherPositionYAnimation.Start();
  FTimer.Enabled := False;
end;

procedure TFireworks.Fire;
begin
  // Start
  FTimer.Enabled := True;
end;


end.

Unable to locate DeviceSupport directory matched with connected device info

‘Unable to locate DeviceSupport directory matched with connected device info’(接続したデバイスの情報に一致する DeviceSupport ディレクトリが見つかりません)

デバイスの iOS バージョンを最近アップグレードした場合は、iOS デバイスでアプリケーションを実行しようとしたときに上記のエラー メッセージが出力される可能性があります。このメッセージが表示されたら、以下の手順を実行してください。

メッセージを閉じます。
Mac で Xcode を開きます。
[ウインドウ|オーガナイザ]を選択し、お使いのデバイスが Xcode で認識されるかどうかを判断して、以下を行います。
デバイスが Xcode で認識される場合は、Xcode にデバイスのサポート情報をインポートし直し、RAD Studio からアプリケーションを再度実行してみます。
デバイスが Xcode で認識されない場合は、Xcode をアップグレードする必要があります。

メモ: あるいは、デバイスが Xcode で認識されないが、お使いの Mac の Xcode をアップグレードしたくないという場合には、お使いのデバイスを認識するアップグレード版の Xcode がインストールされている別の Mac にデバイスを接続してみることもできます。お使いのデバイスのサポート情報を新しいバージョンの Xcode で再度インポートしたら、古いバージョンの Xcode で、アップグレードした iOS デバイスも認識されるようになる可能性があります。

エラーメッセージ: Unable to install package

e8008016 は???

e8000018: 証明書の有効期限が切れています。新しいバージョンの証明書をダウンロードします。

e800001c: iOS シミュレータが Mac 上で動作している場合は、シミュレータを終了し、アプリケーションを iOS デバイス上でもう一度実行してみます。

e800002d: お使いの iOS デバイスを再起動します。詳細については、Apple サポート コミュニティの関連スレッドを参照してください。

e800007e: お使いの iOS デバイスのバージョンが、デフォルトの最小バージョンを下回っています。[プロジェクト|オプション…|Delphi コンパイラ|リンク]を選択し、[サポートされている iOS の最小バージョン]をお使いの iOS デバイスのバージョンに変更します。たとえば、5.0 などに変更します (それでもうまくいかない場合は、新しい iOS デバイスを入手しなければならない可能性があります)。

e8000080: プロジェクトに定義されている iOS フォーム ファクタ(UIDeviceFamily)に一致しない iOS デバイスで iOS アプリケーションを実行しようとしています。たとえば、iOS アプリケーションが iPhone でのみ動作するように構成されているにもかかわらず、そのアプリケーションを iPad で実行しようとしている場合などです。[プロジェクト|オプション…|バージョン情報]を選択し、お使いの iOS デバイスに一致する UIDeviceFamily キー値を選びます。たとえば、アプリケーションを任意の iOS デバイスで実行する場合は、[iPhone および iPad]を選択します。

e8008015:RAD Studio で構成したプロビジョニング プロファイルがターゲット iOS デバイスに準備されていません。構成済みのプロビジョニング プロファイルをターゲット デバイスに準備するか、RAD Studio のプロジェクト構成を別のプロビジョニング プロファイルに変更します。「[プロビジョニング]ページに必要な情報をすべて入力する」を参照してください。RAD Studio 内のプロビジョニング データが、Mac デベロッパ アカウントではなく iOS デベロッパ アカウントに必ず一致するようにします。iOS デベロッパ証明書名を指定する際は、特に注意してください。

e8008018: 証明書の有効期限が切れています。新しいバージョンの証明書をダウンロードします。