FireMonkey で、Cube1 と Cube2(親はCube1) の2つを描画し、
①マウスの左ボタンを押下したら、Y軸を中心に、 0 -> 90 回転
②マウスの左ボタンを押下したら、Y軸を中心に、 90 -> 180 回転
③マウスの左ボタンを押下したら、Y軸を中心に、180 -> 270 回転
④マウスの左ボタンを押下したら、Y軸を中心に、270 -> 360 回転
と90度づつ回転させたいのですが、ボタンを何度押下しても
0 -> 90 の間でしか回転しません。
①②③④の順に、Cube を回転させるには下記のコードを
どう修正すればいいですか。
詳しい方がいらっしゃいましたら、ご指導の程よろしくお願い致します。
作成手順
ファイル
新規作成
FireMonkey デスクトップアプリケーション
HD FireMonkey アプリケーション
で作成。
フォームに ツールパレットから、Viewport3D,Light,LightMaterialSource,Button を配置します。
フォームをダブルクリックして、uses 節に FMX.Objects3D と FMX,Ani を手入力で追加します。
親子関係
Form1
|
+- Button1
|
+- Viewport3D1
|
+- Light1
|
+- LightMaterialSource1
|
+- Cube1 //<-- ツールパレットから配置ではなく、コードで記述する。
|
+- FloatAnimation //<-- ツールパレットから配置ではなく、コードで記述する。
|
+- Cube2 //<-- ツールパレットから配置ではなく、コードで記述する。
// Unit1.pas ここから
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects3D, FMX.MaterialSources, FMX.Controls3D, FMX.Viewport3D,Fmx.Ani;
type
TForm1 = class(TForm)
Viewport3D1: TViewport3D;
Light1: TLight;
LightMaterialSource1: TLightMaterialSource;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ private 宣言 }
Img_Cube1 : TCube;
Img_Cube2 : TCube;
public
{ public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
with TFloatAnimation.Create(Viewport3D1) do begin
Parent := Img_Cube1;
PropertyName := 'RotationAngle.Y';
AnimationType := TAnimationType.atIn;
AutoReverse := False;
Duration := 0.3;
Loop := False;
//Name := 'FloatAnimation1';
Enabled := True;
Interpolation := TInterpolationType.itLinear;
StopValue := Img_Cube1.RotationAngle.Y + 90;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Img_Cube1 := TCube.Create(Viewport3D1);
Img_Cube1.Parent := Viewport3D1;
TCube(Img_Cube1).MaterialSource := LightMaterialSource1;
LightMaterialSource1.Diffuse := TAlphaColorRec.Green;
Img_Cube1.SetSize(2, 2, 2);
Img_Cube1.Position.Point := Point3D(0, 0, 0);
Img_Cube2 := TCube.Create(nil);
Img_Cube2.Parent := Img_Cube1;
TCube(Img_Cube2).MaterialSource := LightMaterialSource1;
LightMaterialSource1.Diffuse := TAlphaColorRec.Green;
Img_Cube2.SetSize(1, 1, 1);
Img_Cube2.Position.Point := Point3D(3, 3, 1);
end;
end.
// Unit1.pas ここまで
使用環境
Delphi XE5 Pro Update2
Win7 Pro 64bit SP1
1.Enabled の位置がマズいです。
Interpolation := TInterpolationType.itLinear;
StopValue := Img_Cube1.RotationAngle.Y + 90;
Enabled := True;
これで回るようにはなります。
2.StartValue が常に 0 です。
このままだと、
0->90
0->180
0->270
...
と回転してしまいます。
StartValue := Img_Cube1.RotationAngle.Y;
StopValue := Img_Cube1.RotationAngle.Y + 90;
Enabled := True;
このように開始値を入れるか、
StartFromCurrent := True;
StopValue := Img_Cube1.RotationAngle.Y + 90;
Enabled := True;
StartFromCurrent を True にして現在位置から回転するようにする必要があります。
StartValue := Img_Cube1.RotationAngle.Y;
と
StartFromCurrent := True;
で、
意図する動作になる事を確認しました。
DEKOさん、ご指導ありがとうございました。
ツイート | ![]() |