22. キャラを4方向に歩かせる。について質問なんですが・・。

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

22. キャラを4方向に歩かせる。について質問なんですが・・。

#1

投稿記事 by リョキョタ » 16年前

サンプルプログラムの「ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセット」
の部分のch.muki*4の意味がいまいちよくわかりません。最初にch.mukiに3を代入している意味もわかりません。
ちなみにつくってみたやつはビルドはできるんですが実行すると画像が表示されないのはなぜでしょうか?
↓自分でサンプルプログラムと画像を変えて作ってみたんですがどこかまちがってますか?(画像の名前:tama.png , サイズ100×100 ,マスの個数はxが3個でyが4個の全部で12個です。)
#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 =150;
ch.y =150;
ch.walking_flag = 0;
ch.muki=3;


SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "tama.png" , 12 , 3 , 4 , 100 , 100 , image ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

if(ch.x%100==0 && ch.y==0){//キャラが静止しているとき
ch.walking_flag = 1;//ch.walking_flag==1が発動

if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右ボタンが押されたら
ch.muki = 0;
else if(Key[ KEY_INPUT_LEFT] ==1 )
ch.muki = 1;
else if(Key[ KEY_INPUT_UP] == 1)
ch.muki = 2;
else if(Key[ KEY_INPUT_DOWN] == 1)
ch.muki = 3;
else
ch.walking_flag=0;
}

if(ch.walking_flag == 1){//発動したら、
if(ch.muki==0)
ch.x++;
else if(ch.muki==1)
ch.x--;
else if(ch.muki==2)
ch.y--;
else if(ch.muki==3)
ch.y++;
}


ch.img=image[(ch.x%100+ch.y%100)/33+ch.muki*4];

DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;

ScreenFlip();
}

DxLib_End();
return 0;
}

教えてくださいm( __)m

kazuoni

Re:22. キャラを4方向に歩かせる。について質問なんですが・・。

#2

投稿記事 by kazuoni » 16年前

ch.muki*4ではキャラの画像の向きを決めています。
例えば、プログラミングの館の例でいえば
↑キーのときch.muki=0です。
そうすると16分割したときのいちばん上の行
(キャラが後ろ向いている4つ)
を示しています。
あとは(ch.x%32+ch.y%32)/8でその4つのなかの何番目を表示するのか決めています。

>自分でサンプルプログラムと画像を変えて作ってみたんですがどこかまちがってますか?
>(画像の名前:tama.png , サイズ100×100 ,マスの個数はxが3個でyが4個の全部で12個です。)

保存先が違う、ファイル名が違うなどが考えられます。
↑のコードが書いてあるソースファイルと同じ場所に画像がありますか?

あとちょっと疑問に思ったのですが
画像のサイズが100×100ですか?
それとも分割した一つが100×100ですか?
LoadDivGraph()の第5,6引数は分割した時の一つの大きさです。
もし前者ならば
3×4だときれいに割れないですが、
LoadDivGraph( "tama.png" , 12 , 3 , 4 , 33 , 25 , image )
です。

リョキョタ

Re:22. キャラを4方向に歩かせる。について質問なんですが・・。

#3

投稿記事 by リョキョタ » 16年前

 ch.muki*4はキャラの向きで、最初にch.muki=3;となっていたのは、
単に右を向いて始まるとうことだったんですね!


 前の段階の「21. キャラを一区間歩かせる」まではちゃんと表示されていたので、
フォルダを間違えてはいないと思います。
あと、画像の100×100は区切ったときの大きさでした。すいません><;
ですから、区切る前は300×400です;
ほかに考えられるところはありませんか?

kazuoni

Re:22. キャラを4方向に歩かせる。について質問なんですが・・。

#4

投稿記事 by kazuoni » 16年前

まずは原因から。
if(ch.x%100==0 && ch.y==0)
この文は絶対に実行されることはありません。
まず初期条件で
150%100=50
ですから満たしません。
(もちろん初期条件よりch.y==0でもないですし^^;)
次に
if(ch.walking_flag == 1)
も実行されません。初期条件でフラグを立てていないからです。
フラグを立てる文は最初のifの中ですので、フラグが立つこともありません。
最後に
ch.img=image[(ch.x%100+ch.y%100)/33+ch.muki*4]
を実行していますが、
ch.img=image[(50+50)/33+4*3]=image[15]
となり、そのimgはありません。

kazuoni

Re:22. キャラを4方向に歩かせる。について質問なんですが・・。

#5

投稿記事 by kazuoni » 16年前

解決策としては
変更点
ch.x =200;
ch.y =200;
...
if(ch.x%100==0 && ch.y%100==0)
...
ch.img=image[(ch.x%100+ch.y%100)/33+ch.muki*3];
初期位置を変更したのはゲーム開始後いきなりキャラが動いているのは不自然かなと思いまして。
もし動いてもいいなら
ch.x =100; 
ch.y =150; 
ch.walking_flag = 1;
ch.muki=3;
こんな感じで。

if(ch.x%100==0 && ch.y==0)のch.y==0
はなにか意図があってのものでしょうか?
もしこれだと一回↓キーが押されたらずっとch.y++を繰り返すことになり、
一度フラグが立ってしまうと
とても危ないことになるような気がします。

リョキョタ

Re:22. キャラを4方向に歩かせる。について質問なんですが・・。

#6

投稿記事 by リョキョタ » 16年前

画像が表示できました!
kazuoniさんのおっしゃるとおりでした。
ありがとうございますm(__)m
if(ch.x%100==0 && ch.y==0)のch.y==0 は意図はなく入力ミスですorz..

kazuoni

Re:22. キャラを4方向に歩かせる。について質問なんですが・・。

#7

投稿記事 by kazuoni » 16年前

自分も最初外れた事を書いてしまって申し訳ないです。
もっとコードをしっかり見る癖を養わないと・・・。

がんばってください。

リョキョタ

Re:22. キャラを4方向に歩かせる。について質問なんですが・・。

#8

投稿記事 by リョキョタ » 16年前

がんばります、ありがとうございました。

閉鎖

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