[過去ログ] Delphiゲームプログラミング相談室 (976レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
901: 名前は開発中のものです。 [sage] 2006/05/26(金) 18:28:32 ID:9R2XzyxM(1) AAS
>>899
899(2): 名前は開発中のものです。 [sage] 2006/05/26(金) 16:04:17 ID:K3cI/Z+S(1) AAS
つまり、そういった基本的なことがネット上には不足してると?
聞かないと困る人が居ないので、
ネット上に解答も存在していない
902: 名前は開発中のものです。 [sage] 2006/05/27(土) 02:25:50 ID:2IU3JkXR(1) AAS
素直に教えてあげればいいのに、何故そんなに排他的なのか理解できない
>>897
897(1): 名前は開発中のものです。 [sage] 2006/05/16(火) 20:44:38 ID:EF6o0a3I(1) AAS
>>895
TImageのCanvasに自力で描画するのが手取りばやいとおもう
が妥当だと思うよ
ヘルプでCanvasを調べたらメソッドの解説も載ってたと思う
903
(1): 名前は開発中のものです。 [sage] 2006/05/27(土) 03:36:26 ID:DbCpqm4N(1/5) AAS
うん。
Delphiは、とりあえう、画面に画像だすのは簡単なんだけど、
ゲーム用に使おうとするとどれ使っていいかわかんなかったりする。
ゲーム用にってのは、高速に、だったり、ちらつかない、だったりする。
しかも、TImageだったり、TPaintBoxだったり、TBitmapがあったりして、
結局どれ使うのよ?
という疑問は最初はあると思う。
Delphiでゲーム作るときは誰しも通る道だと思う。
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 ;

ってなとこ
1-
あと 51 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.015s