ページ 1 / 1
画像の表示の仕方について
Posted: 2012年8月22日(水) 17:31
by icon01
初めまして、いま私はDXライブラリを使ったパズルゲーム作りに挑戦しているところなのですが、
マップを作る際に、
コード:
int Block[16];
LoadDivGraph( "BLOCK.png" , 16 , 4 , 4 , 32 , 32 , Block );
for(int i=0;i<15;i++)
{
for(int j=0;j<20;j++)
{
int n =GetRand(14);
if(i==0||i==14||j==0||j==19)
{
DrawGraph( j*32, i*32 , Block[7], TRUE );
}
else
{
DrawGraph( j*32, i*32 , Block[n], TRUE );
}
}
}[code=cpp]
かなり端折っていますが、上記のような感じで打ってしまうと、外枠は正常に描写できても、(ここには書いていませんが)DXライブラリテンプレのwhile文があるおかげで、一秒間に60回のペースでBlock[n]の中身が変化してしまいます。
これを解消したいのですが、かといって、いちいち変数を用意してコピーするのでは効率が悪いですよね。あと、パズルゲームですので、この先、表示した画像を入れ替えたり消したりといった処理があることを念頭に入れたうえでのベストな書き方を教えていただければと思い投稿しました。
ちなみに私はプログラムを初めて半年、C言語しか触ったことがないぺーぺ+この掲示板初利用者です。
至らないことだらけだと思いますが、よろしくお願いいたします。
Re: 画像の表示の仕方について
Posted: 2012年8月22日(水) 17:41
by softya(ソフト屋)
この掲示板のルールなのですが、okwave系の質問とマルチポストになってしまっていすので補足をなどを使って相互リンクを(回答者が相互の掲示板を参照可能なようにリンクを貼ること)をお願いします。
http://dixq.net/board/board.html
それと、前後の部分がないと的確なアドバイスが難しいです。
whileループという文面からDxLib_Init()直後ではないと推測されますが確定するためにも前後の状況が分かる必要があります。
インデントについても気をつけてください。
「mixcpp/投稿前チェックリスト - PukiWiki」
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8
Re: 画像の表示の仕方について
Posted: 2012年8月22日(水) 18:24
by icon01
追記です
http://oshiete.goo.ne.jp/qa/7657413.html //相互リンク
これでよいのでしょうか?
コード:
int Block[16];
LoadDivGraph( "BLOCK.png" , 16 , 4 , 4 , 32 , 32 , Block );
while( 1 ){ // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
for(int i=0;i<15;i++)
{
for(int j=0;j<20;j++)
{
int n =GetRand(14);
if(i==0||i==14||j==0||j==19)
{
DrawGraph( j*32, i*32 , Block[7], TRUE );
}
else
{
DrawGraph( j*32, i*32 , Block[n], TRUE );
}
}
}
}
}[code=cpp]
実行結果として
壁壁壁壁壁壁壁壁壁壁
壁nnnnnnnnnnnnn壁
壁nnnnnnnnnnnnn壁
壁nnnnnnnnnnnnn壁
壁nnnnnnnnnnnnn壁
壁壁壁壁壁壁壁壁壁壁
となり、壁は常に同じ画像が表示されますが、nの中身をランダムに表示させた際に、毎秒60回のペースで変化してしまうのです。
ついでに言うと、変数の初期化などはヘッダファイルでしてあるのを便宜的にこう書き直しただけです。
すみません。説明不足だったようで
と、ここまで書き直しましたが、やはり至らないことだらけかもしれません。
申し訳ございませんが、少しでも早く馴れるよう努力していきたいと思っております。
Re: 画像の表示の仕方について
Posted: 2012年8月22日(水) 18:31
by softya(ソフト屋)
okwave側から、こちらへのリンクもお願いします。両方あってこその相互リンクですので。
あとインデントに全角スペースを使わないでくださいね。コンパイルエラーになりますから。
1) ソースを見る限り、2重にwhileは必要ありません。while( 1 ) が不要です。
2) パズル面の状態は配列に書き込んで記録しておく必要があると思います。
そのパズル面の状態の配列に従って表示するようにしてください。
3) パズル面の状態の配列はwhileループ前に乱数で初期化しておいてください。
そうすれば毎フレーム書き換わる事がなくなります。
【補足】
>ついでに言うと、変数の初期化などはヘッダファイルでしてあるのを便宜的にこう書き直しただけです。
#defineなどはヘッダで問題ありませんがヘッダで変数を初期化するのは良いことではありません。
ファイル分割などを行った時には問題となります。これは別の問題なので本来の問題が片付いてからにしましょう。
Re: 画像の表示の仕方について
Posted: 2012年8月22日(水) 22:19
by icon01
何度も失礼します。
色々試してみたのですが。うまくいきませんでした。
配列を用意するとのことですが、例えば、MAP[15][20]という感じの二次元配列のことですよね?
これをfor文使ってMAP[j]みたいにして中身をいじるのはいいのですが、これをwhile文の外でした後、while文の中で
どうやって表示をしたらよいのでしょうか?
それとも、LoadDivGraphで画像を読み込む処理をfor文で回したりする必要があるのでしょうか?
Re: 画像の表示の仕方について
Posted: 2012年8月22日(水) 22:24
by softya(ソフト屋)
whileの外でMAP[j]に乱数を使って代入します。
whileの中ではMAP[j]をBlockの添字に使って表示に使います。
こうすれば毎フレーム変わる問題はありません。
Re: 画像の表示の仕方について
Posted: 2012年8月22日(水) 22:38
by icon01
おかげさまで解決することができました。
どうもありがとうございました。
Re: 画像の表示の仕方について
Posted: 2012年8月22日(水) 22:43
by softya(ソフト屋)
icon01 さんが書きました: おかげさまで解決することができました。
どうもありがとうございました。
ここのルールなのですが、直したコードを貼って頂けますか。
よく有るのですが大丈夫だと本人が思っているだけで間違っている事が結構あります。
その上で、最終的に問題がなくなれば最終コードを投稿時に解決チェックをして投稿してください。
Re: 画像の表示の仕方について
Posted: 2012年8月25日(土) 01:45
by icon01
これは大変失礼いたしました。
遅ればせながら投稿させていただきます。
コード:
while文の外
int MAP[12][12];
int Block[16];
int Leng,Wid; //Lengは縦、Widは横の意味
int random;
for( Leng = 0; Leng <12 ; Leng++)
{
for( Wid = 0; Wid < 12; Wid++)
{
random = GetRand(12);
if(Leng == 0||Leng == 11||Wid == 0||Wid == 11)
{
MAP[Leng][Wid] = Block[7];
}
else
{
MAP[Leng][Wid] = Block[random];
}
}
while文の中
for( Leng = 0; Leng < 12; Leng++)
{
for( Wid = 0; Wid < 12; Wid++)
{
DrawGraph( Wid*32, Leng*32 , MAP[Leng][Wid], TRUE );
}
}
これで動いているので、もし間違ってたら此処の文の書きミスです。
追記
このコードを見てもらって、問題がなければ、お礼の言葉とともに解決ボタンにチェックを入れればいいのですか?
(すみません、文章力がなくて)
Re: 画像の表示の仕方について
Posted: 2012年8月25日(土) 11:07
by softya(ソフト屋)
最初の頃の投稿だと画像が16パターンだったんですが、random = GetRand(12);だと言うことは12パターンに減ったんでしょうか?
Re: 画像の表示の仕方について
Posted: 2012年8月25日(土) 14:11
by icon01
そうですね、他にも制限時間とかもろもろのデータを描画する段階にしシフトしたので、投稿が遅れてしまったぶん変更点があったことを失念していました。誤解を与えてしまい、申し訳ありませんでした。
Re: 画像の表示の仕方について
Posted: 2012年8月25日(土) 15:06
by softya(ソフト屋)
icon01 さんが書きました:そうですね、他にも制限時間とかもろもろのデータを描画する段階にしシフトしたので、投稿が遅れてしまったぶん変更点があったことを失念していました。誤解を与えてしまい、申し訳ありませんでした。
それ以外は問題ないと思います。
ちなみにですが、プログラムでよく使われる縦横はx,yやwidth,heightとかhorizon,verticalで表だとcolumn,rowです。
Re: 画像の表示の仕方について
Posted: 2012年8月25日(土) 15:14
by icon01
重ね重ね申し訳ありませんでした。
これにて、質問を終了させていただきます。
ありがとうございました。