ページ 11

他の画像を歩かせる

Posted: 2011年8月21日(日) 16:38
by OP
今、画像を4方向に歩かせるというところをやっているのですが、ほかの画像はどうだろうとおもい試してみた時の問題です。
渡された画像は128×128の
上上上上
左左左左
下下下下
右右右右
の画像なんですけれども、私がやってみたいっていう画像は、
下下下
左左左
右右右
上上上
の96×128なんですけれどもどういった風にコードを書けばいいのかわかりません。
下のコードです。誰かわかる人がいましたら返信お願いします。

コード:

#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;
}

Re: 他の画像を歩かせる

Posted: 2011年8月21日(日) 16:50
by h2so5
まずはLoadDivGraphのリファレンスをよく読みましょう。
http://homepage2.nifty.com/natupaji/DxL ... .html#R3N3

画像のフォーマットに合わせて引数を変える必要があります。

Re: 他の画像を歩かせる

Posted: 2011年8月21日(日) 16:53
by OP
12、3、4、32、32でしょうか?合ってますか?

Re: 他の画像を歩かせる

Posted: 2011年8月21日(日) 17:00
by h2so5
ここで合っている合っていないの話をしたところで、
実際に読み込めなきゃ意味が無いので、実行して試してみたらどうでしょうか。

間違っててもパソコンが壊れるわけではないので。

Re: 他の画像を歩かせる

Posted: 2011年8月21日(日) 17:03
by OP
実行してみたものです。どれが間違っているのか返信頂けるとうれしいです。

コード:

#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[12];
        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( "画像/12歩行.png" , 12 , 3 , 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)/11 + ch.muki*3];            //画像をセット
 
        DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
 
        ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

Re: 他の画像を歩かせる

Posted: 2011年8月21日(日) 17:58
by softya(ソフト屋)
読み込みのパラメータは良いと思いますが、
ch.img=image[(ch.x%32+ch.y%32)/11 + ch.muki*3]; //画像をセット
だとアニメーションがガタツキませんか?

出来れば、画面での表示に問題がなかったかも書いて欲しいのですが。

Re: 他の画像を歩かせる

Posted: 2011年8月21日(日) 19:33
by OP
いいえ、あんまり問題はなかったと思います…。きっと。

Re: 他の画像を歩かせる

Posted: 2011年8月21日(日) 19:59
by OP
10.3とかにするべきなのでしょうか?そういう問題ではないかもしれませんが…。

Re: 他の画像を歩かせる

Posted: 2011年8月21日(日) 20:04
by OP
あ!!そういえばありました!!なんか上を歩くのに下を向きながらっていうのがあって、困ってました。

Re: 他の画像を歩かせる

Posted: 2011年8月21日(日) 21:40
by softya(ソフト屋)
元の画像が
上上上上
左左左左
下下下下
右右右右
で新しい画像が
下下下 
左左左
右右右
上上上
なので上下左右の並びが変わっています。
ch.img=image[(ch.x%32+ch.y%32)/11 + ch.muki*3]; //画像をセット
のch.muki*3が名前通り向きの画像の番号を計算している部分です。
画像とイメージの番号の関連性を見てみましょう。

コード:

画像    番号
下下下 → 0  1  2 
左左左 → 3  4  5
右右右  → 6  7  8
上上上  → 9 10 11
つまり、下なら0上なら9にならないといけません。
ここで宿題です。どうしたら良いか考えてみてください。

Re: 他の画像を歩かせる

Posted: 2011年8月22日(月) 05:15
by OP
すいません…色々試してみたのですが、ch.img=image[(ch.x%32+ch.y%32)/11 + ch.muki*3];  この部分も三枚の絵だから11で割っていくということしかわかりません。typedef structがどういう意味かもわかりませんでした…。

Re: 他の画像を歩かせる

Posted: 2011年8月22日(月) 08:14
by Dixq (管理人)
恐らく単純な計算式だけじゃ計算しにくいと思います。
3枚の画像で一方向を表す場合、
1→0→1→2→1→0→...というループであるべきでしょう。
それを4方向にする必要があります。
配列要素にループさせたい番号を格納し、それを使って画像を指定する方法がスマートでよいでしょう。

突然全方向が難しければまず1方向のみを作って下さい。

int Dir[4]={1,0,1,2};

こんな風にループさせたい画像番号を格納しておき、
Dirの要素を0から3でループして指定できるようにすれば良いと思います。

Re: 他の画像を歩かせる

Posted: 2011年8月22日(月) 08:25
by OP
すいません…無知なものですからどういったコードに組み替えればいいかわからなくなってしまいました。
まだ難しいのでしょうか?

Re: 他の画像を歩かせる

Posted: 2011年8月22日(月) 09:51
by softya(ソフト屋)
前に解説したプログラムを日本語で書きだす事はされましたか?
理解出来ない部分があれば、それを質問してくださいね。

typedef structに関して、C言語の文法の問題ですので読んでみてください。
「構造体」
http://www.cc.kyoto-su.ac.jp/~yamada/pB/struct.html
OP さんが書きました:すいません…無知なものですからどういったコードに組み替えればいいかわからなくなってしまいました。
まだ難しいのでしょうか?
分かってしまえばさほどでも無いですが、C言語の文法の理解とゲームプログラミングの両方を理解しなければいけないので混乱しているのでしょう。
ただ、ここの歩くパターンの組み換えの部分は初心者が大体つまづく部分でプログラムを組める人なるには乗り越えなければいけないステップだと思います。

元の4x4のパターンの時にどうやってアニメーションパターンが計算されているかをまず理解してみてください。
下方向に歩くときのプログラムの動きを日本語で書きだしてみてはどうでしょうか?

Re: 他の画像を歩かせる

Posted: 2011年8月22日(月) 12:25
by OP
やっぱりはじめを理解することが大事かと思いました。
あのプログラムを日本語にして、第一の難題としていつか解いてみたいと思います。
返信してくださった皆様ありがとうございました。