トップページ > 過去ログ > 記事閲覧
描画領域について
名前:雷輝 日時: 2007/06/08 00:59

はじめまして。 実現可否が分からないことなのですが質問させていただきます。 現在、ウインドウサイズは640x480のままで描画領域をウインドウサイズより大きく設定したいと考えているのですが、 SetDrawArea( 0, 0, 640,1260)としてもGetDrawAreaで取得できる描画領域のサイズは0,0,640,480になってしまいます。 描画領域だけ大きくしたい理由は表画面では準備中の画面を表示しておいて裏画面でウインドウサイズよりも大きいグラフィックデータを作成したいためです。 ちょっと、文章にするのが苦手なので、わかりにくいかもしれませんがどなたか分かる方教えていただけると助かります

Page: 1 |

Re: 描画領域について ( No.1 )
名前: 日時:2007/06/08 10:30

 こんにちはー。  画面より広いマップ(フィールド・ステージ)を使う格闘とかアクションとかの用途ですか?  それなら、座標がマイナスになったりしてもバグはなかったような……。  常に中心に置きたいキャラがいて、そのマップ上の座標を(x,y)としたとき、ある点(a,b)にあるキャラ(物体)の画面上の座標は(a-x,b-y)  上記のようにして画面外のキャラがいても、バグはなかったような……状況によっては随分重くなりますが(笑)  裏画面を使って画像系の処理をしたいならこの方法は使えないですね……雷輝さんの質問の直接的な回答ではなくてすみません。
Re: 描画領域について ( No.2 )
名前:管理人 日時:2007/06/09 11:57

雷輝さん始めまして、DXライブラリの管理人です。 裏画面の大きさは表画面と同じなので、基本的に表画面の解像度 以上のサイズの画像を裏画面に書き込むことは出来ません。(なので画面 解像度が 640x480 の場合は、裏画面で SetDrawArea 設定できる 最大範囲も 0,0 〜 640,480 となります) 巨大な画像はVRAMを喰う他、描画時の負荷も高くなりますので あまりお勧め出来ないのですが、どのような画像を作成されようと しているのでしょうか?
Re: 描画領域について ( No.3 )
名前:雷輝 日時:2007/06/12 01:53

>>雪さん 回答ありがとうございます。返答遅くなり申し訳ありません。 格闘とかアクション用途ではないのですが画面より大きい画像を最初に可変で用意したかったのです。 座標がマイナスになったりしても問題なく描画可能なのは確認できているのですが、 画面がマイナスや最大値を超えた範囲の画像を取り込むことができないのが現在の問題です。 いえ、直接的な回答ではなくても回答いただきありがとうございます。 >>管理人様 やはり裏画面のサイズは表画面と同じなんですね。 作成したいのは、1枚120x60の画像を読み込んだデータによって縦21枚並べた画像を起動直後に作成したいと考えています。 基本的には1つのアプリで読み込むデータは同じ予定なのですがコア部分を同じ設計で作成したいと考えていたため 起動時に外部データ(配列に画像番号1〜7を格納)を読み込んでその番号にしたがって縦に並べた画像を作成したいと考えています ただ、上の方法で縦に並べると縦が1260になってしまうため取り込むことができなくなってしまっています。
Re: 描画領域について ( No.4 )
名前: 日時:2007/06/12 21:52

 気になるので更に首を突っ込んでみます。  大きな画像を作って、それをプログラム中に使いたいんですよね?  画像ではなく、「色の集合」として必要なのであれば問題ではないんですけどね……。  指定座標の色を取得する関数があるので、小さな画像を描画した後にそれを使って色データを二次元配列なりなんなりに入れていきます。あとはそこから乗法を引き出すようにすれば、望みどおりの結果が得られると思います。  毎度毎度、微妙にずれた返答で申し訳ありませんorz
Re: 描画領域について ( No.5 )
名前:雷輝 日時:2007/06/12 23:17

>>雪様 はい、大きな画像を作成してプログラム中に使いたいと考えています。 結果的に縦1260の画像ができれば良いので描画領域を拡げられなくても複数回に分けて描画領域内に描画した画像を取り込んで それらを結合して1枚の画像に仕上げられれば良いような気がしてきました… ですが、それも方法があるのか分からずです。すいません。
Re: 描画領域について ( No.6 )
名前:管理人 日時:2007/06/13 10:32

雷輝さんどうも、DXライブラリの管理人です。 なるほど、そういうことでしたか。 うーん、一応縦21枚並べた画像を作成する方法はあるのですが、非公開の 以下の関数を幾つか使うことになるので少し面倒かもしれません。 // 画像ファイルから基本イメージデータを構築する // FileName : 読み込む画像ファイルのパス // BaseImage : 読み込んだ画像の情報を格納する BASEIMAGE 構造体のアドレス // 戻り値 : 0=成功 -1=エラー int CreateBaseImageToFile( char *FileName, BASEIMAGE *BaseImage ) ; // ARGB8カラーの空の基本イメージデータを作成する // SizeX, SizeY : 作成する画像のサイズ // BaseImage : 作成した画像の情報を格納する BASEIMAGE 構造体のアドレス // 戻り値 : 0=成功 -1=エラー int CreateARGB8ColorBaseImage( int SizeX, int SizeY, BASEIMAGE *BaseImage ) ; // 基本イメージデータの後始末を行う // BaseImage : 格納された画像の情報を開放する BASEIMAGE 構造体のアドレス // 戻り値 : 0=成功 -1=エラー int ReleaseBaseImage( BASEIMAGE *BaseImage ) ; // 基本イメージデータを転送する // DestX, DestY : 転送先画像の転送先座標 // SrcBaseImage : 転送元の画像の情報が格納された BASEIMAGE 構造体のアドレス // DestBaseImage : 転送先の画像の情報が格納された BASEIMAGE 構造体のアドレス // 戻り値 : 0=成功 -1=エラー int BltBaseImage( int DestX, int DestY, BASEIMAGE *SrcBaseImage, BASEIMAGE *DestBaseImage ) ; // 基本イメージデータから画像ハンドルを作成する // BaseImage : 画像ハンドルの元としたい画像の情報が格納された BASEIMAGE 構造体のアドレス // 戻り値 : -1=エラー -1以外=画像ハンドル int CreateGraphFromBaseImage( BASEIMAGE *BaseImage ) ;  上記の関数は LoadGraph や DrawGraph とは完全に独立した画像システムで、 簡単に DrawGraph 系の関数と対応させると 画像ハンドル(int型の数値) → BaseImage構造体 MakeGraph → CreateARGB8ColorBaseImage LoadGraph → CreateBaseImageToFile DeleteGraph → ReleaseBaseImage DrawGraph → BltBaseImage となっています。 DrawGraph 系との違いは DirectX を使用していないのでハードウエアや DirectX の制約を受けないという点です。 今回は CreateARGB8ColorBaseImage で 120x1260 の画像を作成して、そこに 7種類の画像を縦21枚描画して、出来上がった画像を画像ハンドルとして 使用する、ということをするためにこの画像システムを使用します。 (設定次第で MakeGraph で作成した画像にも描画処理を行うことが出来ますが、 ハードウエアやDirectXの制約を受けるので画像作成の為に使うのはあまり良くありません) で、とりあえずこれらの関数を使用して 120x1260 の画像を作成する プログラムを組んでみましたので、宜しければこのプログラムを参考に CreateARGB8ColorBaseImage 等の関数を使用した画像作成プログラムを 組んでみてください。 #include "DxLib.h" #define FILE_NUM (7) #define PATTERN_NUM (21) #define IMAGE_HEIGHT (60) // 21個分の画像パターン int Pattern[PATTERN_NUM] = { 0, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1, 0, 6, 2, 4, 6, 3, 5, 1, 0 }; // 使用する7つの画像 char *FileName[FILE_NUM] = { "Pattern0.bmp", "Pattern1.bmp", "Pattern2.bmp", "Pattern3.bmp", "Pattern4.bmp", "Pattern5.bmp", "Pattern6.bmp", }; // 素となる7つの画像 BASEIMAGE MaterialImage[FILE_NUM]; // 画像ハンドルを作成する関数 int CreateHandle( int *pat ) { int i; int NewHandle; BASEIMAGE TempImage; // 画像ハンドルの元となる 120x1260 のサイズの画像を作成 CreateARGB8ColorBaseImage( 120, IMAGE_HEIGHT * PATTERN_NUM, &TempImage ); // 120x1260 の画像に縦21枚の画像を描画(というか転送) for( i = 0; i < PATTERN_NUM; i ++ ) BltBaseImage( 0, i * IMAGE_HEIGHT, &MaterialImage[pat[i]], &TempImage ); // 120x1260 の画像から DrawGraph 等で使用できる画像ハンドルを作成 NewHandle = CreateGraphFromBaseImage( &TempImage ); // 120x1260 の画像を解放(画像ハンドルの画像イメージは他の場所に確保されているので解放しても大丈夫) ReleaseBaseImage( &TempImage ); // 作成した画像ハンドルを返す return NewHandle; } // WinMain 関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int x, add, i; int GraphHandle; // ウインドウモードで実行する ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() == -1 ) return -1; // 素となる7枚の画像を読み込む for( i = 0; i < FILE_NUM; i ++ ) CreateBaseImageToFile( FileName[i], &MaterialImage[i] ); // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // パターンから画像ハンドルを作成 GraphHandle = CreateHandle( Pattern ); // 作成した画像を左右に動かす処理の為の変数を初期化 x = 0; add = 8; // メインループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 動作処理 x += add; if( x < 0 || x >= 640 ) add = -add; // 作成した画像を描画して表画面に反映させる ClearDrawScreen(); DrawGraph( x, 0, GraphHandle, TRUE ); ScreenFlip(); } // 素となる7枚の画像を解放する for( i = 0; i < FILE_NUM; i ++ ) ReleaseBaseImage( &MaterialImage[i] ); // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } (もし上記のプログラムだけでは分からない点などありましたらご質問下さい)
Re: 描画領域について ( No.7 )
名前:雷輝 日時:2007/06/15 01:51

>>管理人様 返答遅くなりました。 詳細な回答及びサンプルプログラムまで作成していただきありがとうございます。 さっそく、サンプルを参考にコードを書いて実行してみました。 自分が作りたかった機能を実現することができました。 現状はサンプル通りにしか作成していないのですが、順を追って動作・処理を確認しながら応用して使わせていただきます。 再度、本当にありがとうございました。

Page: 1 |