ゲームプログラムミングの館24章について

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

ゲームプログラムミングの館24章について

#1

投稿記事 by たろう » 15年前

ゲームプログラミングの館の24章やっているのですが、
これを、移動を自動的に%32==0毎にするのではなく、移動距離を手動的に移動したいのですが、
どうすればよいでしょうか?
コード書いてみたのですが、
真ん中のL字のところがちゃんと通ってくれないのです。
外れたところでとまっていしまうのです。
ソースはこれです。
環境はVC++2005です。
よろしくお願いします。

たろう

Re:ゲームプログラムミングの館24章について

#2

投稿記事 by たろう » 15年前

わけがわからないところで止まったり進んだり(手動的に)してしまいます。
ch.x%32==0 && ch.y%32==0毎にではなく、自分で好きなところに移動して(例えばch.x++;xh,y++;などして移動)やるにはどうしたらよいでしょうか?

wing

Re:ゲームプログラムミングの館24章について

#3

投稿記事 by wing » 15年前

説明するのが下手ですので、サンプルを作ってみました。
自分のと比べてみてください。

たろう

Re:ゲームプログラムミングの館24章について

#4

投稿記事 by たろう » 15年前

回答とサンプルありがとうございます。
アップしたコードだとちゃんと通るのですが、
通路を変えてみたら、通らないところがありました。
int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0<==ここ,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,1,1,1,1,1,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};と言う風にやったらここのところが通りませんでした。

通るにはどうしたらよいでしょうか?

wing

Re:ゲームプログラムミングの館24章について

#5

投稿記事 by wing » 15年前

いま当たり判定は
if(GetChipParam(ch.x-16.0f+ch.vx, ch.y-16.0f) == 1 ||
        GetChipParam(ch.x-16.0f+ch.vx, ch.y+16.0f) == 1){
            ch.vx = 0.0f;
    }
        
    // 右向き
    if(GetChipParam(ch.x+16.0f+ch.vx, ch.y-16.0f)==1 ||
        GetChipParam(ch.x+16.0f+ch.vx, ch.y+16.0f)==1){
        ch.vx = 0.0f;
    }

    // 上向き
    if(GetChipParam(ch.x-16.0f, ch.y-16.0f+ch.vy) == 1 ||
        GetChipParam(ch.x+16.0f, ch.y-16.0f+ch.vy) == 1){
            ch.vy = 0.0f;
    }
    // 下向き
    if(GetChipParam(ch.x-16.0f, ch.y+16.0f+ch.vy) == 1 ||
        GetChipParam(ch.x+16.0f, ch.y+16.0f+ch.vy) == 1){
            ch.vy = 0.0f;
    }
となっています。
ch.x-16.0fとかch.y-16.0fとかをすべてch.x-14.0fやch.y-14.0fとかにすれば
通れるようになります。

つまり、今の判定は、32の隙間に32では通らないので
少し判定を狭くして32の隙間を28のキャラなら通れるというわけです。

たろう

Re:ゲームプログラムミングの館24章について

#6

投稿記事 by たろう » 15年前

回答ありがとうございます。
できたのですが、少し埋め込んだ感じになってしまうのですが、これは仕方がないのでしょうか?

wing

Re:ゲームプログラムミングの館24章について

#7

投稿記事 by wing » 15年前

当たり判定の微調整はしなければいけません。
実際に動かしてみて、一番良いところを見つけます。

上の回答は考え方を示したもので、適当な値を使いました。

私の作った superMariko2 では、キャラの画像は32x32ですが、
高さ28、幅22で当たり判定をしています。

superMariko2 は、まだアップしたままですので、ソースも
いっしょにアップしてあるので、よければ参考にしてください。

たろう

Re:ゲームプログラムミングの館24章について

#8

投稿記事 by たろう » 15年前

そうですか。
superMariko2のソース拝見させていただきます。
ありがとうございました。

閉鎖

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