ページ 11

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

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

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

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

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

Posted: 2010年6月08日(火) 07:51
by wing
説明するのが下手ですので、サンプルを作ってみました。
自分のと比べてみてください。

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

Posted: 2010年6月08日(火) 17:53
by たろう
回答とサンプルありがとうございます。
アップしたコードだとちゃんと通るのですが、
通路を変えてみたら、通らないところがありました。
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 },
};と言う風にやったらここのところが通りませんでした。

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

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

Posted: 2010年6月08日(火) 18:48
by wing
いま当たり判定は
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章について

Posted: 2010年6月08日(火) 19:41
by たろう
回答ありがとうございます。
できたのですが、少し埋め込んだ感じになってしまうのですが、これは仕方がないのでしょうか?

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

Posted: 2010年6月08日(火) 19:59
by wing
当たり判定の微調整はしなければいけません。
実際に動かしてみて、一番良いところを見つけます。

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

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

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

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

Posted: 2010年6月08日(火) 20:02
by たろう
そうですか。
superMariko2のソース拝見させていただきます。
ありがとうございました。