ページ 11

「キャラを一区間単位で移動させる」の単元

Posted: 2011年1月30日(日) 04:01
by kerotan0820
http://dixq.net/g/22.html
上記URLの キャラを一区間単位で移動させる において、なぜキャラクターが一区間で歩くのかわかりません。

コード:

        if( Key[ KEY_INPUT_RIGHT ]  == 1 )      //右ボタンが押されたら
            ch.x++ ;                            //xの値を1増やす
 
        else if(ch.x%32!=0)                     //32で割り切れない区間はオートで進む
            ch.x++;
whileで上記の分岐が繰り返されているわけですが、一度 key[KEY_INPUT_RIGHT] に 右キーの入力があったら1が返されます
ということは、何度繰り返しがされてもまいど key[KEY_INPUT_RIGHT] == 1 が満たされてしまうのではないのでしょうか?

それとも、 この入力を求める関数は、一度入力を受けて値を返したら、また 0に初期化されるのでしょうか?

このように、あやふやなので質問させていただきました。
ご教示願います。

Re: 「キャラを一区間単位で移動させる」の単元

Posted: 2011年1月30日(日) 04:17
by sizuma
whileの()の中でキーの状態は取得していますね。

Re: 「キャラを一区間単位で移動させる」の単元

Posted: 2011年1月30日(日) 11:20
by kerotan0820
shizumaさん>>
回答ありがとうございます

しかし、一度の入力でなぜ 一区間のピクセル数で割れなくなるまで座標にプラスがされるのでしょうか
whileに入力を求める関数があるのでまいど入力を求められてしまって、ループがされないのではと... 

申し訳ありませんが再度ご教示お願いします

Re: 「キャラを一区間単位で移動させる」の単元

Posted: 2011年1月30日(日) 12:34
by sizuma
>一区間のピクセル数で割れなくなるまで
ピクセル数で割れるようになるまで、ですよ。


もしキーの押下に反応したら、ch.xがインクリメントされますよね。
仮に1ループ目でキーの押下に反応したとします。(ch.xは32の倍数+1、Key[ KEY_INPUT_RIGHT ]==1)
次に2ループ目ではキーが押されてない状態になったとします。
そうすると、プログラムではこう動きます

コード:

    while(!GetHitKeyStateAll( Key ) ){
        if( Key[ KEY_INPUT_RIGHT ]  == 1 ) {//押されていない状態なので、false
            ch.x++ ; 
        }
        else if(ch.x%32!=0) {                    //32で割ると、余りがでるのでch.xをインクリメント
            ch.x++;
        }
    //以下描写
        ch.img=image[12];
        DrawGraph( ch.x , ch.y , ch.img , TRUE  ) ;                             //[12]の画像を描画
        ScreenFlip();//裏画面を表画面に反映
    }
これはもししばらくキーが押されていない状態だとすると、ch.xが32で割り切れるまでelse ifの部分の条件にマッチするので続きますよね?

追記
GetHitKeyStateAll( Key )は入力を待つ関数ではなくて、そのときの入力状態をチェックする関数のようです。

編集 BBCodeを無効にしてたから

コード:

が使えなかった・・・・^^;

Re: 「キャラを一区間単位で移動させる」の単元

Posted: 2011年1月30日(日) 12:44
by Dixq (管理人)
本来はフラグを使うなりした方が良いのだと思いますが、サンプルなのでなるべく変数を減らそうと思ってこのような書き方にしました。
sizumaさんが既に仰っているようにコメントのままですが、xが32の倍数ではないときは

コード:

else if(ch.x%32!=0)                     //32で割り切れない区間はオートで進む
            ch.x++;
ここに入るのですから自動的に32の倍数になるまで進みます。

Re: 「キャラを一区間単位で移動させる」の単元

Posted: 2011年1月31日(月) 23:00
by kerotan0820
shizumaさん Dixqさん>>

回答ありがとうございます。

>>GetHitKeyStateAll( Key )は入力を待つ関数ではなくて、そのときの入力状態をチェックする関数

これが私の中で勘違いしていたことでした、 まいど入力を求める関数と思っていました(汗
お陰さまで次の単元の一区間を歩かせる も理解が出来ました。
本当にありがとうございました。