ページ 11

ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月28日(木) 20:37
by PG初心者
ダンジョン風ゲームのキャラクターの移動用のプログラムを作っております。
シレンやチョコボ等の増すごとの移動とは違い
自由に移動できるタイプを考えております。(聖剣伝説?みたいなかんじです)

シレン等の移動方法は一度作ったことがあるので
出来るのですが自由に移動できるとなると判定の仕方がよくわかりません。

現在、下記の様なソースなのですが移動が挙動な動きをしてしまいます・・・。
どこをどのように修正すれば良いか教えては頂けないでしょうか?

※大変申し訳ないのですがソースを一部抜粋しております。
わかりにくい関数がありましたら教えて頂けますと助かります。
//////////////////////////////////////////////////
初期化
//////////////////////////////////////////////////

typedef struct{
    float Px,Py,Mx,My;
    int Cx,Cy;
    float Speed;
}CHR;

CHR Play;

int H_char;
int H_box;

extern KEY Key[256];

int Map[15][20] = {
    {1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1},
    {1,0,0,0,0, 0,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}
};

//////////////////////////////////////////////////
ループ
//////////////////////////////////////////////////
    Play.Mx = 0;
    Play.My = 0;

    Play.Cx = int(Play.Px/32);
    Play.Cy = int(Play.Py/32);

    if(Key[KEY_INPUT_RIGHT].Key) Play.Mx = Play.Speed ;
    if(Key[KEY_INPUT_LEFT].Key) Play.Mx = -Play.Speed ;
    if(Key[KEY_INPUT_UP].Key) Play.My = -Play.Speed ;
    if(Key[KEY_INPUT_DOWN].Key) Play.My = Play.Speed ;

    Play.Px += Play.Mx;
    Play.Py += Play.My;

    if(Play.Mx < 0){
        if(Map[Play.Cy][Play.Cx] == 1) Play.Px = (float)Play.Cx * 32 + 32;
        if(Map[Play.Cy][Play.Cx] == 1) Play.Py = (float)Play.Cy * 32 + 32;
    }else{
        if(Map[Play.Cy][Play.Cx] == 1) Play.Px = (float)Play.Cx * 32 - 32;
        if(Map[Play.Cy][Play.Cx] == 1) Play.Py = (float)Play.Cy * 32 - 32;    
    }

//////////////////////////////////////////////////
描画
//////////////////////////////////////////////////
    for(int i=0; i<15; i++){
        for(int j=0; j<20; j++){
            if(Map[j] == 1) DrawGraph( j*32, i*32 , H_box , true ) ;
        }    
    }
    DrawGraph( (int)Play.Px, (int)Play.Py , H_char , true ) ;

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月28日(木) 20:48
by MNS
>現在、下記の様なソースなのですが移動が挙動な動きをしてしまいます・・・。
挙動がおかしいということでしょうか?
いずれにせよ、もう少し質問内容を具体的にして頂けると助かります。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月28日(木) 20:51
by PG初心者
>>MNS様
ご回答ありがとう御座います。

挙動がおかしいです。
ブロックがあったら移動出来ないようにしたいのに
ブロックの向こう側に飛んでしまったりしてしまいます。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月28日(木) 21:13
by MNS
それなら、当たり判定の部分のコードを提示していただけませんか?

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月28日(木) 21:38
by PG初心者
>>MNS様
回答ありがとう御座います。
ループに書いてある
if(Play.Mx < 0){
        if(Map[Play.Cy][Play.Cx] == 1) Play.Px = (float)Play.Cx * 32 + 32;
        if(Map[Play.Cy][Play.Cx] == 1) Play.Py = (float)Play.Cy * 32 + 32;
    }else{
        if(Map[Play.Cy][Play.Cx] == 1) Play.Px = (float)Play.Cx * 32 - 32;
        if(Map[Play.Cy][Play.Cx] == 1) Play.Py = (float)Play.Cy * 32 - 32;    
    }
でチェックを行っております。
プレイヤーがいるセルを求めて位置戻しております。
たぶん、セルの取得がいけないのかと思うのですが
修正案が思い浮かびません・・・。

ブロックとの当たり判定をするとしたら
どのように行うのでしょうか?
※あたり判定については理解しております。
関数にすると以下のような感じですよね?
//==============================================================================================
//  ヒットチェック 中心点 P~は現在位置 S~は画像サイズ
//==============================================================================================

bool HitCheck(float Px1, float Py1, int Sx1, int Sy1, float Px2, float Py2, int Sx2, int Sy2){

    if(Px1-Sx1/2 < Px2+Sx2/2 && Px1+Sx1/2 > Px2-Sx2/2 &&
        Py1-Sy1/2 < Py2+Sy2/2 && Py1+Sy1/2 > Py2-Sy2/2){
        return true;    
    }else{
        return false;
    }
}

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月28日(木) 23:33
by MNS
なるほど、そこが当たり判定の部分でしたか。失礼しました。

このコードは、自分がいる位置を調べて、そこが障害物であれば、
動いた方向と逆の方向に位置を動かす、ということを行おうとしているのでしょうか?

全く検討違いである可能性もありますが、

Play.Cx = int(Play.Px/32);
Play.Cy = int(Play.Py/32);

if(Key[KEY_INPUT_RIGHT].Key) Play.Mx = Play.Speed ;
if(Key[KEY_INPUT_LEFT].Key) Play.Mx = -Play.Speed ;
if(Key[KEY_INPUT_UP].Key) Play.My = -Play.Speed ;
if(Key[KEY_INPUT_DOWN].Key) Play.My = Play.Speed ;

Play.Px += Play.Mx;
Play.Py += Play.My;

今、こういう順番で処理が並んでいますが、

if(Key[KEY_INPUT_RIGHT].Key) Play.Mx = Play.Speed ;
if(Key[KEY_INPUT_LEFT].Key) Play.Mx = -Play.Speed ;
if(Key[KEY_INPUT_UP].Key) Play.My = -Play.Speed ;
if(Key[KEY_INPUT_DOWN].Key) Play.My = Play.Speed ;

Play.Px += Play.Mx;
Play.Py += Play.My;

Play.Cx = int(Play.Px/32);
Play.Cy = int(Play.Py/32);

こうするとどうでしょうか?
これだけではおそらく問題は解決しませんが、
結果がどうなったかを調べていただけると、解決の緒がつかめるかもしれません。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月29日(金) 01:03
by PG初心者
ご回答ありがとうございます。
変更したところ前までは判定されるのですが
やはりうまくいきません。
※急激に場所が変わったりする。

もしかしたらなのですがセルでのやり取りがダメなのでかもしれません。
またあたり判定時の処理を下記に変更してみました。
if(Map[Play.Cy][Play.Cx] == 1){
        if(Play.Mx < 0) Play.Px = Play.Cx*32+32;
        else if(Play.Mx > 0) Play.Px = Play.Cx*32-32;
        if(Play.My < 0) Play.Py = Play.Cy*32+32;
        else if(Play.My > 0) Play.Py = Play.Cy*32-32;
    }
皆様のお忙しい中申し訳ないのですが
ご回答いただけないでしょうか?

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月29日(金) 10:43
by softya
一番簡単なのは、移動前に座標を保存しておいて当たり判定で衝突したら保存しておいた座標に戻すって方法があります。お試し下さい。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月30日(土) 02:59
by PG初心者
>>softya 様
ご回答ありがとう御座います。
前よりだいぶ改善されました。
当たってるという判定は出来たのかと思います・・・。

但し、現在のPGだと一度めり込んでキーを放すとパッと戻ってしまい
かなり気になります・・・。

私のミスかと思うのですが
どのように直せばよいか教えては頂けないでしょうか・・・。
処理
    
    HitF = false;
    Play.Mx = 0;
    Play.My = 0;

    if(Key[KEY_INPUT_RIGHT].Key) Play.Mx = Play.Speed ;
    if(Key[KEY_INPUT_LEFT].Key) Play.Mx = -Play.Speed ;
    if(Key[KEY_INPUT_UP].Key) Play.My = -Play.Speed ;
    if(Key[KEY_INPUT_DOWN].Key) Play.My = Play.Speed ;
    
    //  マップの表示
    for(int i=0; i<15; i++){
        for(int j=0; j<20; j++){
            if(Map[j] == 1){
                if(Play.Px-16 < j*32+16 && Play.Px+16 > j*32-16 &&
                    Play.Py-16 < i*32+16 && Play.Py+16 > i*32-16){
                        Play.Px = Play.Ox;
                        Play.Py = Play.Oy;
                        HitF = true;
                }
            }
        }    
    }

    Play.Ox = Play.Px;
    Play.Oy = Play.Py;

    Play.Px += Play.Mx;
    Play.Py += Play.My;

    Play.Cx = int(Play.Px/32);
    Play.Cy = int(Play.Py/32);

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月30日(土) 10:29
by SooA
あなたが道を歩くとき、目前に川があったらどう対処しますか?

落ちるまで進み、落ちてから通れないと判断しますか?
普通は川があるから通れないと認識して落ちる事を回避しますよね?

キャラクターも同じです。
移動する前に移動先を計算して当たり判定を行い、
通れないならキャラを動かさない、通れるなら移動させる。
といったプログラムにしてみましょう。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月30日(土) 11:29
by softya
処理の順番の問題ですね。
移動→表示→あたり判定(行けなかったら元の座標に戻す)
だと移動した後の座標で表示されてしまいます。
移動→あたり判定(行けなかったら元の座標に戻す)→表示
としてください。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月30日(土) 12:46
by PG初心者
皆様回答ありがとうございます。
処理の順番を変えたら元の位置に戻るようなことがなくなりました。

現在、私が作ったソースです。
但し問題点が2点ございます。

1点目
当たり判定をしている為、当たった際に隙間ができてしまう。

2点目
当たり判定がある時にキーを押してもキャラが動かない。
例えば右キーを押しっぱにして壁に当たった場合上下キーが利かなくなってしまう・・・。

私のソースが問題なのですがどこを改善すればよいのかがわかりません・・・。
ご指摘いただけないでしょうか?

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月30日(土) 13:25
by softya
とりあえずアルゴリズムをじっくりと考えてみましょう。
根本的な考え方を理解していないと少し問題がある度に行き詰まってしまいますからね。

>当たり判定をしている為、当たった際に隙間ができてしまう。

良く使われるアルゴリズムは、当たった際に当たったブロックの隣の座標を強制的に与えてしまう方法です。
ただ、これを使うには今の前の座標を保存する方式は使えませんの別案を考えてみましょう。

もうひとつの方法は時間と移動量の関係を見直すことです。
たとえば60FPSだとすると1/60秒でspeed分のピクセルを移動するわけですが、これが1/120秒だったらどうでしょうか? 1/2speedピクセルしか移動しないのでブロックとの隙間は1/2speed分になりますよね。
じゃあ、もっと考えを進めて1/(60*speed)秒だったら1pixelづつ移動するので隙間は開かないことになります。
ただ、1/(60*speed)秒だと描画をすることが出来ませんので表示は1/60秒で移動は1/(60*speed)秒にすることは出来ないでしょうか?考えてみて下さい。
ただし、1/(60*speed)秒と言っても実際にそうする必要はなくて1/60秒の間にspeed回数分処理すれば良いだけですよ。

>当たり判定がある時にキーを押してもキャラが動かない。
>例えば右キーを押しっぱにして壁に当たった場合上下キーが利かなくなってしまう・・・。

これは、移動キーを無かったことにしてみると実現出来ます。
x,yのキーで移動出来なかったら、xだけの方向に移動してみるんです。yも同様ですね。
分かりますかね?

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月30日(土) 15:04
by PG初心者
回答ありがとうございます。

>>良く使われるアルゴリズムは、当たった際に当たったブロックの隣の座標を強制的に与えてしまう方法です。

こちらも作ったのですが左で当たっている時、
上を押すと変な位置に飛ばされてしまったので
諦めてしまいました・・・。

>>これは、移動キーを無かったことにしてみると実現出来ます。
>>x,yのキーで移動出来なかったら、xだけの方向に移動してみるんです。yも同様ですね。
>>分かりますかね?

すみません・・・。
お手数おかけいたしますが
添付したソースに手を加えてはいただけないでしょうか?
丸投げしているのは分かっているのですが
自分では解けそうにありません・・・。

本当にお願いいたします。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月30日(土) 16:33
by softya
まぁ、そう言わずに紙にでも書いてアルゴリズムを検討してみて下さい。
ゲームを作る過程で半日悩むなんてよくあることです。
よーく考えて、それでも分からなければ具体的にどの部分が分からないか聞いてください。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月30日(土) 22:24
by PG初心者
ご回答ありがとうございます。

解らないというより現在のバグをどう取り除けばいいかが考えらません…

色々と自分なりに考えて見て処理を書いてみたのですが一番最新に貼らせて頂いたソース以上の結果が望めません。

お願いします…。助けて下さい。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月31日(日) 00:32
by softya
1つ目のヒント。
No:47375のソースでLoop()関数の中でSpeed単位で移動しているのを1づつ移動するようにしてください。
その上で、Loop()関数をSpeed回数分ループする様にします。

2つ目は、これが出来てからです。 画像

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月31日(日) 13:45
by PG初心者
こういうことでしょうか?

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月31日(日) 13:58
by PG初心者
連レスに手失礼いたします。
softya様がおっしゃいたいことはわかえいます・・・。
移動スピードは1×Loop回数だが判定は1でしているということですよね
ただしLOOPをspeed(例えば10)回数分回すとかなり処理が重くなりませんか?

もしくわspeedの値を画面サイズの
公約数(32×32なら4など)にするのとかも考えたのですが
もう少し効率の良い方法はないでしょうか・・・?
for(int i=0; i<15; i++){
        for(int j=0; j<20; j++){
            if(Map[j] == 1){                
                if(Play.Px-16 < j*32+16 && Play.Px+16 > j*32-16 &&
                    Play.Py-16 < i*32+16 && Play.Py+16 > i*32-16){
                        Play.Px = Play.Ox;
                        Play.Py = Play.Oy;
                        HitF = true;
                }
            }
        }    
    }

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月31日(日) 15:42
by softya
>softya様がおっしゃいたいことはわかえいます・・・。
>移動スピードは1×Loop回数だが判定は1でしているということですよね

コード見ましたが間違ってますよ。
移動ベクトルが1になっていませんので、speed速度×speed回で移動してます。


>ただしLOOPをspeed(例えば10)回数分回すとかなり処理が重くなりませんか?

分かりやすく処理しているので多少は我慢して下さい。
数学的、アルゴリズム的な知識レベルが上がれば方法は色々ありますが、まず基本的なところが分かっていないと応用は効きません。

>もう少し効率の良い方法はないでしょうか・・・?
実は全ブロックあたり判定する必要はありません。
キャラクタのいるブロックが分かっているなら、キャラを中心に3x3のブロックとだけあたり判定すれば良いのです。
キャラクタのいるブロックの位置の式はこれですよね?
Play.Cx = int(Play.Px/32);
Play.Cy = int(Play.Py/32);
このforループを考え直してみて下さい。
for(int i=0; i<15; i++){
for(int j=0; j<20; j++){

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月31日(日) 20:48
by PG初心者
softya様
何度も何度も回答ありがとうございます><
本当に助かります。

現在、当たり判定を周囲8マスと自分のいる位置でしてみました。
また移動ベクトルを1にするということは
添付しましたソースのようにするということでしょうか?
これをspeed回数分ということでしょうか?

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月31日(日) 21:18
by softya
ちゃんと斜め方向のベクトルもちゃんと処理してますね。
後で言おうと思っていたのですが、感心しました。

>現在、当たり判定を周囲8マスと自分のいる位置でしてみました。

あたり判定前の処理で、
if(Cx < 0) Cx = 0;
if(Cy < 0) Cy = 0;
ですが、補正するんじゃなくてマップ外なら無条件に障害物とみなしてください。
ちなみに、マイナス方向だけ処理してますがCx>=20やCy>=15もマップ外ですよ。

>これをspeed回数分ということでしょうか?

このソースだとベクトルはspeed分ですからベクトルを1にしてspeed回数分ですね。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年1月31日(日) 23:28
by PG初心者
>>softya様
なるほど・・・仰ってる意味がわかりました><
多分こういうことですよね?

ただまた2点ほど問題点が御座いまして

1点目
一度でも斜め移動すると当たり判定時に描画のピクセルがずれる。

理由はわかります・・・。
斜め時には1より小さい値が入ってしまうの描画の際に切り捨てられてしまう。
これをceil関数などで防いでみたのですが
処理をする瞬間に強制的にXY座標とも切り上げられるので
違和感が御座います。

2点目
当たり判定がある時にキーを押してもキャラが動かない。
例えば右に壁があり右キーを押しっぱにすると
上下キーが利かなくなってしまう・・・。

本当に申し訳ございません><

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 11:03
by softya
いいですね。大分と出来てきました。

>1点目
SetDrawMode( DX_DRAWMODE_BILINEAR );
として表示に、DrawGraphFを使って下さい。
これで座標が少数でもキレイに表示されるはずです。

>2点目
あたり判定を3回に増やすことで解決します。
1.XYのベクトル反映したあたり判定。当たったら2へ。
2.Xのベクトルだけを反映したあたり判定。当たったら3へ。
3.Yのベクトルだけを反映したあたり判定。
この場合壁のあたり判定だけを関数化すると組みやすくなります。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 16:49
by PG初心者
回答ありがとうございます。

すみません・・・。2点目の関数化するという
意味がわからなかったのでベタで書いております。

これだけは私ではわかりそうにありません・・・。
下記の等を試してみたのですが思い通りの結果が得られませんでした。
どうかここだけはサンプルを頂けないでしょうか・・・。
お願いいたします。
//  マップ
        for(int i=0; i<3; i++){
            for(int j=0; j<3; j++){
                int Cx = Play.Cx - 1 + j;
                int Cy = Play.Cy - 1 + i; 
                if(Cx < 0 && Cx > 20){
                    Play.Px = Play.Ox;
                }
                if(Cy < 0 && Cy > 15){
                    Play.Py = Play.Oy;
                }
                if(Map[Cy][Cx] == 1){
                    int sx = CEL_W/2;
                    int sy = CEL_H/2;
                    if(Play.Px-sx+8 < Cx*CEL_W+sx && Play.Px+sx-8 > Cx*CEL_W-sx &&
                        Play.Py-sy < Cy*CEL_H+sy && Play.Py+sy > Cy*CEL_H-sy){
                            if(Play.Px-sx+8 < Cx*CEL_W+sx && Play.Px+sx-8 > Cx*CEL_W-sx){
                                if(Play.Py-sy < Cy*CEL_H+sy && Play.Py+sy > Cy*CEL_H-sy){
                                    Play.Px = Play.Ox;
                                    Play.Py = Play.Oy;
                                }else{
                                    Play.Px = Play.Ox;
                                }
                            }else{
                                Play.Py = Play.Oy;
                            }
                        //    Play.Px = Play.Ox;
                        //    Play.Py = Play.Oy;
                            HitF = true;
                    }
                }    
            }
        }

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 18:02
by softya
申し訳ない組みづらかったので、コードを大分変えてしまいました。
予定とも仕様が違います。
衝突したら、右45度と左45度の方向に移動出来るか試すコードになってます。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 19:15
by PG初心者
softya 様

お忙しい中、ありがとうございます。
実は画像サイズを変えまして上手く動作してくれません・・・。
当たり判定が発生すると移動が止まってしまいます。

ブロックのサイズが48×48
キャラのサイズが32×48 です。
何度も迷惑をお掛けして申し訳ないのですが
ご確認いただけないでしょうか・・・。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 22:14
by softya
1)そもそも元の画像サイズでうまく動いているんでしょうか?
私の作ったコードも動作確認してませんので、バグっている可能性があります。
2)私の作ったコードを理解されていますか?
まず、ここから始めて下さい。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 22:24
by PG初心者
実は元のでも動いておりません・・・。
当たると止まってしまいます。

コードについては理解しているつもりです。
その理解のもとで何点か変更しました・・・。

それでも動きません><

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 22:58
by softya
どうダメなのか分析してみて下さい。
コードが理解出来るなら問題点も調べられるはずです。
printfDxなどで調べてみて下さい。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 23:21
by PG初心者
softya様
原因はわかっております。
1度でも当たってしまうとmoveokが1になりません・・・。
移動量は入っているのでこれが原因です。
ただし私が見てもこのソースであっている気がします・・・。

何故動かないかがわかりません・・・。
これで動くと思うのですが・・・。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 23:30
by softya
int moveok;
moveok = 0;
と分けてみて下さい。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 23:34
by PG初心者
すみません・・・。
多分直りました。
これから深くテストをしてみます。
原因は前の位置に戻す処理をしていない為
当たり判定がずっと起こってしまうからだと思います。
//    移動あり?
    
    if( rot != -1 ) {
    
        //    スピード回数分
        for(int speed=0; speed<Play.Speed; speed++){
            int moveok = 0;
            //    マップとの衝突
            if( MapJudge((int)Play.Px,(int)Play.Py,rot) ) {
                //    当たったので、今度は左斜めへ。
                rot -= 45/180*M_PI;
                if( MapJudge((int)Play.Px,(int)Play.Py,rot) ) {
                    //    当たったので、今度は右斜めへ。
                    rot += 90/180*M_PI;
                    if( MapJudge((int)Play.Px,(int)Play.Py,rot) ) {
                        //    これは移動出来ません。
                        Play.Px = Play.Ox;
                        Play.Py = Play.Oy;
                    } else {
                        moveok = 1;
                    }
                } else {
                    moveok = 1;
                }
            } else {
                moveok = 1;
            }
            //    移動できたら座標の反映
            if( moveok ) {
                Play.Ox = Play.Px;
                Play.Oy = Play.Py;
                Play.Px += cos(rot);
                Play.Py += sin(rot);
            }
        }
    }
お忙しい中、本当にありがとうございました。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月01日(月) 23:41
by PG初心者
なんどもすみません・・・
根本的な問題が解決できませんでした・・・。
上にブロックがある時に→キーを押すと移動できません・・・。

Re:ダンジョン風ゲームのキャラクターの移動

Posted: 2010年2月02日(火) 10:15
by softya
>原因は前の位置に戻す処理をしていない為
私のコードでは、戻さなくて良いはずですけどね。

>上にブロックがある時に→キーを押すと移動できません・・・。
これは何が原因か分かりますか?
当たる前と当たった座標から調べてみて下さい。
斜めの入力に対して、45度づつ違う方向に避けているはずなので、原理的には横にも進むはずです。
※ あくまで原理的であって誤差などの問題がある可能性があります。