[過去ログ] Delphiゲームプログラミング相談室 (976レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
904(1): 名前は開発中のものです。 [] 2006/05/27(土) 03:47:07 ID:DbCpqm4N(2/5) AAS
で、手段はいくつかある。
まず、用語解説。一般的じゃないかもしれんが、勘弁してくれ。
バックバッファ: ちらつかないようにするための裏画面
表示バッファ: 画面に見える
その1、TImageを利用する方法
・表示バッファ用のTImage
VisibleをTrueにしとく
・バックバッファ用のTImage
VisibleをFalseにしとく
・キャラクタ画像用のTImage複数
VisibleをFalse、TransparentをTrue、
あらかじめ適当な画像を読み込んでおく
あとは、
・バックバッファを適当に消去
Canvas.FillRectあたりを使う
・キャラ画像をバックバッファにコピー
TImage.Canvas.Drawを使う
・バックバッファを表示バッファにコピー
上と同じ
これで、キャラ画像の背景を透過して、
ちらつかないで画像が表示できる(はず)
速度はちと遅い(でも数年前の話)けど、慣れたら簡単
905(2): 名前は開発中のものです。 [] 2006/05/27(土) 03:57:04 ID:DbCpqm4N(3/5) AAS
↑ウマくいかんだら、聞いてね。昔やった方法だから、忘れてるかも
その2、TBitmapを使う方法
・表示用のTImageを用意する
・バックバッファ用のTBitmapを用意する
・キャラクタ画像用のTBitmapを用意する
LoadFromFileとかで、実行時に画像を読み込む
TBitmapはFormCreateとかで、Createするのをお忘れなく。
あとは、
・バックバッファを消去
・キャラ画像をバックバッファにコピー
Canvas.Drawとか、
ScanLineとか使って、コピー
・バックバッファを表示バッファにコピー
Canvas.Drawでいいか?
906(1): 名前は開発中のものです。 [] 2006/05/27(土) 03:58:18 ID:DbCpqm4N(4/5) AAS
その3、DirectXを使う方法
DirectXでも、DirectDrawとかDirect3Dがある。
これは、SDKとか落としてきて、CとかC++の資料を見ればわかる。
グラフィックカードにもよるが、一番これが速度が速い。
907(2): 名前は開発中のものです。 [] 2006/05/27(土) 04:03:09 ID:DbCpqm4N(5/5) AAS
って、ここまで書いて、元の質問が、ローソク足描くだけのことだと気づいた。
俺の苦労はいったい・・・ orz
908: 名前は開発中のものです。 [sage] 2006/05/27(土) 05:07:06 ID:qKgM8ReK(1) AAS
>>907
(´・ω・)カワイソス
きっと君の書いたチュートリアルに感謝する初心者もいるはずさ・・・!
909: 名前は開発中のものです。 [sage] 2006/05/27(土) 17:20:02 ID:cvS7Jxha(1/2) AAS
>>905
解説するのはいいがTBitmapを解放することも教えてやれよ
910(1): 名前は開発中のものです。 [sage] 2006/05/27(土) 19:03:50 ID:cvS7Jxha(2/2) AAS
いま気付いた。マグロ漁船
911(1): 名前は開発中のものです。 [sage] 2006/05/28(日) 03:30:14 ID:T/x78PMQ(1) AAS
>903-907
補足しておく。
TForm(TWinControl)のDoubleBufferedプロパティをTrueにすれば同じ効果が得られる。
後、画面がちらつくのは一度画面クリアしてから描画を行っているからなので、ダブルバッファを使わなくても画面クリアを行わないようにすればちらつかない。
del6で確認した所procedure Paint;時に画面クリアしているので、overrideして内部でinheritedを呼ばないようにすればOK。
ゲーム用ならTFormのprocedure Paintをoverrideして直接Canvasに描画するやり方が楽かも。
912: 名前は開発中のものです。 [sage] 2006/05/28(日) 04:57:34 ID:NI/jAZBG(1) AAS
へぇ、それでPaintイベントを止めるってわけか
913: 名前は開発中のものです。 [sage] 2006/05/29(月) 02:36:12 ID:uZN4PARX(1) AAS
通りすがりだが参考になったよ
サンクスコ
914(1): ぬ [sage] 2006/05/29(月) 08:43:50 ID:EScKESZS(1) AAS
画面クリアって再描画するときクライアントカラーで塗りつぶすことを言ってるんでしょ
それやってるのって Paint じゃなくて WM_ERASEBKGND のメッセージメソッドじゃないの?
TCustomForm.Paint は Assigned(FOnPaint) をチェックしてるだけだし
TForm1 = class(TForm)
private
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
end;
procedure TForm1.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
//なーんもしない
Message.Result := 1;
end;
あ、これだったら TForm.Brush.Style := bsClear; でも同じかな
>>910
マグロよりカニのほうが儲かるらしいよ( ̄ー ̄)ニヤリッ
915(1): 911 [sage] 2006/05/29(月) 09:52:15 ID:t6UaTX2i(1/3) AAS
>procedure Paint;時に画面クリアしているので
俺は何を書いてるんだ。寝ぼけてんのか。
>914の言うとおりPaintはFOnPaintを呼び出してるだけだ。inheritedしても多少実行速度が速くなるだけでちらつきは止まらない。
>914 フォローサンクス。ところで名前欄に妙な文字が入ってるみたいだぞ。
916: 名前は開発中のものです。 [sage] 2006/05/29(月) 09:55:51 ID:t6UaTX2i(2/3) AAS
×inheritedしても
○inherited止めても
本気で寝ぼけてんな。
917(1): 名前は開発中のものです。 [sage] 2006/05/29(月) 11:43:34 ID:NefmNljv(1) AAS
>>915
マァの人だからでしょ
918: 名前は開発中のものです。 [sage] 2006/05/29(月) 12:48:03 ID:t6UaTX2i(3/3) AAS
「マァの人」で検索したらわかった。コテハンだったんだな。妙な文字なんつってスマン。
>917もわざわざスマンな。
919(1): 名前は開発中のものです。 [] 2006/05/30(火) 12:53:26 ID:JUitY34u(1) AAS
ポインタ操作ってどうやるの?
p,v: Pointer;
vにpからある一定の大きさだけ後ろのアドレスを指定したい
v := p;
Inc(PBYTE(v),ある一定の大きさ);
これをやるとpのアドレスまで変わってしまう?
920: 名前は開発中のものです。 [sage] 2006/05/30(火) 13:26:58 ID:+X21N2Yf(1) AAS
v = pointer(integer(p)+100);
スマートじゃないなあ・・・
921: 名前は開発中のものです。 [sage] 2006/05/30(火) 14:11:20 ID:ss191I5G(1) AAS
>これをやるとpのアドレスまで変わってしまう?
変わらない。
922(2): 名前は開発中のものです。 [] 2006/05/30(火) 14:21:37 ID:G3qDWiPC(1/2) AAS
>>919ので間違いではない
v:=pやっても別にpのアドレスはかわらん
だが、Pascalでは、
v := @( PByteArray(p)[ n ] );
ってな書き方をする方が多いと思う。
そういうわけで、Pointer型なんかよりは、PByteArrayを多用すると楽ちん
923: 名前は開発中のものです。 [] 2006/05/30(火) 18:29:57 ID:2UT4+Oju(1) AAS
俺もほとんど生ポインタ使わんな
>>922みたいに、バイト配列にキャストしてIndexでアクセスする
924(1): 名前は開発中のものです。 [] 2006/05/30(火) 18:40:41 ID:Dsd2Lvyv(1) AAS
>>922
PByteArrayなんてあったんだー
これは便利だ!!
925: 名前は開発中のものです。 [] 2006/05/30(火) 20:38:51 ID:G3qDWiPC(2/2) AAS
>>924
sysutilsにて定義されている
自分で定義するなら、
type
PByteArray=^TByteArray ;
TByteArray=array[0..1023] of byte ;
ってなとこ
926: 名前は開発中のものです。 [sage] 2006/05/31(水) 02:31:11 ID:jPRHLqEG(1) AAS
DirectXの頂点バッファってロックしてポインタで取得するでしょ
あれを取得するときに使えるワザだなと
PByteArrayで取得して40バイトずつずらしてユーザー定義の構造体に
キャストする
927: 名前は開発中のものです。 [] 2006/05/31(水) 13:57:33 ID:Ka6gjiAS(1) AAS
それだったら、最初からユーザー定義の構造体の配列とそのポインタ作った方がよくね?
928(1): 名前は開発中のものです。 [sage] 2006/06/01(木) 20:19:20 ID:jyfWqyoY(1) AAS
このスレ最近知って読んでるんだが。
スクリプトエンジン作ってる言う人が結構いたけど
Delphiでパーサージェネレーターってあるの?
上下前次1-新書関写板覧索設栞歴
あと 48 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.024s