ボックスを使用して敵をトラップできるゲーム(c ++でirrlichtエンジンを使用)を作成しようとしています。しかし、ユーザーと1つ以上のボックスとの衝突が検出されたときに、何を移動する必要があるかを検出する方法がわかりません。もう1つは、動きをブロックできるレンガと呼ばれるオブジェクトもいくつかあるということです。
私は物事を説明するのがあまり得意ではないので、画像を含めました。それで、私が何を意味するのかが明確になることを願っています:(出典:jrahmati.info)
私は自分のコードでいくつかのことを試しましたが、成功しませんでした。ですから、誰かがこの問題に答える努力をしてくれることを本当に望んでいます。前もって感謝します。ちなみに、私は必ずしもc ++で答えを必要としません、javaまたは.Net言語も大丈夫です。
コードに興味のある人のために:
プレイヤーからすべてを遠ざけようとするboolGame :: tryMove(user、dir)のコンテンツ
bool thereIsCollision = false;
bool undoMovements = false;
bool userCollision = false;
do{
thereIsCollision = false;
for (int i = 0; i < totalObjects; i++) {
//First check if object hits the user
if(gameObjects[i].hits(user)){
if (gameObjects[i]->isMovable()) {
MovableObject* mObject = (MovableObject*) gameObjects[i];
mObject->move(dir);
mObject->setPushVector(dir);
userCollision = true;
//thereIsCollision = true;
}
else{
undoMovements = true;
thereIsCollision = false; //To break do-while loop
userCollision = true;
break;
}
}
}
if(undoMovements)
break;
for (int i = 0; i < totalObjects; i++) {
//Then check if objects hit each other
for (int i2 = 0; i2 < totalObjects; i2++) {
if(i == i2)
continue;
if (gameObjects[i2].hits(gameObjects[i])){
//thereIsCollision = true;
if(gameObjects[i]->isMovable() && gameObjects[i2]->isMovable()){
MovableObject* mObject = (MovableObject*) gameObjects[i];
MovableObject* mObject2 = (MovableObject*) gameObjects[i2];
if(mObject->getPushVector().X > 0
|| mObject->getPushVector().Y > 0
|| mObject->getPushVector().Z > 0){
mObject2->move(mObject->getPushVector());
mObject2->setPushVector(mObject->getPushVector());
mObject->setPushVector(irr::core::vector3df(0, 0, 0));
}
else if(mObject2->getPushVector().X > 0
|| mObject2->getPushVector().Y > 0
|| mObject2->getPushVector().Z > 0){
mObject->move(mObject2->getPushVector());
mObject->setPushVector(mObject2->getPushVector());
mObject2->setPushVector(irr::core::vector3df(0, 0, 0));
}
}
else{
undoMovements = true;
thereIsCollision = false; //To break do-while loop
break;
}
}
}
}
}while(thereIsCollision);
for (int i = 0; i < totalObjects; i++) {
if (gameObjects[i]->isMovable()) {
MovableObject* mObject = (MovableObject*) gameObjects[i];
if(undoMovements){
// Resets position of gameObject to its previous one
mObject->undoMovement();
}
else{
// confirms movement(i.e. prevPosition=curPosition)
mObject->confirmMovement();
}
}
}
return !(userCollision);