画像の表示の仕方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
icon01

画像の表示の仕方について

#1

投稿記事 by icon01 » 13年前

初めまして、いま私は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言語しか触ったことがないぺーぺ+この掲示板初利用者です。

至らないことだらけだと思いますが、よろしくお願いいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像の表示の仕方について

#2

投稿記事 by softya(ソフト屋) » 13年前

この掲示板のルールなのですが、okwave系の質問とマルチポストになってしまっていすので補足をなどを使って相互リンクを(回答者が相互の掲示板を参照可能なようにリンクを貼ること)をお願いします。
http://dixq.net/board/board.html

それと、前後の部分がないと的確なアドバイスが難しいです。
whileループという文面からDxLib_Init()直後ではないと推測されますが確定するためにも前後の状況が分かる必要があります。
インデントについても気をつけてください。
「mixcpp/投稿前チェックリスト - PukiWiki」
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

icon01

Re: 画像の表示の仕方について

#3

投稿記事 by icon01 » 13年前

追記です
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回のペースで変化してしまうのです。

ついでに言うと、変数の初期化などはヘッダファイルでしてあるのを便宜的にこう書き直しただけです。
すみません。説明不足だったようで

と、ここまで書き直しましたが、やはり至らないことだらけかもしれません。
申し訳ございませんが、少しでも早く馴れるよう努力していきたいと思っております。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像の表示の仕方について

#4

投稿記事 by softya(ソフト屋) » 13年前

okwave側から、こちらへのリンクもお願いします。両方あってこその相互リンクですので。
あとインデントに全角スペースを使わないでくださいね。コンパイルエラーになりますから。

1) ソースを見る限り、2重にwhileは必要ありません。while( 1 ) が不要です。
2) パズル面の状態は配列に書き込んで記録しておく必要があると思います。
そのパズル面の状態の配列に従って表示するようにしてください。
3) パズル面の状態の配列はwhileループ前に乱数で初期化しておいてください。
そうすれば毎フレーム書き換わる事がなくなります。

【補足】
>ついでに言うと、変数の初期化などはヘッダファイルでしてあるのを便宜的にこう書き直しただけです。

#defineなどはヘッダで問題ありませんがヘッダで変数を初期化するのは良いことではありません。
ファイル分割などを行った時には問題となります。これは別の問題なので本来の問題が片付いてからにしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

icon01

Re: 画像の表示の仕方について

#5

投稿記事 by icon01 » 13年前

 何度も失礼します。
色々試してみたのですが。うまくいきませんでした。

配列を用意するとのことですが、例えば、MAP[15][20]という感じの二次元配列のことですよね?
これをfor文使ってMAP[j]みたいにして中身をいじるのはいいのですが、これをwhile文の外でした後、while文の中で
どうやって表示をしたらよいのでしょうか?
それとも、LoadDivGraphで画像を読み込む処理をfor文で回したりする必要があるのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像の表示の仕方について

#6

投稿記事 by softya(ソフト屋) » 13年前

whileの外でMAP[j]に乱数を使って代入します。
whileの中ではMAP[j]をBlockの添字に使って表示に使います。
こうすれば毎フレーム変わる問題はありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

icon01

Re: 画像の表示の仕方について

#7

投稿記事 by icon01 » 13年前

  おかげさまで解決することができました。

 どうもありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像の表示の仕方について

#8

投稿記事 by softya(ソフト屋) » 13年前

icon01 さんが書きました:  おかげさまで解決することができました。

 どうもありがとうございました。
ここのルールなのですが、直したコードを貼って頂けますか。
よく有るのですが大丈夫だと本人が思っているだけで間違っている事が結構あります。
その上で、最終的に問題がなくなれば最終コードを投稿時に解決チェックをして投稿してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

icon01

Re: 画像の表示の仕方について

#9

投稿記事 by icon01 » 13年前

これは大変失礼いたしました。

遅ればせながら投稿させていただきます。

コード:


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 );
    }
}
これで動いているので、もし間違ってたら此処の文の書きミスです。

追記
このコードを見てもらって、問題がなければ、お礼の言葉とともに解決ボタンにチェックを入れればいいのですか?
(すみません、文章力がなくて)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像の表示の仕方について

#10

投稿記事 by softya(ソフト屋) » 13年前

最初の頃の投稿だと画像が16パターンだったんですが、random = GetRand(12);だと言うことは12パターンに減ったんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

icon01

Re: 画像の表示の仕方について

#11

投稿記事 by icon01 » 13年前

そうですね、他にも制限時間とかもろもろのデータを描画する段階にしシフトしたので、投稿が遅れてしまったぶん変更点があったことを失念していました。誤解を与えてしまい、申し訳ありませんでした。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像の表示の仕方について

#12

投稿記事 by softya(ソフト屋) » 13年前

icon01 さんが書きました:そうですね、他にも制限時間とかもろもろのデータを描画する段階にしシフトしたので、投稿が遅れてしまったぶん変更点があったことを失念していました。誤解を与えてしまい、申し訳ありませんでした。
それ以外は問題ないと思います。
ちなみにですが、プログラムでよく使われる縦横はx,yやwidth,heightとかhorizon,verticalで表だとcolumn,rowです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

icon01

Re: 画像の表示の仕方について

#13

投稿記事 by icon01 » 13年前

重ね重ね申し訳ありませんでした。

これにて、質問を終了させていただきます。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る