2016-08-02 4 views
1

私はdrawgridを使用して「ダンジョン」マップを表示しています。私は、各セルにどのようなタイプの物理的な特徴があるのか​​を記述するデータが入った配列を持っています。部屋と廊下などの基本レイアウト。各順列にはPNGがあります。PNGをDelphi XE6 TDrawGridに描画する際のガイダンスが必要

ドローグリッドの各セルに適切なPNGを描画してマップを「描画」しようとしています。 DrawGrid1.Canvas.Draw(x、y、pngImage)を使って多かれ少なかれ直接行うことができますが、正確なx、yをピクセル単位で計算することはグリッドラインのためにイライラします(少なくとも、 )、私は他の問題が私は道を踏み出すだろうか分からない。

pngImage.Draw(DrawGrid1.Canvas、Rect)でも、セルとPNGがすべて40x40ピクセルであるため、実際には不要と思われるRectを計算する必要があります。

与えられたセルのRectは、明らかにあらかじめ計算されています(いくつかの場所で私が読んだものを誤解している場合を除きます)。なぜなら、与えられたARowとAColによって、OnDrawCellがより良い方法であるようです。しかし、私が実際に見つけた例のどれもOnDrawCellがどのようにトリガーされたかを示していません。簡単な答えは、「何かが細胞に引き込まれたとき」は本当にそれをはるかによく説明していません。 これは私がやろうとしているものです。です。

(私は多くの場合、これは、Delphiのドキュメントの場合であることが判明しました:どのように(常にではない正確にあなたの特定のユースケースのために)説明するが、場合、または、なぜが謎に包ま残されている。)

のもちろん、描画グリッドを制御して、セルがクリックされたときにPNGを消去しないようにするなど、他にもいくつかの点があります。

関連する提案があれば幸いです。 TFRM

+1

セルをペイントする必要があるときにOnDrawCellがトリガーされます。簡単な答えは正しくありません。セルをペイントする必要がある場合は、OSによって決定されますが、強制的に実行することができます。 –

+0

あなたのPNGをOnDrawCellで描かないのはなぜですか?私はその質問を理解していないと思う。 –

+0

私はOnDrawCellを理解していないと思います。グリッドを使用している唯一の理由は、PNGを描画した後、ユーザーが隣接する(接続された)セルをクリックして「移動」できることです。私はおそらくそれらをすべてTImageまたは何かに描くことができます。 あなたは、私が本物の描画が行われますので、ちょうどOnDrawCellの火を作るために、任意の特定の目的なしにキャンバスに「描く」ことができると言っていますか? 言われたように、問題は方法ではなく、いつまたはいつかである。 – Pete

答えて

-1

ピクセルで正確なXとYを計算するのがなぜ難しいのですか?それは実際にはかなり簡単です。

長方形の左端を取得するには、列の幅とグリッド線の幅に列の数を単純に掛けます。また、最初の列の左端にグリッド線がある場合は、グリッド線の幅を追加します。

矩形の右端を取得するには、単に前の結果に列の幅を追加するだけです。

とYを計算するためにあなただけのように、コードはこの(私の心から書かれ、テストされていない)

const 
    CellWidth = 40; 
    CellHeight = 40; 
    GridLineThickness = 1; 

procedure DrawCell(Row, Column: Integer; Image: Bitmap); 
var Rect: TRect; 
begin 
    Rect.Left := ((CellWidth + GridLineThickness) * Column) + GridLineThickness; 
    Rect.Right := Rect.Left + CellWidth; 
    Rect.Top := ((CellHeight + GridLineThickness) * Row) + GridLineThickness; 
    Rect.Bottom := Rect.Top + CellHeight; 
    PaintBox1.Canvas.StretchDraw(Rect, Image); 
end; 

そして、あなたがズームする機能が必要な場合のようになります代わりに幅

の高さを使用しますズームインするかズームアウトするには、CellWidthとCellHeightに倍率を掛けます。ズームアウト時には、グリッド線の描画を省略するだけです。

関連する問題