[過去ログ] Delphiゲームプログラミング相談室 (976レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
550(1): 名前は開発中のものです。 [sage] 04/06/24 12:26 ID:WbJlnPwQ(1) AAS
 フルスクリーンとウィンドウの切り替えは、 
 D3DPresentParametersのWindowedを変更してデバイスをResetするだけでは駄目なんでしょうか。 
 上記の方法でやろうとすると、フルスクリーンからウィンドウになったときにタイトルバーが消えてしまいます。 
 FormのBorderStyleをbsNoneにしたような感じですが、この状態でBorderStyleを変更しても変化がありません。 
 正しく切り替えるにはどのようにしたらいいでしょうか。 
551(4): 名前は開発中のものです。 [sage] 04/07/24 05:11 ID:xpKa1okG(1) AAS
 QD3を使ってのゲーム作成を始めました。 
 fpsなどの情報をTextOut()や、それに近いもので表示させようと思っています。 
 現行の処理(OnIdleにて): 
  
 D3DDevice.BeginScene(); 
   PushSprite(); // BitMapを多数配置 
   Sxw := TSXTextWriter.Create(); 
   Text[n] := Sxw.CreateStringTexture(); 
   PushSprite(); // 上で作成した文字列のテクスチャをいくつか 
 D3DDevice.EndScene(); 
 D3DDevice.Present(); 
   Text[n].Free// 上で作成した文字列のテクスチャの解放 
   Sxw.Free; 
  
 のようにして、TSXTextWriterを使用していますが、 
 テキストのテクスチャ数が増えるに連れて、大変重たくなってしまいます。 
 きっともっと良い描画方法があると思うのですが、 
 メモリデバイスコンテキスト等も上手くいかず、苦戦しております。 
 何かヒントをいただけないでしょうか? 
552(2): 名前は開発中のものです。 [sage] 04/07/24 20:45 ID:PnrKgcAc(1) AAS
 >551 
 シーン描画毎にテクスチャとTSXTextWriterをクリエイトする意味あんの? 
  
 文字列に変化ある時に書き換えるだけじゃだめなんか。 
553: 551 [sage] 04/07/25 03:26 ID:TtxXwPsH(1/3) AAS
 >>552 
 ゲームのスコアを表示させているため、 
 かなりの頻度で文字列が変化してしまうもので…。 
 ですが、ご指摘の通り、TSXTextWriterは毎回生成・破棄する 
 必要がないため、FormCreate/Destroyに移動させました。 
  
 もしかしてTBitmap.Canvasとか使った方がいいんでしょうかね? 
 引き続き色々試してみようと思います。 
554(2): 名前は開発中のものです。 [sage] 04/07/25 14:02 ID:y86X+J8o(1/3) AAS
 テクスチャの描画毎の生成破棄も相当コスト高いとおもうけど。 
  
 ふつうにあらかじめ確保したテクスチャにWriteすべきでね? 
555(1): 551 [sage] 04/07/25 14:40 ID:TtxXwPsH(2/3) AAS
 >>554 
 やっぱりそうですよね…。 
 でもそうやってみると、どうしてもリークしてしまうんです。 
 やり方がおかしいのかな_| ̄|○ 
  
 ・MainFormのprivateでText1: TDGTexture;を宣言。 
 ・FormDestroyでText1.Free; 
  
 procedure OnIdle(); 
 begin 
   : 
 Text1 := Sxw.CreateStringTexture(); 
 PushSprite(Text1); 
 D3DDevice.Present(); 
 // この辺りで何らかの解放処理が必要なのでしょうか。 
   : 
 end; 
  
 (今は、SXLibを見ながらTBitmapを使おうと模索中です。) 
556(1): 名前は開発中のものです。 [sage] 04/07/25 15:18 ID:y86X+J8o(2/3) AAS
 >>555 
 ん?それだと 
 >Text1 := Sxw.CreateStringTexture(); 
 の部分で毎回テクスチャがクリエイトされちゃうじゃん。そりゃリークしまくるでしょ。 
  
 Writeすればっつーのは 
 FormCreateでText1をクリエイトして 
 >Sxw.Write(0,0,'Score',Text1); 
 とでもすればっていうこと。 
557(1): 名前は開発中のものです。 [sage] 04/07/25 15:35 ID:y86X+J8o(3/3) AAS
 あ、言い忘れた。 
 当たり前だけど毎描画Writeするのも重いはず。 
 別に文字列持っておいて変化したらWriteするようにするのが普通だと思う。 
558: 551 [sage] 04/07/25 16:26 ID:TtxXwPsH(3/3) AAS
 >>556-557 
 おあーぁぁー、Writeってそういうことだったんですね…。 
 メソッド名そのままの効果…何故気付かないのか私は_| ̄|○ 
 これなら期待通りの動作をしてくれます! 
 > 別に文字列持っておいて変化したらWriteするようにする 
 CPU使用率が(一部)断然下がりました。 
 おかげさまで、描画系の作成に苦労しなくて済みそうです。 
  
 >>552,554(=556,557?)さんをはじめ、スレ住人皆さん、 
 ご教授いただき有難うございました<(_ _)> 
  
 QDmanual/ML/sampleの山|λ...... 
559(1): 名前は開発中のものです。 [sage] 04/08/04 16:08 ID:ZmvuRdM9(1) AAS
 初心者丸出しの質問ですいませんが 
 ゲームのハイスコア(1位から10位ほど)を保存したいんですけど 何を使えばいいんでしょうか
560: 名前は開発中のものです。 [sage] 04/08/04 17:22 ID:WqrQethy(1) AAS
 tstringlist 
561(1): 名前は開発中のものです。 [sage] 04/08/04 23:29 ID:5TXw5Lpo(1) AAS
 Quadruple Dを使ってゲーム作っているのですが、 
 画像の一部だけを描画するにはこの方法でいいのでしょうか? 
  
       Scene.PushSprite( 
         Vector2D(0,0), 
         [ 
          SXVertexSP(50,50, $FFFFFFFF, 0.0,0.0), 
          SXVertexSP(100,50, $FFFFFFFF, 50/Texture.Width, 0.0), 
          SXVertexSP(50,100, $FFFFFFFF, 0.0, 50/Texture.Height), 
          SXVertexSP(100,100, $FFFFFFFF, 50/Texture.Width, 50/Texture.Height) 
         ], 
          Texture, 
          sxbAlpha, 
          False 
       ); 
  
 もっとスマートな方法ってありますか? 
562(1): 名前は開発中のものです。 [sage] 04/08/12 22:35 ID:lCkZPmie(1) AAS
 >>561 
 それでよし 
 >>559 
 漏れもTStringListに一票 
 桁揃えておけばソートできるしな 
 暇ならハイスコアコンポーネントでも作って公開してくれ 
 >>550 
 変える順番が大事 
 変える個所は合ってる 
 >>543ほかの個所は使ってる 
 >>536536(1): 名前は開発中のものです。 [sage] 04/06/09 07:09 ID:GrePfY40(1) AAS
 TDDIDFFXについての質問です 
 カーソルキーを押しっぱなしにするとTDDIDFFX.Stick.X(又はY)は常に1(又は-1)を返します 
 カーソルキーを連打しないと動作しないようにするにはどのようにすればできるでしょうか?  
前回のキー入力を保存 
 状態遷移でググると基本的な考え方がわかる 
 やね本2の解説がわかりやすい 
 >>528QDの良い所はVCL連携と3Dオブジェクト(しかもモーション付き)の扱いが楽 
563: 名前は開発中のものです。 [sage] 04/08/12 23:43 ID:Ev6Dy7m9(1) AAS
 >>562 
 レスありがとうございます。 
 でもこれだと解像度の違いのせいか、描画したい元画像の範囲選択が上手くいかないんです。 
  
 解像度を800×600にして、元の画像の大きさが50×100だとすると、下のソースでは 
 画像の Rect(0, 20, 50, 50) の部分が描画されると思うのですが、ずれてしまいます。 
  
 Scene.PushSprite( 
 Vector2D(0,0), 
 [ 
  SXVertexSP(0, 0, $FFFFFFFF, 0.0, 0.2), 
  SXVertexSP(0, 50, $FFFFFFFF, 1.0, 0.2), 
  SXVertexSP(30, 0, $FFFFFFFF, 0.0, 0.5), 
  SXVertexSP(50, 30, $FFFFFFFF, 1.0, 0.5) 
 ], 
  Texture, 
  sxbAlpha, 
  False 
 ); 
  
 ゲームでたくさんの画像を使うときには皆さんどうしているのですか? 
 一つ一つテクスチャを作るか、それとも一つのファイルに画像を収めて 
 一部だけを描画するようにしているのでしょうか。 
564: 名前は開発中のものです。 [sage] 04/08/13 01:22 ID:y25szJtr(1) AAS
 そりゃずれると思われ 
565(2): 名前は開発中のものです。 [sage] 04/08/14 10:53 ID:ennbBjlN(1) AAS
 微妙に間違えてますた。 
 でも、これでもずれますが、どのようにパラメータを指定すればいいんでしょう。 
  
 Scene.PushSprite( 
 Vector2D(0,0), 
 [ 
  SXVertexSP(0, 0, $FFFFFFFF, 0.0, 0.2), 
  SXVertexSP(50, 0, $FFFFFFFF, 1.0, 0.2), 
  SXVertexSP(0, 30, $FFFFFFFF, 0.0, 0.5), 
  SXVertexSP(50, 30, $FFFFFFFF, 1.0, 0.5) 
 ], 
  Texture, 
  sxbAlpha, 
  False 
 ); 
566: 名前は開発中のものです。 [] 04/08/15 02:11 ID:PuiE5qNp(1/4) AAS
 >>565 
 画像のサイズが2のn乗じゃないから。 
  
 テクスチャのサイズは読み込んだ画像と同じとは限りません。 
 TDGTextureのプロパティTotalWidthなどで確認できます。 
 Widthとの値の差を見比べるとよいでしょう。 
  
 読み込んだ画像が2のn乗に満たない場合は自動的にテクスチャのサイズが拡張されます。 
 そのサイズは読み込んだ画像以上でなおかつ最小の2のn乗になります。 
 50x100の場合は64x128になります。 
  
 たとえば50x100の画像を読み込んで作ったテクスチャの左上から32x32を表示したい場合は 
 テクスチャが64x128に拡張されているので以下のようにしてUVを求められます。 
 U=1/64*32 
 V=1/128*32 
  
 ここからは余談ですがグラフィックボードによってはテクスチャに色々な制限があります。 
 ・256x256以下のサイズしか扱えない 
 ・正方形でないとならない 
 ・2のn乗サイズでないといけない 
 ・32bit色が使えない 
  
 記憶を頼りに書いてるので間違ってたらツッコミおながいします。 
 ちなみにVoodooシリーズがこれらの制限に全てひっかかるカードです。 
567(1): 名前は開発中のものです。 [sage] 04/08/15 04:22 ID:PuiE5qNp(2/4) AAS
 >>565 
 とりあえずサンプル 
 外部リンク[lzh]:gamdev.org 
568(1): 名前は開発中のものです。 [sage] 04/08/15 09:35 ID:moZoUrx5(1/2) AAS
 丁寧な解説ありがd 
  
 >>567 
 起動してくれません。デバッグログには、 
 「Direct3DDeviceオブジェクトの生成に失敗しました(Error Code D3DERR_OUTOFVIDEOMEMORY)」 
 とあります。 
569(1): 名前は開発中のものです。 [sage] 04/08/15 13:01 ID:PuiE5qNp(3/4) AAS
 >>568 
 たぶんビデオカードのメモリが不足してるだけだからテクスチャのサイズが小さくなれば解決すると思う 
 サンプルでは512キロバイト使ってるからグラフィックボードを買い足していない環境じゃつらいかも 
  
 思いついた対策を書いておきます 
 これでもダメならグラフィックチップの種類やVRAM容量、エラーログの全文がわかればもう少し詳しく調べられるかも 
  
 ・画像編集ソフト(ペイントなど)で画像のサイズ(今は288x256)をもっと小さくする(試しに32x32ぐらいに) 
 ・画像編集ソフト(ペイントなど)で画像の色数を減らす(16ビット色に) 
 ・TDGCarad(女の子のアイコンのコンポーネント)のプロパティUseSoftwareVertexProcessingをTrueにする 
570(1): 名前は開発中のものです。 [sage] 04/08/15 18:34 ID:moZoUrx5(2/2) AAS
 >>569 
 全部試してみたけどダメでした。ファイルサイズは630バイトくらい。 
  
 ビデオRAM : 4MB 
 グラフィックアクセラレータ : ATI社製RAGE(TM) Mobility-CL(AGP) 
 ノートパソコンなので画像系には弱いのですかね? Lavie Lシリーズです。 
  
 前略(特に問題ナシ)     
 #00013 |     ■■■画面モードを初期化します■■■ 
 #00014 |       Driver : ati2drab.dll 
 #00015 |       Description : ATI RAGE MOBILITY AGP 
 #00016 |       VendorID : 00001002, DeviceID : 00004C4D, SubSysID : 81581033, Revision : 00000064 
 #00017 |       ウィンドウモード 640x473で初期化します 
 #00018 |       ハードウェアアクセラレーションを利用します 
 #00019 |       希望のデプスステンシルサーフェスのフォーマットが見つかりませんでした 
 #00020 |       デプスステンシルサーフェスのフォーマット...UNKNOWN 
 #00021 |       ソフトウェアT&Lを利用します 
 #00022 |       Direct3DDeviceオブジェクトの生成を行います 
 #00023 |       Direct3DDeviceオブジェクトの生成に失敗しました(Error Code = D3DERR_OUTOFVIDEOMEMORY) 
 #00024 |        
 #00025 |       ■■■お別れの時がやってまいりました■■■ 
 以下略(特に問題ナシ) 
571: 名前は開発中のものです。 [sage] 04/08/15 21:05 ID:PuiE5qNp(4/4) AAS
 >>570 
 RAGEのグラフィックボードを使って試してみました。 
 同じエラーがでるし原因究明は楽かなと思いました 
 ……がその前にちゃんと計算すればよかった orz 
  
 バックバッファ:640x480x3(=900kbyte) 
 フロントバッファ:640x480x3(=900kbyte) 
 windowsの解像度:1024x768x3(=2.25Mbyte) 
 テクスチャ:512x256x3=(384kbyte) 
 合計:4.3828125Mbyte 
 テクスチャのサイズを変えた所で足りません。 
  
 Form1のClientWidthとClientHeightを320x240にすると 
 バッファ2つあわせても450kbyteになるので合計で4Mbyte以下に抑えられます。 
  
 とりあえずこっちでは動きました。 
572: 名前は開発中のものです。 [sage] 04/08/16 09:15 ID:WpFw0zco(1) AAS
 > ビデオRAM : 4MB 
 さすがに、これはキツイと思われ 
573(1): 名前は開発中のものです。 [sage] 04/08/16 13:37 ID:tdeixu8e(1/2) AAS
 Formを小さくしてみてもダメでした。 
 BIOS設定でもVRAM増やせないみたいだし。 
 _/ ̄|○モウダメポ・・・ 
574: 名前は開発中のものです。 [sage] 04/08/16 14:54 ID:OSpqsJ8k(1) AAS
 >>573 
 動かないサンプルを動かそうとするよりすでに動いているものがあれば 
 それを改造していったほうが早いんじゃないかと思います 
 (質問ではテクスチャがズレてしまったとあるのでそのプログラムのUV値をいじるだけでいいはず) 
  
 もともとの問題はテクスチャがずれる理由の解明で 
 それは解決してるはずです 
  
 なぜ動かないかは気になるのでもし改造していって動かなくなったり 
 動くものが完成したら教えてください
上下前次1-新書関写板覧索設栞歴
あと 402 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.022s