ページ 11

初心者です

Posted: 2010年3月31日(水) 02:43
by mitunari
C言語ゲームプログラミングの館で勉強しているのですが、
キャラを四方向に‥の場所を覚えたので自分で考えて打ったのですが(int WINAPI WinMa‥はコピペ
画面の左に永遠と歩き画面の一番左で上を向きます
どうすれば直せますか?
#include "DxLib.h"

typedef struct{
int x,y,muki,img,aruku_flag;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理

int image[16];
char Key[256];
ch_t ch;
ch.x=320;
ch.y=0;
ch.muki=1;
ch.aruku_flag=0;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていな
if(ch.y%32==0 && ch.x==0){
ch.aruku_flag=1;
if(Key[KEY_INPUT_UP]==1)
ch.muki=0;
else if(Key[KEY_INPUT_LEFT]==1)
ch.muki=4;
else if(Key[KEY_INPUT_DOWN]==1)
ch.muki=8;
else if(Key[KEY_INPUT_RIGHT]==1)
ch.muki=12;
else
ch.aruku_flag=0;
}
if(ch.aruku_flag=1){
if(ch.muki=4)
ch.x--;

else if(ch.muki=0)
ch.y--;

else if(ch.muki=8)
ch.y++;


else if(ch.muki=12)
ch.x++;}


LoadDivGraph("char.png",16,4,4,32,32,image);
ch.img=image[(ch.x%32)/8+ch.muki];
DrawGraph(ch.x,ch.y,ch.img,TRUE);
ScreenFlip();
}

DxLib_End();
return 0;
}

Re:初心者です

Posted: 2010年3月31日(水) 04:33
by kazuoni
C言語ゲームプログラミングの館をそのままコピぺすれば動くようになります。

Re:初心者です

Posted: 2010年3月31日(水) 08:18
by ideyan
if(ch.aruku_flag=1)
ではなく
if(ch.aruku_flag==1)
ではないでしょうか。
今のままでは代入されて毎回実行されます。

同様のミスが何カ所かあるみたいなので
全て直してみてください。

>kazuoniさん

Posted: 2010年3月31日(水) 15:33
by mitunari
そうなんですが自分だけで書くことも大切だと思ったので‥

:>ideyanさん

Posted: 2010年3月31日(水) 15:35
by mitunari
ありがとうございました!
そことif(ch.y%32==0 && ch.x==0){
とch.img=image[(ch.x%32)/8+ch.muki];
これをなをして成功しました!

Re::>ideyanさん

Posted: 2010年3月31日(水) 17:18
by wing
うまく動いているように見えますが、
LoadDivGraph("char.png",16,4,4,32,32,image);
これを初期化処理のところに書かないのは
たいへん大きなミスです。

kazuoniさんも言っていますが、サンプルのプログラムは
よくできているので、改造することなく、そのままのコードで
使用するのが一番いいです。

Re::>ideyanさん

Posted: 2010年3月31日(水) 17:56
by たいちう
あくまでも、ご参考までに...


私の場合は手打ちします。特に新しい言語を覚えようという場合など。
何故かというと、その環境でのデバッグを体験するために、
少々のバグが混入させることを期待しているわけです。

習得後に必要になるであろう実際のデバッグと比べると、
正しいとされているソースコードもあるデバッグは格段に簡単だからです。

また、元のサンプルの出来の良し悪しは別として、
別のスタイルへの変更もしたい時があります。
ちょっとこの機能を追加したいとか、この機能を使うことは当面無さそうだから、
定数にしちゃえとかも。

# デバッグして行き詰ったときに、元のソースをコピペで試すことが
# 有効なのは勿論です。

Re:初心者です

Posted: 2010年3月31日(水) 18:09
by Dixq (管理人)
サンプルの良し悪しは…悪しですね(笑)

ところで、コードの意味を理解する事が最重要だと思います。
画像の番号の計算式はなかなか特殊に思えますよね。
あの計算式の意味はわかりますか?

わかれば、割った数を一度変数に入れた方が自分はわかりやすいだとか、変更する意味も見出だせ、理解が深まるでしょう。

手打ちも理解しようとしてうつか、ただ丸写ししてうつかではかなり違います。何も考えない丸写しはコピーとかわりません。うってて解らなければ一度手をとめてみましょう。

Re::>ideyanさん

Posted: 2010年3月31日(水) 22:43
by mitunari
そうなんですか‥教えていただきありがとうございます!
ただ実際に作るときは自分で全てやるという変なこだわりがあってw
>たいちうさん
書くとかきましたが今私がのせていたものはコピのところ以外見ないで手打ちしています
>Dixqさん
覚えて(単語などを)から自分で考えてうっています
サンプルは‥良いですよw
理解するのにかなり時間をつかいました(ch.x%32←これ
念のために‥
x座標の数÷32=YあまりZ
Z÷8=表示する画像 あまりは切捨て
ですよね?

Re::>ideyanさん

Posted: 2010年4月01日(木) 08:07
by Dixq (管理人)
そうですね。
%はあまりを求める演算子です。ですから0-31を繰り返します。
それを8で割るので、同じ周期で0-3を繰り返します。
「割った余り」はループを多用するゲームプログラムではすごく良く使えますので覚えておくと便利ですよ。