ページ 11

ブロック崩し

Posted: 2013年6月03日(月) 21:36
by ヨシタケ
お久しぶりです。
あれから、ステージをいくつか増やしました。

今まで気づかなかったのですが、ブロックとボールの当たり判定を変えてから、
敵と必殺技の判定がされなくなってしまっていました。

必殺技と四角の当たり判定の関数は

コード:

bool HitRectAndSp(Rect2D rectin){
	//必殺技1
	if(spstate == Sp1State1){
		if(HitRectAndRect(sp1hit, rectin)== TRUE)
			return TRUE;
		else
			return FALSE;
	}
	//必殺技3
	if(spstate == Sp3State2 ){
		for(int i = 0; i<3;i++){
			if(HitRectAndRect(sp2hit[i], rectin)== TRUE)
				return TRUE;
			else
				return FALSE;
		}
	}
}
一応、必殺技1のほうのreturn FALSE;のところにブレークポイントをおいて実行すると
止まるのでif(HitRectAndRect(sp1hit, rectin)== TRUE)がちゃんと判定されていないのだと思います。
また、なぜかブロックのほうはちゃんと判定されるため、rectinに敵の当たり判定がちゃんと入ってないのでは
ないかと思っているのですが、よくわかりません。
一応、ソースファイルを下記のサイトにアップしました。パスワードは「YT2013」です。

http://www1.axfc.net/uploader/so/2923367

ball.cppとbar.cppの関数はブロックにボールがあたったときの動きを正常にするためにGame.cppで使うように直しましたが、special.cpp内の関数はそれには関係なかったため、そのままにしています。同じように直したほうがよろしいでしょうか。そのままにしてある別の理由として、Game.cppの行数がとても長くなってしまう、また、例えば敵の計算の関数内の仮引数が敵にもよりますが、多くて4つも使用しています。これにさらに必殺技の内容まで加わるととても多くなってしまうと思っています。

Re: ブロック崩し

Posted: 2013年6月05日(水) 16:53
by ISLe
アップロードされたソースファイルは見てませんが…

提示されたコードで、必殺技3のとき、真偽のいずれでもリターンしてforループが回らないので、添字0の要素しか判定されません。

必殺技で発射されたオブジェクト単体ごとに当たり判定を行うようにすれば良いのではないでしょうか。
いわゆるオブジェクト指向ですが難しく構えることはないです。
ひとつの関数にいろんな判定要素がごちやごちゃ混ざっているので整理整頓してあげるだけのことです。
引数に無い外部要素も絡んでいますし。

どういう現象が出ているのか具体的に書かれれば、コードを見なくてもたいてい原因は分かるのですけどね。

Re: ブロック崩し

Posted: 2013年6月06日(木) 04:42
by 超絶右留斗羅天才プログラマー
このような感じで直してみたらどうでしょうか?
直らなかったらすみません(*´ω`*)

コード:

bool HitRectAndSp(Rect2D rectin){
    //必殺技1
    if(spstate == Sp1State1){
        if(HitRectAndRect(sp1hit, rectin)== TRUE)
            return TRUE;
        else
            return FALSE;
    }
    //必殺技3
    if(spstate == Sp3State2 ){
        for(int i = 0; i<3;i++){
            if(HitRectAndRect(sp2hit[i], rectin)== TRUE)
                return TRUE;
// ここをコメントアウト
//            else
//                return FALSE;
        }
    }
	return FALSE;	// ここを追加
}

Re: ブロック崩し

Posted: 2013年6月06日(木) 20:15
by ヨシタケ
すみません。ちょっと情報不足でした。

元々、必殺技3のほうは敵との当たり判定はないようにしようと思っています。(そのあたり、まだ直してませんでした)
今回は、必殺技1のほうです。

Re: ブロック崩し

Posted: 2013年6月06日(木) 20:57
by 超絶右留斗羅天才プログラマー
なるほど、失礼致しました!

必殺技を打っている最中、ブロックと当たり判定を行う際はspstateの値が1でしたが、敵と当たり判定をする際はspstateの値が2になっておりました。

以下のようにすることで、敵と必殺技との当たり判定が正常に行われました。

コード:

bool HitRectAndSp(Rect2D rectin){

	if(spstate == Sp1State1 || spstate == 2 ){ // ここの条件式を増やしました。
		if(HitRectAndRect(sp1hit, rectin)== TRUE)
			return TRUE;
		else
			return FALSE;
	}
	if(spstate == Sp3State2 ){
		for(int i = 0; i<3;i++){
			if(HitRectAndRect(sp2hit[i], rectin)== TRUE)
				return TRUE;
			else
				return FALSE;
		}
	}
}

Re: ブロック崩し

Posted: 2013年6月08日(土) 09:29
by ヨシタケ
返信遅くなりました。

超絶右留斗羅天才プログラマー 様の
アドバイス通りに変更したところ、敵の判定がされるようになりました。
ありがとうございました。