C++でのブロック崩しゲームの作成に関して
初めまして。C++で動くブロック崩しを作成していますがそれに関して2つ質問させて頂きます。
(1)オブジェクト指向によるブロック、パドルでのクラス宣言
オブジェクト指向に基づきプログラミングをしており、パドル、ブロック、ボールといった物体をクラス定義しそれらをゲームクラスで統括する方法をとっています。また、他クラスのインスタンスやメソッドはgetter/setter関数で取得し、その際に参照するクラスの宣言は"const Ball& ball"の様に行っています。
他クラスを参照する必要のある場合は、例えばBlockクラス内でBallとの衝突判定や衝突応答を行いたい時に宣言を行っています。衝突判定ならばBoolean型を返すだけなのでconstで宣言出来るのですが、衝突応答ではボールを反射させる(ボールの速度を変化させる)必要があるためconstで宣言出来ません。
現在は"Ball& ball"と宣言をしていますが、これでは他クラス内でインスタンスの値を変更できてしまうため行儀が良いとは思えません。言っている事が矛盾しているとは思いますが、何とか"const Ball& ball"で宣言しつつBlockクラス内でボールの速度を変化させる方法は無いでしょうか?
(2)ブロックとボールの衝突応答
ブロックとボールの衝突応答について、以下の様に記述しています。
void Block::reflect(Ball& ball){
Vector ballnext;
ballnext.x=ball.getx()+ball.getVx(),ballnext.y=ball.gety()+ball.getVy();
if(fabsf(ballnext.x-this->x) <= this->width/2 && fabsf(ball.getx()-this->x) >= this->width/2){
ball.setVx(-ball.getVx());
}
else if(fabsf(ballnext.y-this->y) <= this->height/2 && fabsf(ball.gety()-this->y) >= this->height/2){
ball.setVy(-ball.getVy());
}
}
この関数より前にブロック内にボールが含まれるかどうかの衝突判定を行っています。この関数では、数秒先のボールの位置がブロック内に含まれており、現在のボールの位置が含まれていない場合のそれぞれの位置関係で反射方向を決めています。
ですがこれでは上手く反射されません。ボールがブロックに接触し暫く突き進んだ後に反射されます。
しかし、
ballnext.x=ball.getx()+ball.getVx()*2,ballnext.y=ball.gety()+ball.getVy()*4;
の様に記述すると上手く反射されます。何故こうなるのかが理解出来ません。
長文になってしまい申し訳ありませんが、どなたかご教授して頂けたら幸いでございます。