初心者です。4方向にあるけません。
初心者です。4方向にあるけません。
画像が 縦32ピクセル、 横24ピクセル で
4方向にテクテク歩く動作をしようと思ったのですが、
どこを変えればきれいに動くのか分かりません。
#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;
}
これから変えるにはどうすればよいでしょうか。
右や左といった、1方向の動きはできました。
4方向にテクテク歩く動作をしようと思ったのですが、
どこを変えればきれいに動くのか分かりません。
#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;
}
これから変えるにはどうすればよいでしょうか。
右や左といった、1方向の動きはできました。
Re:初心者です。4方向にあるけません。
プログラムを見ると32と言う数値があちこちにありますよね。
これがグラフィックのサイズと関係しています。
プログラムへの理解を深めてもらうために、あえてズバリな答えは書きませんので、何処を変えたら良いかためしに書き換えたソースコードを掲載してください。
そのためには各関数のパラメータの意味を理解する必要がありますので、こちらでパラメータを再確認してくださいね。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
ゲームプログラミングの館を22まで読み直してみるのも良いでしょう。
これがグラフィックのサイズと関係しています。
プログラムへの理解を深めてもらうために、あえてズバリな答えは書きませんので、何処を変えたら良いかためしに書き換えたソースコードを掲載してください。
そのためには各関数のパラメータの意味を理解する必要がありますので、こちらでパラメータを再確認してくださいね。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
ゲームプログラミングの館を22まで読み直してみるのも良いでしょう。
Re:初心者です。4方向にあるけません。
>どこを変えればきれいに動くのか分かりません。
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ; if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能 ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4]; //画像をセットの三か所を書きなおすだけで良いと思いますよ。
Re:初心者です。4方向にあるけません。
前回より丁寧によんでいきました。
21章まではすらすらとつまづかずにいけたのですが、
22章で
ch.img=image[(ch.x%24+ch.y%32)/8+ch.muki*○
の○の部分に何を入れればよいのかが分かりません。
ここの22章にmukiの意味が載っていなかったので、どう変えればよいのか・・・。
しかし、サンプル道理 muki*4 で実行してみたところ、
下に進むとき、に一瞬画像がきえて、
右に進むとき、すべての画像が見えなくなります。
muki*3 に変えてやってみたところ、
左へのテクテクは正常に動作して、
他、3方向は向いている方向が違うまま、指定した方向へ動きました。
僕はmukiが関係しているのではないかと思うのですが、どうなのでしょうか?
21章まではすらすらとつまづかずにいけたのですが、
22章で
ch.img=image[(ch.x%24+ch.y%32)/8+ch.muki*○
の○の部分に何を入れればよいのかが分かりません。
ここの22章にmukiの意味が載っていなかったので、どう変えればよいのか・・・。
しかし、サンプル道理 muki*4 で実行してみたところ、
下に進むとき、に一瞬画像がきえて、
右に進むとき、すべての画像が見えなくなります。
muki*3 に変えてやってみたところ、
左へのテクテクは正常に動作して、
他、3方向は向いている方向が違うまま、指定した方向へ動きました。
僕はmukiが関係しているのではないかと思うのですが、どうなのでしょうか?
Re:初心者です。4方向にあるけません。
kazuoniさん
LoadDivGraph( "char.png" , 12 , 3 , 4 , 24 , 32 , image ) ;
if(ch.x%24==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.img=image[(ch.x%24+ch.y%32)/8 + ch.muki*4]; //画像をセット
このように変えてみたのですが、どうなのでしょうか。
画像は、
横24ピクセル 縦32ピクセル で
横は3分割 縦 4分割です。
LoadDivGraph( "char.png" , 12 , 3 , 4 , 24 , 32 , image ) ;
if(ch.x%24==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.img=image[(ch.x%24+ch.y%32)/8 + ch.muki*4]; //画像をセット
このように変えてみたのですが、どうなのでしょうか。
画像は、
横24ピクセル 縦32ピクセル で
横は3分割 縦 4分割です。
Re:初心者です。4方向にあるけません。
>ch.muki*○
これを理解するには、LoadDivGraphでimage配列にどう格納されているか理解しないといけません。
LoadDivGraph( "char.png" , 12 , 3 , 4 , 24 , 32 , image ) ;
でロードした場合、
[0][1][2]
[3][4][5]
[6][7][8]
[9][10][11]
と配列に分割されて格納されます。
ここの説明は19~21章にありますよね。
で、mukiと配列の対応を見てみます。
mukiが0なら画像の[0][1][2]を使いますよね。
同様に、mukiが1なら画像の[3][4][5]を、mukiが2なら画像の[6][7][8]を、
mukiが3なら画像の[9][10][11]を使いますよね。
ここはOKでしょうか?
であれば、3か4のどちらかが正しいかは明確ではないでしょうか?
>ch.img=image[(ch.x%24+ch.y%32)/8 + ch.muki*4]; //画像をセット
ここについては、なぜ/8なのかを理解してください。21章に書いてありますよ。
じつは歩く画像が3コマなのは、非常に問題があります。
出来なくは無いですが、今の式のままでは無理です。
なぜ無理なのか考えてみてください。
これを理解するには、LoadDivGraphでimage配列にどう格納されているか理解しないといけません。
LoadDivGraph( "char.png" , 12 , 3 , 4 , 24 , 32 , image ) ;
でロードした場合、
[0][1][2]
[3][4][5]
[6][7][8]
[9][10][11]
と配列に分割されて格納されます。
ここの説明は19~21章にありますよね。
で、mukiと配列の対応を見てみます。
mukiが0なら画像の[0][1][2]を使いますよね。
同様に、mukiが1なら画像の[3][4][5]を、mukiが2なら画像の[6][7][8]を、
mukiが3なら画像の[9][10][11]を使いますよね。
ここはOKでしょうか?
であれば、3か4のどちらかが正しいかは明確ではないでしょうか?
>ch.img=image[(ch.x%24+ch.y%32)/8 + ch.muki*4]; //画像をセット
ここについては、なぜ/8なのかを理解してください。21章に書いてありますよ。
じつは歩く画像が3コマなのは、非常に問題があります。
出来なくは無いですが、今の式のままでは無理です。
なぜ無理なのか考えてみてください。
Re:初心者です。4方向にあるけません。
1区間を24ピクセルとしていて、
コマが3つなので 3つにわけるには 24÷8 だから /8 ですね。
ここまでは理解できました。
mukiについてですか、
むく方向が4つあるから、 muki*4 なんでしょうか?
コマが3つなので 3つにわけるには 24÷8 だから /8 ですね。
ここまでは理解できました。
mukiについてですか、
むく方向が4つあるから、 muki*4 なんでしょうか?
Re:初心者です。4方向にあるけません。
>1区間を24ピクセルとしていて、
>コマが3つなので 3つにわけるには 24÷8 だから /8 ですね。
>ここまでは理解できました。
それは横方向の移動の場合だけですね。
実は、横方向は問題ないんですよ。
でも縦方向の移動はどうでしょうか?
問題ありませんか?
>mukiについてですか、
>むく方向が4つあるから、 muki*4 なんでしょうか?
mukiの値の範囲は4方向で0から3ですよね。最大値の3*4だと12となります。
これだと配列の番号を超えてしまいますよね。
向きごとの配列の最初の番号とmukiの値との対応をよ~く見てみてください。
>コマが3つなので 3つにわけるには 24÷8 だから /8 ですね。
>ここまでは理解できました。
それは横方向の移動の場合だけですね。
実は、横方向は問題ないんですよ。
でも縦方向の移動はどうでしょうか?
問題ありませんか?
>mukiについてですか、
>むく方向が4つあるから、 muki*4 なんでしょうか?
mukiの値の範囲は4方向で0から3ですよね。最大値の3*4だと12となります。
これだと配列の番号を超えてしまいますよね。
向きごとの配列の最初の番号とmukiの値との対応をよ~く見てみてください。
Re:初心者です。4方向にあるけません。
>このように変えてみたのですが、どうなのでしょうか。
softyaさんのレクチャーがあるので・・・
・・・
がんばってくださいw
softyaさんのレクチャーがあるので・・・
・・・
がんばってくださいw
Re:初心者です。4方向にあるけません。
縦のピクセルは32ですので、32を4分割するには8ずつ区切ればよいので
32/8
横と同じとおもってしまうのですが・・・。
最大値というのは、画像を分割したときの数でしょうか。
向きごとの配列の最初の番号ということは、
muki*0 のとき 最初が [0]
muki*1 のとき 最初が [3]
muki*2 のとき 最初が [6]
muki*3 のとき 最初が [9]
ということなのでしょうか?
32/8
横と同じとおもってしまうのですが・・・。
最大値というのは、画像を分割したときの数でしょうか。
向きごとの配列の最初の番号ということは、
muki*0 のとき 最初が [0]
muki*1 のとき 最初が [3]
muki*2 のとき 最初が [6]
muki*3 のとき 最初が [9]
ということなのでしょうか?
Re:初心者です。4方向にあるけません。
>最大値というのは、画像を分割したときの数でしょうか。
mukiの最大値が3だってことですね。
>向きごとの配列の最初の番号ということは、
>muki*0 のとき 最初が [0]
>muki*1 のとき 最初が [3]
>muki*2 のとき 最初が [6]
>muki*3 のとき 最初が [9]
>ということなのでしょうか?
はい。それが正解です。
>縦のピクセルは32ですので、32を4分割するには8ずつ区切ればよいので
>32/8横と同じとおもってしまうのですが・・・。
ここで大きな勘違いをしています。
>(ch.x%24+ch.y%32)/8
は、[0][1][2]を選ぶための計算です。元の画像の横方向の位置ですね。アニメのコマの番号です。
>ch.muki*4
は、[0][3][6][9]を選ぶための計算です。つまり元の画像の縦方向の位置を選んでいます。これでキャラクタの向きを選びます。
なので、組み合わせると[0]~[11]を選ぶ事ができます。
でも、(ch.y%32)/8はまずいです。なぜなら4分割して0から3を計算してしまうからです。アニメのコマは3つですよね?
mukiの最大値が3だってことですね。
>向きごとの配列の最初の番号ということは、
>muki*0 のとき 最初が [0]
>muki*1 のとき 最初が [3]
>muki*2 のとき 最初が [6]
>muki*3 のとき 最初が [9]
>ということなのでしょうか?
はい。それが正解です。
>縦のピクセルは32ですので、32を4分割するには8ずつ区切ればよいので
>32/8横と同じとおもってしまうのですが・・・。
ここで大きな勘違いをしています。
>(ch.x%24+ch.y%32)/8
は、[0][1][2]を選ぶための計算です。元の画像の横方向の位置ですね。アニメのコマの番号です。
>ch.muki*4
は、[0][3][6][9]を選ぶための計算です。つまり元の画像の縦方向の位置を選んでいます。これでキャラクタの向きを選びます。
なので、組み合わせると[0]~[11]を選ぶ事ができます。
でも、(ch.y%32)/8はまずいです。なぜなら4分割して0から3を計算してしまうからです。アニメのコマは3つですよね?
Re:初心者です。4方向にあるけません。
この (ch.y%32)/8 というのは、1区間32ピクセルの縦を8で割っている。
4分割しているということですよね。
4分割して0から3を計算してしまうというのはどういったことなのでしょうか?
丁寧に説明していただいているのに、分からないことが多くてすいませんTT
4分割しているということですよね。
4分割して0から3を計算してしまうというのはどういったことなのでしょうか?
丁寧に説明していただいているのに、分からないことが多くてすいませんTT
Re:初心者です。4方向にあるけません。
>4分割して0から3を計算してしまうというのはどういったことなのでしょうか?
ようは、縦移動のとき4コマのアニメコマがあるという計算式になっていると言う意味です。ch.yが変化するときは、4コマのアニメデータが必要となりますが、用意されている画像のデータは3コマアニメだと数が合いませんので、異常なコマが表示されてしまうこととなります。
上向きなら[0]→[1]→[2]→[0]と繰り返すのがお望みでしょうが、今の計算式のままだと[0]→[1]→[2]→[3]→[0]と繰り返す事になります。
ようは、縦移動のとき4コマのアニメコマがあるという計算式になっていると言う意味です。ch.yが変化するときは、4コマのアニメデータが必要となりますが、用意されている画像のデータは3コマアニメだと数が合いませんので、異常なコマが表示されてしまうこととなります。
上向きなら[0]→[1]→[2]→[0]と繰り返すのがお望みでしょうが、今の計算式のままだと[0]→[1]→[2]→[3]→[0]と繰り返す事になります。
Re:初心者です。4方向にあるけません。
縦の1区間(32ピクセル)も3分割するということでしょうか??
その場合は、32を10ずつわればよいでしょうか。
ch.y%32/10 ??;
あと、上にいくときは 9,10,11でした。
その場合は、32を10ずつわればよいでしょうか。
ch.y%32/10 ??;
あと、上にいくときは 9,10,11でした。
Re:初心者です。4方向にあるけません。
>縦の1区間(32ピクセル)も3分割するということでしょうか??
アニメコマが3コマなら3分割しないとダメです。
>その場合は、32を10ずつわればよいでしょうか。
>ch.y%32/10 ??;
10で割っても0から3になりますよね。なので、11で割る事になりますが、その場合[2]のコマだけが1フレーム他のコマより短く表示されますのでアニメが多少ぎこちなくなるはずです。
気になるかは、やってみないと分からないです。
気になるようなら、画像の縦サイズを3で割り切るサイズにするしか無いでしょう。
>あと、上にいくときは 9,10,11でした
では、mukiの値を画像に合わせて変えてください。
アニメコマが3コマなら3分割しないとダメです。
>その場合は、32を10ずつわればよいでしょうか。
>ch.y%32/10 ??;
10で割っても0から3になりますよね。なので、11で割る事になりますが、その場合[2]のコマだけが1フレーム他のコマより短く表示されますのでアニメが多少ぎこちなくなるはずです。
気になるかは、やってみないと分からないです。
気になるようなら、画像の縦サイズを3で割り切るサイズにするしか無いでしょう。
>あと、上にいくときは 9,10,11でした
では、mukiの値を画像に合わせて変えてください。
Re:初心者です。4方向にあるけません。
画像を変更して、横72 縦120 の横24ピクセル 縦30ピクセル にしてみました。
変更してからのプログラムです。
#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( "apollo.png" , 12 , 3 , 4 , 24 , 30 , 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=3; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=0; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=2; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==3) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==0) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==2) //右向きならch.x座標を増やす
ch.x++;
}
ch.img=image[(ch.x%24)/8 + (ch.y%30)/10 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
この用にしたのですが、
おかしなところはあるでしょうか??
変更してからのプログラムです。
#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( "apollo.png" , 12 , 3 , 4 , 24 , 30 , 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=3; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=0; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=2; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==3) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==0) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==2) //右向きならch.x座標を増やす
ch.x++;
}
ch.img=image[(ch.x%24)/8 + (ch.y%30)/10 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
この用にしたのですが、
おかしなところはあるでしょうか??
Re:初心者です。4方向にあるけません。
キャラクタの初期座標
ch.x =320;
ch.y =160;
がそれぞれ24と30で割り切れてませんので問題です。
それと最初のころに出た部分ですが、
if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
を直し忘れてませんか?
あとは大丈夫だと思いますが、まず自分で動かして試してみてくださいね。
ch.x =320;
ch.y =160;
がそれぞれ24と30で割り切れてませんので問題です。
それと最初のころに出た部分ですが、
if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
を直し忘れてませんか?
あとは大丈夫だと思いますが、まず自分で動かして試してみてくださいね。
Re:初心者です。4方向にあるけません。
#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 =240;
ch.y =150;
ch.walking_flag=0;
ch.muki=3;
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "apollo1.png" , 12 , 3 , 4 , 24 , 30 , image ) ;//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
if(ch.x%24==0 && ch.y%30==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=3; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=0; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=2; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==3) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==0) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==2) //右向きならch.x座標を増やす
ch.x++;
}
ch.img=image[(ch.x%24)/8 + (ch.y%32)/10 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
この用に直してみました。
が、実行したときに、キャラが画面にでていない(動かすとでてくる)のと、
やはり、うまくうごかない。という問題がでました。
最初にいる座標を帰る前、
if(ch.x%24==0 && ch.y%30==0){ //座標が32で割り切れたら入力可能
に変えてやってみると、画像がまったくでてこず、どうなっているのかさっぱりでした。
なにかおかしいことがあるのでしょうか??
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 =240;
ch.y =150;
ch.walking_flag=0;
ch.muki=3;
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "apollo1.png" , 12 , 3 , 4 , 24 , 30 , image ) ;//画像を分割してimage配列に保存
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
if(ch.x%24==0 && ch.y%30==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=3; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=0; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=2; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
}
if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==3) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==0) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==2) //右向きならch.x座標を増やす
ch.x++;
}
ch.img=image[(ch.x%24)/8 + (ch.y%32)/10 + ch.muki*4]; //画像をセット
DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
この用に直してみました。
が、実行したときに、キャラが画面にでていない(動かすとでてくる)のと、
やはり、うまくうごかない。という問題がでました。
最初にいる座標を帰る前、
if(ch.x%24==0 && ch.y%30==0){ //座標が32で割り切れたら入力可能
に変えてやってみると、画像がまったくでてこず、どうなっているのかさっぱりでした。
なにかおかしいことがあるのでしょうか??
Re:初心者です。4方向にあるけません。
>この用に直してみました。
>が、実行したときに、キャラが画面にでていない(動かすとでてくる)のと、
それを考えるのは、あなた自身に任せます。
これまで答えてしまうと、バグを取る能力が育ちませんのであえて答えを書きません。
>やはり、うまくうごかない。という問題がでました。
どう、うまく動かないでしょう?
ちゃんと分析して教えてください。
バグの状況を正確に整理できる事は、プログラミングの初歩的な技術です。
>最初にいる座標を帰る前、
>if(ch.x%24==0 && ch.y%30==0){ //座標が32で割り切れたら入力可能
>に変えてやってみると、画像がまったくでてこず、どうなっているのかさっぱりでした。
これは、20~21章に説明されてますよ。
一区間歩かせるってどう言うことかってかなり詳しく。
ともかく、変数の内容を表示する方法を教えますので、それを使って問題点を調べてみてください。
下記のようなコードを埋め込む事でVisualStudioの出力ウィンドウに変数の内容を表示することが出来ます。
>が、実行したときに、キャラが画面にでていない(動かすとでてくる)のと、
それを考えるのは、あなた自身に任せます。
これまで答えてしまうと、バグを取る能力が育ちませんのであえて答えを書きません。
>やはり、うまくうごかない。という問題がでました。
どう、うまく動かないでしょう?
ちゃんと分析して教えてください。
バグの状況を正確に整理できる事は、プログラミングの初歩的な技術です。
>最初にいる座標を帰る前、
>if(ch.x%24==0 && ch.y%30==0){ //座標が32で割り切れたら入力可能
>に変えてやってみると、画像がまったくでてこず、どうなっているのかさっぱりでした。
これは、20~21章に説明されてますよ。
一区間歩かせるってどう言うことかってかなり詳しく。
ともかく、変数の内容を表示する方法を教えますので、それを使って問題点を調べてみてください。
下記のようなコードを埋め込む事でVisualStudioの出力ウィンドウに変数の内容を表示することが出来ます。
{ TCHAR strbuf[256]; sprintf( strbuf, _T("ch.x=%d ch.y=%d\n"), ch.x, ch.y ); OutputDebugString( strbuf ); }何処を調べるべきなのか、それをまず考えてみてください。
Re:初心者です。4方向にあるけません。
>これまで答えてしまうと、バグを取る能力が育ちませんのであえて答えを書きません。
うーん・・・
もう回答例を掲載してもいいんじゃないですかね?^^;
ここで戦意喪失してしまい、
プロジェクト自体を諦めるのはとてももったいないことと思います。
サンプルプログラムからも得るものは多いかと思います。
うーん・・・
もう回答例を掲載してもいいんじゃないですかね?^^;
ここで戦意喪失してしまい、
プロジェクト自体を諦めるのはとてももったいないことと思います。
サンプルプログラムからも得るものは多いかと思います。
Re:初心者です。4方向にあるけません。
>もう回答例を掲載してもいいんじゃないですかね?^^;
>ここで戦意喪失してしまい、
たしかに、ここで戦意喪失は勿体無いですよね。
では、ヒント。
ch.img=image[(ch.x%24)/8 + (ch.y%32)/10 + ch.muki*4]; //画像をセット
のところ、どこか変じゃありません?
今までのやり取りを全部見直してみてください。
>ここで戦意喪失してしまい、
たしかに、ここで戦意喪失は勿体無いですよね。
では、ヒント。
ch.img=image[(ch.x%24)/8 + (ch.y%32)/10 + ch.muki*4]; //画像をセット
のところ、どこか変じゃありません?
今までのやり取りを全部見直してみてください。
Re:初心者です。4方向にあるけません。
うーん、ここの方針としては異なると思うんだけど、C言語の基礎を覚えてからじゃないと手を出すべきじゃないと考えちゃったりします。
intやdoubleなどの変数の定義の仕組、二次元配列、ヘッダーファイルの取り込み方、extern宣言、九つの制御文(gotoとかいらないけど)、分割コンパイル、構造体、関数の自作。
C言語の基礎としてどの本にも載っている内容だと思いますが、最低限上に挙げたものくらいはある程度理解する必要があると思います。2、300ページ程度の本を購入して勉強してみたらいかがでしょう。
(借りて勉強はおすすめしません。自分のお金を出すとなんだかやる気が出ます。私だけかもしれませんが……)
一日一時間ずつでもさぼらずにやれば2ヶ月ほどでマスターできるはずです。
マスターした後にここのプログラムを見てみると、おそらく世界が変わるんじゃないかと思います。
intやdoubleなどの変数の定義の仕組、二次元配列、ヘッダーファイルの取り込み方、extern宣言、九つの制御文(gotoとかいらないけど)、分割コンパイル、構造体、関数の自作。
C言語の基礎としてどの本にも載っている内容だと思いますが、最低限上に挙げたものくらいはある程度理解する必要があると思います。2、300ページ程度の本を購入して勉強してみたらいかがでしょう。
(借りて勉強はおすすめしません。自分のお金を出すとなんだかやる気が出ます。私だけかもしれませんが……)
一日一時間ずつでもさぼらずにやれば2ヶ月ほどでマスターできるはずです。
マスターした後にここのプログラムを見てみると、おそらく世界が変わるんじゃないかと思います。
Re:初心者です。4方向にあるけません。
C言語の基礎を覚えてからというと私も質問する権利が
ないようです。
私一ヶ月ほど悩んで思い切って質問したとき、MNSさんに
すぐ回答していただいて、今まで分からなかったことが一瞬で解決し
感激したことを覚えています。
質問するときどれだけ勇気がいるか、ベテランのひとには
分からないかもしれませんね。
ないようです。
私一ヶ月ほど悩んで思い切って質問したとき、MNSさんに
すぐ回答していただいて、今まで分からなかったことが一瞬で解決し
感激したことを覚えています。
質問するときどれだけ勇気がいるか、ベテランのひとには
分からないかもしれませんね。
Re:初心者です。4方向にあるけません。
修正したソースコードも用意してみました。
#defineを使ってますが大丈夫ですよね。
今までの説明を読み直してもらえば理解できると思います。
※ ごめんなさい、コンパイルチェックしていないのでエラーがあるかも知れません。
#defineを使ってますが大丈夫ですよね。
今までの説明を読み直してもらえば理解できると思います。
※ ごめんなさい、コンパイルチェックしていないのでエラーがあるかも知れません。
Re:初心者です。4方向にあるけません。
私としては原理・アルゴリズムを理解して欲しいと思ってやっております。
C言語の文法書を理解したところで、これは別の次元の問題ですので、なぜプログラムでこう書く必要があるのかを回りくどくても理解して欲しいと考えてます。
プログラムの一行一行、1つの数値にも深い意味があることが理解できるとプログラムの見方も変わると思うんですよ。
C言語の文法書を理解したところで、これは別の次元の問題ですので、なぜプログラムでこう書く必要があるのかを回りくどくても理解して欲しいと考えてます。
プログラムの一行一行、1つの数値にも深い意味があることが理解できるとプログラムの見方も変わると思うんですよ。
Re:初心者です。4方向にあるけません。
C言語の基礎を覚えてからというと私も質問する権利が
ないようです。
私一ヶ月ほど悩んで思い切って質問したとき、MNSさんに
すぐ回答していただいて、今まで分からなかったことが一瞬で解決し
感激したことを覚えています。
質問するときどれだけ勇気がいるか、ベテランのひとには
分からないかもしれませんね。
ないようです。
私一ヶ月ほど悩んで思い切って質問したとき、MNSさんに
すぐ回答していただいて、今まで分からなかったことが一瞬で解決し
感激したことを覚えています。
質問するときどれだけ勇気がいるか、ベテランのひとには
分からないかもしれませんね。
Re:初心者です。4方向にあるけません。
>>C言語の基礎を覚えてからというと私も質問する権利がないようです。
「C言語の基礎などを固めたあとに、ゲーム制作に入ったほうが良いでしょう」、
と言っているだけで、
「C言語をマスターしていなければ、質問する権利はありません」
という意味では無いと思います。
基礎が曖昧なままゲーム制作に取り組むと 頓挫する可能性がありますよ
という指摘でしょう。
「質問はするな」という旨の発言は見当たりません。
「C言語の基礎などを固めたあとに、ゲーム制作に入ったほうが良いでしょう」、
と言っているだけで、
「C言語をマスターしていなければ、質問する権利はありません」
という意味では無いと思います。
基礎が曖昧なままゲーム制作に取り組むと 頓挫する可能性がありますよ
という指摘でしょう。
「質問はするな」という旨の発言は見当たりません。
Re:初心者です。4方向にあるけません。
みなさんのいっているとうりでした。
本を 購入 して 勉強してみようと思います!
Q1 みなさんが(やプロのプログラマーさんたち)ゲームを作成するときは、
何もみずに、考えて書いていくのでしょうか。
本を見つつかいているのでしょうか。
Q2 贅沢かもしれませんが、どの本がオススメなどありますか??
いろいろ質問ばかりですいません。
本を 購入 して 勉強してみようと思います!
Q1 みなさんが(やプロのプログラマーさんたち)ゲームを作成するときは、
何もみずに、考えて書いていくのでしょうか。
本を見つつかいているのでしょうか。
Q2 贅沢かもしれませんが、どの本がオススメなどありますか??
いろいろ質問ばかりですいません。
Re:初心者です。4方向にあるけません。
ええと、あくまで一個人の意見です。
押し付けるつもりはありません。
意見なんてのは星の数ほどあります。
正しいと思えば実行すればいいし、正しくないと思えばやらなければいいんではないでしょうか。
(これもまた一個人の意見ということで……)
というより、書き込む資格を私が判断できるわけがないのです。
まあそれはともかく、いざプログラミングをしているときに、
・xxx.xxx;ってどこでも宣言してないのになんで変数として扱えるんだろう。
・cppファイルを分けてるのに何故同時にコンパイルされてるのか。
・いままでは<stdio.h>をつけてたのに何故"DxLib.h"なんだろう。
・なんでprintfがつかえないのか。
・DxLibで線を描写する術を覚えた。でも学校の授業中のプログラミングでは使えなかった。
などなどいろいろな疑問が出てくると思います。
ぶっちゃけた話コピペでもある程度できるので、知らなくても進めますけど、気持ち悪さが残るのでは。
まあここらへんはRさんがどう思ってるか次第ですが。
ともあれこんな他愛も無い疑問は、ある程度組める人なら誰でも答えられるのではないかと思います。
そこらへんの基礎本の前半100ページ以下程度に全部記されてるんじゃないでしょうか。
また、自分で独自の弾幕をいざ作ろうとしたときに制御文の使い方を知らずに作れるかと問われると
正直厳しいのではないだろうかと思います。がんばればできることはできるとおもいますが。
構造体についても同様です。変数を大量に用意するのも可能ですが、やはり構造体でやったほうが良いでしょう。
意味不明だったものが理解するというのは、これから多々起こるであろうエラーや警告の解決手段に
どうしても必要になるものだと思います。
長くなりましたが、あくまでこれは私個人の意見です。
違うと思えば無視してください、本当に。
議論することも可能ですが、そもそも正解の用意されていないので、あんまりしたくありません。
気に食わなければスルーしといてください><
まあ、アルゴリズムも大事ですよね。手続きで済ましているプログラムも見受けられるので。
手続きでも別にいいとは思いますけど……。
回答
Q1.プロではないのでなんともいえないですが、C言語には大量の関数があり、それ全部理解している人は僅かにしかいないと思います。なので複雑なプログラムは関数の解説書片手にやってる方が多いのではないでしょうか。
Q2.Rさんがどの程度C言語をできるかわからないのでなんともいえないです。
ただ、進められたものを買うより、実際に本屋に出向いて数時間いろんな本を立ち読みして自分にあった本を
探すのが良いと思います。ここで変な本を掴まされては出足があまりよろしくないです。
まあ相当書店側には迷惑でしょうが……。
ただ一つ覚えてほしいのは、自分の使用しているコンパイラで解説している本にしたほうがよいです。
VS2008をつかっているならそれを使っている解説書を。別に他のでもいいんですが、出足くじかれる可能性大です。
うーん、長くなってしまった。長文本当に申し訳ないです。
押し付けるつもりはありません。
意見なんてのは星の数ほどあります。
正しいと思えば実行すればいいし、正しくないと思えばやらなければいいんではないでしょうか。
(これもまた一個人の意見ということで……)
というより、書き込む資格を私が判断できるわけがないのです。
まあそれはともかく、いざプログラミングをしているときに、
・xxx.xxx;ってどこでも宣言してないのになんで変数として扱えるんだろう。
・cppファイルを分けてるのに何故同時にコンパイルされてるのか。
・いままでは<stdio.h>をつけてたのに何故"DxLib.h"なんだろう。
・なんでprintfがつかえないのか。
・DxLibで線を描写する術を覚えた。でも学校の授業中のプログラミングでは使えなかった。
などなどいろいろな疑問が出てくると思います。
ぶっちゃけた話コピペでもある程度できるので、知らなくても進めますけど、気持ち悪さが残るのでは。
まあここらへんはRさんがどう思ってるか次第ですが。
ともあれこんな他愛も無い疑問は、ある程度組める人なら誰でも答えられるのではないかと思います。
そこらへんの基礎本の前半100ページ以下程度に全部記されてるんじゃないでしょうか。
また、自分で独自の弾幕をいざ作ろうとしたときに制御文の使い方を知らずに作れるかと問われると
正直厳しいのではないだろうかと思います。がんばればできることはできるとおもいますが。
構造体についても同様です。変数を大量に用意するのも可能ですが、やはり構造体でやったほうが良いでしょう。
意味不明だったものが理解するというのは、これから多々起こるであろうエラーや警告の解決手段に
どうしても必要になるものだと思います。
長くなりましたが、あくまでこれは私個人の意見です。
違うと思えば無視してください、本当に。
議論することも可能ですが、そもそも正解の用意されていないので、あんまりしたくありません。
気に食わなければスルーしといてください><
まあ、アルゴリズムも大事ですよね。手続きで済ましているプログラムも見受けられるので。
手続きでも別にいいとは思いますけど……。
回答
Q1.プロではないのでなんともいえないですが、C言語には大量の関数があり、それ全部理解している人は僅かにしかいないと思います。なので複雑なプログラムは関数の解説書片手にやってる方が多いのではないでしょうか。
Q2.Rさんがどの程度C言語をできるかわからないのでなんともいえないです。
ただ、進められたものを買うより、実際に本屋に出向いて数時間いろんな本を立ち読みして自分にあった本を
探すのが良いと思います。ここで変な本を掴まされては出足があまりよろしくないです。
まあ相当書店側には迷惑でしょうが……。
ただ一つ覚えてほしいのは、自分の使用しているコンパイラで解説している本にしたほうがよいです。
VS2008をつかっているならそれを使っている解説書を。別に他のでもいいんですが、出足くじかれる可能性大です。
うーん、長くなってしまった。長文本当に申し訳ないです。
Re:初心者です。4方向にあるけません。
Q1 みなさんが(やプロのプログラマーさんたち)ゲームを作成するときは、何もみずに、考えて書いていくのでしょうか。本を見つつかいているのでしょうか。
・日ごろ作っているコードのサンプルがあるかと言う意味なら、ありません。自力で作り出しています。
サイトや本に、そのものズバリな答えが見つかる事はまずありません。
・あるいは特殊なアルゴリズムを使う場合は、先人の知恵であるアルゴリズム辞典を参考にします。
http://www.amazon.co.jp/dp/4874084141
・全ての関数を覚えているかと言う意味なら、覚えられませんので関数リファレンスは参照しますよ。
DXライブラリなら
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
とかですね。
Q2 贅沢かもしれませんが、どの本がオススメなどありますか??
本は相性とかがありますので、本屋で確かめてみる事をお勧めします。
とりあえず私はサイトを紹介します。
http://homepage3.nifty.com/mmgames/c_guide/
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
http://www.geocities.jp/ky_webid/c/index.html
で、C言語の文法を覚える事以外にプログラミングのコツというか考え方を身につける必要があります。
これは、演習問題を数をこなすとか、サンプルプログラムを色々いじってみるとか、実践的な作業の中で身に付けて行くしかありません。なので、ゲームプログラミングの館のコードを色々変更してみるのは悪い勉強方法ではありません。しかし、ただ闇雲に変更してもプログラムは動かなくなるだけです。
なので、1つの関数や1つの値の意味などをちゃんと理解する事を心がけてください。
有名なプログラミングの考え方の基礎が身についているか確認する練習問題にFizzBuzzの問題があります。
「1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。」
と言う問題なのですが、ちゃんと出来る力が付いていたら本やサイトを見ずに自力で2分程度でプログラムが書けるはずです。参考にしてください。
・日ごろ作っているコードのサンプルがあるかと言う意味なら、ありません。自力で作り出しています。
サイトや本に、そのものズバリな答えが見つかる事はまずありません。
・あるいは特殊なアルゴリズムを使う場合は、先人の知恵であるアルゴリズム辞典を参考にします。
http://www.amazon.co.jp/dp/4874084141
・全ての関数を覚えているかと言う意味なら、覚えられませんので関数リファレンスは参照しますよ。
DXライブラリなら
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
とかですね。
Q2 贅沢かもしれませんが、どの本がオススメなどありますか??
本は相性とかがありますので、本屋で確かめてみる事をお勧めします。
とりあえず私はサイトを紹介します。
http://homepage3.nifty.com/mmgames/c_guide/
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
http://www.geocities.jp/ky_webid/c/index.html
で、C言語の文法を覚える事以外にプログラミングのコツというか考え方を身につける必要があります。
これは、演習問題を数をこなすとか、サンプルプログラムを色々いじってみるとか、実践的な作業の中で身に付けて行くしかありません。なので、ゲームプログラミングの館のコードを色々変更してみるのは悪い勉強方法ではありません。しかし、ただ闇雲に変更してもプログラムは動かなくなるだけです。
なので、1つの関数や1つの値の意味などをちゃんと理解する事を心がけてください。
有名なプログラミングの考え方の基礎が身についているか確認する練習問題にFizzBuzzの問題があります。
「1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。」
と言う問題なのですが、ちゃんと出来る力が付いていたら本やサイトを見ずに自力で2分程度でプログラムが書けるはずです。参考にしてください。
Re:初心者です。4方向にあるけません。
親切に質問に答えてくれる方に意見するようで心苦しいのですが、
質問している方は”ゲームプログラミングの館の22章
キャラを4方向に歩かせる”を元に質問していると思われるので、
回答もそこのコードにできるだけ合わせたほうがいいのではないでしょうか。
softyaさんの添付されたコードではまた混乱してしまうと思います。
初心者の質問に対して、まる投げ禁止だからといって逆質問攻めにする
ケースが多く見られますが、私ならとっくにギブアップです。
といって他にいいサイトがあるわけでもないので、分からないときは
誰かが同じことを質問してくれるのを待っている状態です。
質問している方は”ゲームプログラミングの館の22章
キャラを4方向に歩かせる”を元に質問していると思われるので、
回答もそこのコードにできるだけ合わせたほうがいいのではないでしょうか。
softyaさんの添付されたコードではまた混乱してしまうと思います。
初心者の質問に対して、まる投げ禁止だからといって逆質問攻めにする
ケースが多く見られますが、私ならとっくにギブアップです。
といって他にいいサイトがあるわけでもないので、分からないときは
誰かが同じことを質問してくれるのを待っている状態です。
Re:初心者です。4方向にあるけません。
>softyaさんの添付されたコードではまた混乱してしまうと思います。
逆に分かり辛かったですか?
私としては、分かりやすくしたつもりだったんですよ。あと後々のバグの原因となる直接の数値を書く並べるのを避けるって目的もあります。
22章と書き方を同じにしてコメントを増やしてみましたがどうでしょうか?
キャラクタが24x30ドットでアニメパターンが3x4に変わっている&向きもオリジナルと違う時点で、数字だけ並べると余計分かり辛い気が私はするのですがどうでしょうか?
初心者の方の感想をお待ちしています。
逆に分かり辛かったですか?
私としては、分かりやすくしたつもりだったんですよ。あと後々のバグの原因となる直接の数値を書く並べるのを避けるって目的もあります。
22章と書き方を同じにしてコメントを増やしてみましたがどうでしょうか?
キャラクタが24x30ドットでアニメパターンが3x4に変わっている&向きもオリジナルと違う時点で、数字だけ並べると余計分かり辛い気が私はするのですがどうでしょうか?
初心者の方の感想をお待ちしています。
Re:初心者です。4方向にあるけません。
>初心者の質問に対して、まる投げ禁止だからといって逆質問攻めにする
>ケースが多く見られますが、
自分もいろいろ質問掲示板(回答は別として)を見ていますが、
回答コードを貼り付けのみ、
解説・コメント一切なし、批判コメ、レスなしなどもあります。
その中で、親身になって回答してもらえることは、
百利あって一害なしです。
回答側も質問攻めにする=悪意を持っている
わけではないと思うのです。
恐らく、欠落している情報を回答側が得たいのだと思います。
悪意を持っている人は恐らく相手にしません。
もしくは批評コメをしてくるかもしれません。
その中で、「~~を勉強してきたほうがいい」
といわれたら、そのとおりにすることがベストです。
それが問題解決の一番の近道でしょうから^^;
「ある程度下調べをし」、
分からないことや、もっとよりよい方法などを知りたい場合は、
全然質問していいと思いますよ。
自分は、質問ばっかしすぎで「ハッカー」の称号まで上り詰めてますので^^;
まぁ、確かに今回は、質問内容が
「これから変えるにはどうすればよいでしょうか。 」
なので、その書き方のみをビシっと書くだけで済んだかも知れませんが、
このスレでRさんは得たものがあると思いますよ^^
>ケースが多く見られますが、
自分もいろいろ質問掲示板(回答は別として)を見ていますが、
回答コードを貼り付けのみ、
解説・コメント一切なし、批判コメ、レスなしなどもあります。
その中で、親身になって回答してもらえることは、
百利あって一害なしです。
回答側も質問攻めにする=悪意を持っている
わけではないと思うのです。
恐らく、欠落している情報を回答側が得たいのだと思います。
悪意を持っている人は恐らく相手にしません。
もしくは批評コメをしてくるかもしれません。
その中で、「~~を勉強してきたほうがいい」
といわれたら、そのとおりにすることがベストです。
それが問題解決の一番の近道でしょうから^^;
「ある程度下調べをし」、
分からないことや、もっとよりよい方法などを知りたい場合は、
全然質問していいと思いますよ。
自分は、質問ばっかしすぎで「ハッカー」の称号まで上り詰めてますので^^;
まぁ、確かに今回は、質問内容が
「これから変えるにはどうすればよいでしょうか。 」
なので、その書き方のみをビシっと書くだけで済んだかも知れませんが、
このスレでRさんは得たものがあると思いますよ^^
Re:初心者です。4方向にあるけません。
>初心者の質問に対して、まる投げ禁止だからといって逆質問攻めにする
>ケースが多く見られますが、
逆質問される方に非はないんでしょうか?
ソースも無しに漠然と質問したり、「うまくいかない」「うごかない」等曖昧な表現に対して予想して答える事を「エスパーレス」って言います。
十分な情報を出してくれれば適格に答えを出せます。それをしないから逆質問されます。
すずめさんの言う逆質問攻めってのがどういう質問に対してどうされた事なのかは分かりませんが
ちゃんと情報出してくれれば親切丁寧に答えてくれるのがこの掲示板だと思います。
質問に勇気が要るというなら回答にだって間違えてはいけないというプレッシャーから勇気要りますよ。
むしろ丸投げ質問にも放置は無いこの掲示板は相当質問しやすい環境だと思いますが・・・
>ケースが多く見られますが、
逆質問される方に非はないんでしょうか?
ソースも無しに漠然と質問したり、「うまくいかない」「うごかない」等曖昧な表現に対して予想して答える事を「エスパーレス」って言います。
十分な情報を出してくれれば適格に答えを出せます。それをしないから逆質問されます。
すずめさんの言う逆質問攻めってのがどういう質問に対してどうされた事なのかは分かりませんが
ちゃんと情報出してくれれば親切丁寧に答えてくれるのがこの掲示板だと思います。
質問に勇気が要るというなら回答にだって間違えてはいけないというプレッシャーから勇気要りますよ。
むしろ丸投げ質問にも放置は無いこの掲示板は相当質問しやすい環境だと思いますが・・・
Re:初心者です。4方向にあるけません。
まぁ、求めるものの違いでもあるのでしょうね。
その質問を解決したいという気持ちはもちろんわかります。
それに対し、答えを貼り付けるのは簡単なことです。(もちろん難しい質問は別ですが)
そこで一つ聞きたいのは、質問者はその質問の回答がほしいのか、それともアルゴリズムを構築する力ほしいのか、どちらかということです。
私としては、基礎が欠落していると判断したのでそちらをやったらおそらく世界が変わるのではないかと思ったためそういう回答をしたまでです。
また、softyaさんの逆質問はあくまで、順序良く説明するためにやったことだと思います。その時点で腰をすえて質問の回答をしてあげようという意思の現われです。感謝してしかるべき出はないでしょうか。
そしてその逆質問がわからなければわからないという旨の発言(もちろんどのように考えた結果わからなかったと記す必要があります)をすると、どの程度のプログラミング力があるかある程度知ることが可能です。
その質問を解決したいという気持ちはもちろんわかります。
それに対し、答えを貼り付けるのは簡単なことです。(もちろん難しい質問は別ですが)
そこで一つ聞きたいのは、質問者はその質問の回答がほしいのか、それともアルゴリズムを構築する力ほしいのか、どちらかということです。
私としては、基礎が欠落していると判断したのでそちらをやったらおそらく世界が変わるのではないかと思ったためそういう回答をしたまでです。
また、softyaさんの逆質問はあくまで、順序良く説明するためにやったことだと思います。その時点で腰をすえて質問の回答をしてあげようという意思の現われです。感謝してしかるべき出はないでしょうか。
そしてその逆質問がわからなければわからないという旨の発言(もちろんどのように考えた結果わからなかったと記す必要があります)をすると、どの程度のプログラミング力があるかある程度知ることが可能です。
Re:初心者です。4方向にあるけません。
たいへんお騒がせしました。
私が気になったのは、Rさんが問題が解決して
解決ボタンを押したかどうかです。
まあ、質問者のことを心配して投稿したんですが、
自分の方が大変なことになってしまったようです。
弁解するようですが、逆質問を否定したわけではありません。
いつになったら回答にたどり着けるのかなって思ったからです。
いずれにしてもたいへんお騒がせしました。
私が気になったのは、Rさんが問題が解決して
解決ボタンを押したかどうかです。
まあ、質問者のことを心配して投稿したんですが、
自分の方が大変なことになってしまったようです。
弁解するようですが、逆質問を否定したわけではありません。
いつになったら回答にたどり着けるのかなって思ったからです。
いずれにしてもたいへんお騒がせしました。
Re:初心者です。4方向にあるけません。
>画像は、
>横24ピクセル 縦32ピクセル で
>横は3分割 縦 4分割です。
ツクール200X向けの素材ですね。
もしRさんがツクール200X製ゲームのようにキャラを歩かせたいと思っているのだとしたら、ツクール200Xの素材規格やツクール200X製のゲームの仕様も理解した方がいいよ。
残念ながらゲームプログラミングの館も回答者の方々も、ツクール200Xの仕様にのっとった解説はしてくれていません。
Rさんまだ見てるのかな・・・、もう手遅れ?
>横24ピクセル 縦32ピクセル で
>横は3分割 縦 4分割です。
ツクール200X向けの素材ですね。
もしRさんがツクール200X製ゲームのようにキャラを歩かせたいと思っているのだとしたら、ツクール200Xの素材規格やツクール200X製のゲームの仕様も理解した方がいいよ。
残念ながらゲームプログラミングの館も回答者の方々も、ツクール200Xの仕様にのっとった解説はしてくれていません。
Rさんまだ見てるのかな・・・、もう手遅れ?