「キャラを4方向に動かす」プログラムについて

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

「キャラを4方向に動かす」プログラムについて

#1

投稿記事 by ざっきー » 8年前

初めて質問掲示板を利用させていただきます。
「ゲームプログラミングを館」の方の「~ゲーム基本編~」にある
キャラを4方向に動かすプログラムで、少しわからないところがあります。

コード:

#include "DxLib.h"
 
typedef struct{
        int x,y,img,muki,walking_flag;
}ch_t;
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
        int image[16];
        char Key[256];
        ch_t ch;
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
        ch.x    =320;
        ch.y    =160;
        ch.walking_flag=0;
        ch.muki=3;
 
        SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定
        LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
        if(ch.x%32==0 && ch.y%32==0){         //座標が32で割り切れたら入力可能
            ch.walking_flag=1;         //歩くフラグを立てる。
            if     ( Key[ KEY_INPUT_UP   ]  == 1 )  //上ボタンが押されたら
                    ch.muki=0;         //上向きフラグを立てる
            else if( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
            else if( Key[ KEY_INPUT_DOWN ]  == 1 )  //下ボタンが押されたら
                    ch.muki=2;         //下向きフラグを立てる
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
                    ch.muki=3;         //右向きフラグを立てる
            else                                    //何のボタンも押されてなかったら
                    ch.walking_flag=0; //歩かないフラグを立てる
        }
 
        if(ch.walking_flag==1){        //歩くフラグが立っていたら
            if     (ch.muki==0)        //上向きならch.y座標を減らす
                    ch.y--;
            else if(ch.muki==1)        //左向きならch.x座標を減らす
                    ch.x--;
            else if(ch.muki==2)        //下向きならch.y座標を増やす
                    ch.y++;
            else if(ch.muki==3)        //右向きならch.x座標を増やす
                    ch.x++;
        }
 
        ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];            //画像をセット
 
        DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
 
        ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}
上記コードの26行目からのif文についてなんですが、
if(ch.x%32==0 && ch.y%32==0) の条件を満たしていて、何も入力がない場合はwalkking_flagには0が入りますよね?
そこで例えばキーボードから上ボタンが押されるとch.mukiには0が代入され、walking_flagには1が代入されるので、
40行目からのif文の処理によってキャラのy座標がデクリメントされると思うんですが、何故上ボタンを押した時点で
warking_flagに1が代入されるんでしょうか。
ch.mukiに0が代入されるのはわかりますが、なぜ27行目のwarking_flag = 1が適用されるのかがわかりません。

ちなみにC言語歴は半年程度です。ご回答よろしくお願いします。

maru
記事: 150
登録日時: 9年前

Re: 「キャラを4方向に動かす」プログラムについて

#2

投稿記事 by maru » 8年前

ざっきー さんが書きました: 上記コードの26行目からのif文についてなんですが、
if(ch.x%32==0 && ch.y%32==0) の条件を満たしていて、何も入力がない場合はwalkking_flagには0が入りますよね?
それは37行目の処理ですね。
ざっきー さんが書きました: 何故上ボタンを押した時点で
warking_flagに1が代入されるんでしょうか。
ch.mukiに0が代入されるのはわかりますが、なぜ27行目のwarking_flag = 1が適用されるのかがわかりません。
ボタンを押した時点でwarking_flagに1が代入されるのではありません。
ボタンが押されたかどうかを判定する前(27行目)に1を代入しているのです。
そして、キーが押されていないことが分かったら、0を代入(37行目)しているのです。

アバター
BEAT
記事: 4
登録日時: 9年前
住所: 兵庫県S市杜王町
連絡を取る:

Re: 「キャラを4方向に動かす」プログラムについて

#3

投稿記事 by BEAT » 8年前

歩いていないとき、歩こうとしていないときにwalking_flag=0
歩こうとするとき歩く必要があるときにwalking_flag=1にするわけです。

入力があれば36行目のelseが実行されないのでwalk_flag=1となり

40行のif文で現在の向きを参照してその方向に移動してるわけです

閉鎖

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