Re: LoadDivGraphについて ( No.1 ) |
- 名前:いっち 日時:2010/01/06 02:55
LoadDivGraph関数とウィンドウが開かれるかどうかはあまり関係なさそうなのですが、
ウィンドウが開かれないというのはプログラムを実行しても、なにもせずに終了してしまうということでしょうか?
LoadDivGraphをコンストラクタで行っているようですが、事前にDxLib_Init関数を呼び出す必要があるので、
オブジェクトを大域変数として定義していると失敗すると思います。
|
Re: LoadDivGraphについて ( No.2 ) |
- 名前:Def 日時:2010/01/06 12:50
プログラムは終了してないです。多分読み込み中にとまってます。
コンストラクタだとDxLib_Initの前に呼び出されているんですね。メンバ関数にしてみようと思います。
いっちさんお返事ありがとうございます。
|
Re: LoadDivGraphについて ( No.3 ) |
- 名前:Def 日時:2010/01/06 19:46
画像を取得して表示するのは出来たのですが
今度はプログラム実行中にウィンドウが閉じられてしまいます。
グラフィックの数が許容量を越えました終了します。
と出力に表示されてました。
Image[]の配列を減らして見たのですがあまり効果が無いみたいです
こういう場合はどう対処したら良いのでしょうか
|
Re: LoadDivGraphについて ( No.4 ) |
- 名前:いっち 日時:2010/01/07 00:24
DxLib(H/W依存?)がどの程度の量の画像を開けるのか試したことが無かったのでやってみましたが、
私の環境では1024*768*24bitのBMPを569回ロードできました。
Defさんはどの程度の量の画像をいっぺんに開くことを想定しておられるのでしょうか?
原因はわかりませんが、とりあえず使用し終わったハンドルはDeleteGraph関数で開放してみてください。
もしかしたら、ループの中で同じ画像のロードを行っているかも知れませんので、ご確認ください。
ソースを拝見させて頂けると、より詳しくアドバイスできるかもしれません。
(サイズが大きいようであればアップローダでお願いします。)
|
Re: LoadDivGraphについて ( No.5 ) |
- 名前:Def 日時:2010/01/07 02:26
Map.h
public:
int Image[21];
MapDate m_mapdate;//マップデータクラスのコンスタンス
private:
int MapDrawPointX , MapDrawPointY ; // 描画するマップ座標値
int DrawMapChipNumX , DrawMapChipNumY ; // 描画するマップチップの数
int ch_x ,ch_y;
int mapimage;
int m_change_flag;
Map.cpp
Map::Map()
{
m_change_flag=1;
ch_x=128;
ch_y=128;
}
void Map::Draw(void)
{
if(m_change_flag=1)
{
m_mapdate.mapdate_road(m_MapDate);//ここで他クラスから二次元配列の0と1で構成されたマップデータを取得
m_change_flag=0;
LoadDivGraph("TestMap1.bmp",21,7,3,32,32,Image);
}
DrawMapChipNumX = 640 / MAP_SIZE + 1 ;
DrawMapChipNumY = 480 / MAP_SIZE + 1 ;
MapDrawPointX = ch_x/MAP_SIZE - DrawMapChipNumX / 2 ;//chx-5
MapDrawPointY = ch_y/MAP_SIZE - DrawMapChipNumY / 2 ;//chy-4
// マップを描く
for( i = 0 ; i < DrawMapChipNumY ; i ++ )
{
for( j = 0 ; j < DrawMapChipNumX ; j ++ )
{
// 画面からはみ出た位置なら描画しない//
if( j + MapDrawPointX < 0 || i + MapDrawPointY < 0 ||
j + MapDrawPointX >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) continue ;
if( m_MapDate[ i + MapDrawPointY ][ j + MapDrawPointX ] == 0 )
{
mapimage=Image[1];
DrawGraph(j*MAP_SIZE,i*MAP_SIZE,mapimage,TRUE);
}
}
}
}
//下の三つは違うヘッダでconst intで宣言してます。
MAP_SIZE =32
MAP_WIDTH =20
MAP_HEIGHT =16
Mapの表示部分を切り取るとこのような感じになっています。
まだ試作段階なのであまり整理されてません。見にくかったらすみません。
|
Re: LoadDivGraphについて ( No.6 ) |
- 名前:Will 日時:2010/01/07 09:41
if文間違ってますよ。
誤:if(m_change_flag=1)
正:if(m_change_flag==1)
|
Re: LoadDivGraphについて ( No.7 ) |
- 名前:Def 日時:2010/01/07 14:39
ああ!こんな初歩的なミスを・・・。
willさんといっちさんありがとうございます。
お騒がせして申し訳ありません。
この問題は解決出来ました。
|
Re: LoadDivGraphについて ( No.8 ) |
- 名前:いっち 日時:2010/01/07 18:35
解決して良かったです。
ただ、Imageのロード/リロードの前に(別の場所で行っていないのであれば)、
下記のようにグラフィックハンドルの開放を行ってください。
for ( int i = 0; i < 21; i++ )
DeleteGraph( Image[i] );
ただし、初回のロードでは開放すべきハンドルが無いので初回ロードとリロードは切り分けてください。
コードがうまく動けばImageの配列のサイズを元に戻しても問題ないと思います。
※余談
未コンパイルのソースだとは思いますが、"MapDate"の名前は"MapData"が正しいのではないでしょうか?
|
Re: LoadDivGraphについて ( No.9 ) |
- 名前:Def 日時:2010/01/07 21:59
いっちさんご丁寧にありがとうございます。
Imageの(別の場所に行っていないのであれば)
というのは他のマップチップのデータをLoadDivGraphでImageに入れる時には一度開放する。
ということでしょうか
|
Re: LoadDivGraphについて ( No.10 ) |
- 名前:いっち 日時:2010/01/07 22:25
その通りです。
Imageの中に格納されているのはあくまでグラフィックのハンドルで、
グラフィックのデータがそのまま格納されているわけではありません。
Imageの中の使い終わったマップチップのハンドルを、新しいマップチップのハンドルで上書きする前に開放しないと、
メモリ上には古いマップチップのグラフィックが残ったままになります。
おそらく、大量のマップ切り替えを行った場合、また許容量を超えてしまう事になるかもしれません。
|
Re: LoadDivGraphについて ( No.11 ) |
- 名前:Def 日時:2010/01/07 22:51
いっちさんご親切にどうもありがとうございます。
またバグを作って途方にくれるところでした。
|
Re: LoadDivGraphについて ( No.12 ) |
- 名前:いっち 日時:2010/01/07 23:56
細かい話ですし本筋とは関係ないのですが、
(No.2)のレスで
> コンストラクタだとDxLib_Initの前に呼び出されているんですね。メンバ関数にしてみようと思います。
と、ありますが正確に言うと、コストラクタだからDxLib_Initの前に呼び出されるわけではなく。
大域変数の初期化(コンストラクタの呼び出し)がmain関数の前に行われるので、
結果的にDxLib_Initの前に呼び出されてしまうという事です。
局所変数のコンストラクタは変数が定義された任意のタイミングで呼び出されます。
お分かりになっている事かもしれませんが念のため。
|