ページ 11

画像表示方法について

Posted: 2008年8月21日(木) 22:31
by situmon
#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" , 0 , 0 , 0 , 64 , 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_LEFT ]  == 1 )  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
            else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
                    ch.muki=2;         //右向きフラグを立てる
            else                                    //何のボタンも押されてなかったら
                    ch.walking_flag=0; //歩かないフラグを立てる
        }

        if(ch.walking_flag==1){        //歩くフラグが立っていたら
            if     (ch.muki==1)        //左向きならch.x座標を減らす
                    ch.x--;
            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: 2008年8月21日(木) 22:45
by array
画像は1枚ですよね。

それなら

ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット

ここが、間違ってると思います。

Re:画像表示方法について

Posted: 2008年8月21日(木) 22:53
by array
/* プログラム内容 */
>    //  省略  //
>         LoadDivGraph( "char.png" , 0 , 0 , 0 , 64 , 32 , image ) ;//画像を分割してimage配列に保存
>    //  省略  //
>         ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];            //画像をセット
>
 

修正は、この2ヶ所で良いのかな。



image[0] = LoadGraph("char.png");

分割読み込みする必要はないと思うので^^



ch.img = image[0];

画像は1枚なので。

Re:画像表示方法について

Posted: 2008年8月22日(金) 00:36
by 管理人
前のトピで回答した内容が直ってないようですが、回答はご覧になりましたか?
[20367]の私の投稿は理解出来ました?

Re:画像表示方法について

Posted: 2008年8月22日(金) 19:17
by situmon
すいません、管理人さんに答えていただいたのですが意味がわかりませんでしたすいません。
arrayさま答えていただきありがとうございました。

Re:画像表示方法について

Posted: 2008年8月24日(日) 01:32
by 管理人
それだけでは解決しないと思いますが,解決しました?
どこがわからないか言ってもらえたら重点的に解説します。

前トピの内容をもう一度コピーして提示します。

(1)
>LoadDivGraph( "char.png" , 1 , 1 , 1 , 64 , 32 , image ) ;//画像を分割してimage配列に保存

32x64なので、ここが反対ですね。

(2)
>ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];            //画像をセット

配列は理解していますか?
今画像が一つしかないのに、無い画像番号をさしています。
これは16種類画像があって、それを歩くモーションにあわせて画像を変更するための処理です。
今は要素番号0しか使えません。

(3)
>if     ( Key[ KEY_INPUT_LEFT ]  == 1 )  //左ボタンが押されたら
>   ch.muki=1;         //左向きフラグを立てる
>else if( Key[ KEY_INPUT_RIGHT]  == 1 )  //右ボタンが押されたら
>   ch.muki=2;         //右向きフラグを立てる

向きは左を1,右を2としているのに

>        if     (ch.muki==1)        //左向きならch.x座標を減らす
>                    ch.x--;
>        else if(ch.muki==3)        //右向きならch.x座標を増やす
>                    ch.x++;

そのように処理されていません。
そして、今回は一区間ずつ歩かせる必要はないので、
私がかいたサンプルのようにキーが入力されていたらそのままそちらに移動させるだけでいいと思います。



(1)は32x64の数字をお互いに入れ替えたらいいということです。

(2)はarrayさんの仰ったようにない番号をさしているので,おかしいですね。今は[0]しかないはずです。

(3)はセットした向きと計算している向きの番号が違うということを言っています。ch.mukiの番号を確認してください。