Fire Monkey 3D で、Form を作成し、ツールパレットから
3D Shapes の TRoundCube を Form に貼り付けます。
(ここまでは自分でできます)
マウスの左ボタンをシングルクリックしたら、TRoundCube が、
Y軸を軸にして90度回転させるにはどういうコードを書けば
いいでしょうか。
初心者ですので詳しく教えて頂けないでしょうか。
詳しい方がいらっしゃいましたらご指導の程よろしくお願い致します。
90度だと回転してるかどうか判りにくいので 45度で。
procedure TForm1.RoundCube1Click(Sender: TObject);
begin
RoundCube1.RotationAngle.Y := RoundCube1.RotationAngle.Y + 45;
end;
[ダ○ボー サンプルソースコード]
http://ht-deko.minim.ne.jp/software/danboard.zip
[右手座標系 サンプルソースコード]
http://ht-deko.minim.ne.jp/software/righthandrule.zip
[FireMonkey [3D Shapes] Demo (Youtube)]
http://www.youtube.com/watch?v=UHmYKVz_oME
> 初心者ですので
FireMonkey に関しては誰だって素人だと思いますよ。
×: 素人
○: 初心者
ありがとうございました。
できました。ありがとうございました。
もう1ついいでしょうか。
このコードですと、マウスを
TRoundCube上にマウスを置かないと
動きません。
TRoundCube上でなくForm上にマウスがあって、
マウスの左ボタンをシングルクリックしたらY軸を軸に
45°TRoundCubeを回転させるには
どうコードを書けばいいでしょうか。
ご指導の程よろしくお願い致します。
こんにちは.
>マウスの左ボタンをシングルクリックしたらY軸を軸に
シングルクリックというのは,OnClick イベントということになります.
しかし,OnClick イベントだと,マウスボタンの左右とかを判定する引数があません.
そこで,OnMouseDown や OnMoseUp イベントで処理することが多いようです.
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Single);
begin
if Button = TMouseButton.mbLeft then begin
// 処理
end;
end;
XE 2 の FireMonkey には OnClick はありません.XE3 は知りません
質問の時は,自分の環境を書きましょうね
今回は,処理コードは,既に DEKOさんが示しています.
だから,「シングルクリックのコード」の問題だと思います.
何がわからないのかを,分析して,ハッキリさせることが問題解決の一歩だと思います.
> このコードですと、マウスをTRoundCube上にマウスを置かないと動きません。
...そうですね。
1.TRoundCube の HitTest プロパティを False にする。
2.Form の OnMousedown イベントハンドラを以下のように記述する。
procedure TForm1.Form3DMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Single);
begin
if (Button = TMouseButton.mbLeft) then
RoundCube1.RotationAngle.Y := RoundCube1.RotationAngle.Y + 45;
end;
HitTest についてはこちらを参照の事。
[画像付きのボタンは? (Delphi FireMonkey Tips)]
http://ht-deko.minim.ne.jp/techf007.html
もしかしたら,シングルクリックの動作に近いのは,
OnMouseUp かも知れませんね.
> もしかしたら,シングルクリックの動作に近いのは,
> OnMouseUp かも知れませんね.
ですね。
以下に、OnClick に似た実装を書いておきます。
private
{ private 宣言 }
FPoint: TPointF;
...
procedure TForm1.Form3DMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Single);
begin
FPoint.X := X;
FPoint.Y := Y;
end;
procedure TForm1.Form3DMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Single);
var
dPoint: TPointF;
function CalcDist(a, b: TPointF): Single;
begin
result := Sqrt(Sqr(a.X - b.X) + Sqr(a.Y - b.Y));
end;
begin
if (Button = TMouseButton.mbLeft) then
begin
dPoint.X := X;
dPoint.Y := Y;
if CalcDist(FPoint, dPoint) < 4 then
RoundCube1.RotationAngle.Y := RoundCube1.RotationAngle.Y + 45;
end;
end;
仕様:
MouseDown された位置と MouseUp された位置の二点間の距離が 4px 以下かつ、
マウスの左ボタンの処理だったらクリック扱いとする。
(マウスで押しっぱなしのまま 4px 以上移動してボタンを離すとクリックにはならない)
# VCL の挙動とは異なりますが、
# この後にダブルクリック判定を組み込むのが楽になります。
できました。
ご指導ありがとうございました。
(MouseのUpとDownの両方確認しました)
できたので意味はありませんが、
私の使用環境は、
WIN7 SP1 64bit
Delphi XE2 Update4 Hotfix1
です。
2012/09/19 のエンバカのWEBセミナー(HTML5の)を見てから
Delphi XE3 だけ買うか RAD Studio XE3 を買うか
判断しようと思います。(RADは超高価ですからね)
Delphiの質問なら他のQ&Aサイトよりやっぱりこのサイトですね。
> できたので意味はありませんが、
エスパーしたのがたまたま当たっただけで、
環境は真っ先に書くべきものだと思いますよ。
> Delphiの質問なら他のQ&Aサイトよりやっぱりこのサイトですね。
公式フォーラムで質問して頂いていたらそちらで回答していたと思います (^^;A
[Embarcadero 公式フォーラム]
https://forums.embarcadero.com/category.jspa?categoryID=3
こんにちは.
>できたので意味はありませんが、
>私の使用環境は、
>WIN7 SP1 64bit
>Delphi XE2 Update4 Hotfix1
>です。
そんなことはないですよ.DEKO さんのところに以下のような記事があります.
http://ht-deko.minim.ne.jp/tech045.html#tech095
これは,主に質問者側から見た記事ですが,私のように,スキルのない者にとっても,
貴重な情報源です.
「なるほど,この環境,この Delphi のバージョンではそうなのか」
という情報が得られるんです.
ですから,後からでもいいので,環境を,それこそ「教えて頂きたい」というのも本音です.
この掲示板は,数少ない Delphi の情報源になっています.少なくとも私にとっては.
ツイート | ![]() |