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.
月別アーカイブ: 2014年4月
TIniFile を使って色の保存
tmpStr := tmpIni.ReadString('design', 'DesignFontColor', IntToStr(DEFAULT_DesignFontColor));
Self.DesignFontColor := StringToAlphaColor(tmpStr);
tmpStr := AlphaColorToString(Self.DesignFontColor);
tmpIni.WriteString ('design', 'DesignFontColor', tmpStr);
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: 証明書の有効期限が切れています。新しいバージョンの証明書をダウンロードします。
ListBox.Clear でエラー
iOS シミュレータの ListBox.Clear でエラー
frmMain.lbxCardList.BeginUpdate; while frmMain.lbxCardList.Items.Count <> 0 do frmMain.lbxCardList.Items.Delete(frmMain.lbxCardList.Items.Count - 1); frmMain.lbxCardList.EndUpdate;
で対応