他の画像を歩かせる

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

他の画像を歩かせる

#1

投稿記事 by OP » 14年前

今、画像を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;
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 他の画像を歩かせる

#2

投稿記事 by h2so5 » 14年前

まずはLoadDivGraphのリファレンスをよく読みましょう。
http://homepage2.nifty.com/natupaji/DxL ... .html#R3N3

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

OP

Re: 他の画像を歩かせる

#3

投稿記事 by OP » 14年前

12、3、4、32、32でしょうか?合ってますか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 他の画像を歩かせる

#4

投稿記事 by h2so5 » 14年前

ここで合っている合っていないの話をしたところで、
実際に読み込めなきゃ意味が無いので、実行して試してみたらどうでしょうか。

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

OP

Re: 他の画像を歩かせる

#5

投稿記事 by OP » 14年前

実行してみたものです。どれが間違っているのか返信頂けるとうれしいです。

コード:

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

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

Re: 他の画像を歩かせる

#6

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

読み込みのパラメータは良いと思いますが、
ch.img=image[(ch.x%32+ch.y%32)/11 + ch.muki*3]; //画像をセット
だとアニメーションがガタツキませんか?

出来れば、画面での表示に問題がなかったかも書いて欲しいのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

OP

Re: 他の画像を歩かせる

#7

投稿記事 by OP » 14年前

いいえ、あんまり問題はなかったと思います…。きっと。

OP

Re: 他の画像を歩かせる

#8

投稿記事 by OP » 14年前

10.3とかにするべきなのでしょうか?そういう問題ではないかもしれませんが…。

OP

Re: 他の画像を歩かせる

#9

投稿記事 by OP » 14年前

あ!!そういえばありました!!なんか上を歩くのに下を向きながらっていうのがあって、困ってました。

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

Re: 他の画像を歩かせる

#10

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

元の画像が
上上上上
左左左左
下下下下
右右右右
で新しい画像が
下下下 
左左左
右右右
上上上
なので上下左右の並びが変わっています。
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にならないといけません。
ここで宿題です。どうしたら良いか考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

OP

Re: 他の画像を歩かせる

#11

投稿記事 by OP » 14年前

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

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 他の画像を歩かせる

#12

投稿記事 by Dixq (管理人) » 14年前

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

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

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

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

OP

Re: 他の画像を歩かせる

#13

投稿記事 by OP » 14年前

すいません…無知なものですからどういったコードに組み替えればいいかわからなくなってしまいました。
まだ難しいのでしょうか?

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

Re: 他の画像を歩かせる

#14

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

前に解説したプログラムを日本語で書きだす事はされましたか?
理解出来ない部分があれば、それを質問してくださいね。

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

元の4x4のパターンの時にどうやってアニメーションパターンが計算されているかをまず理解してみてください。
下方向に歩くときのプログラムの動きを日本語で書きだしてみてはどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

OP

Re: 他の画像を歩かせる

#15

投稿記事 by OP » 14年前

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

閉鎖

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