我試圖做一個遊戲(使用irrlicht引擎與c + +)在哪裏你可以陷阱你的敵人使用框。但是我只是不知道如何檢測用戶和一個或多個盒子之間的碰撞時應該移動什麼。另一件事是,也會有一些叫做磚塊的物體能夠阻止運動。如何將多個矩形移動爲碰撞響應?
因爲我沒有解釋的事情非常好,我包括圖像,所以它會希望澄清我的意思:alt text http://jrahmati.info/images/collision.gif
我試着與我的代碼,但沒有成功幾件事情。所以我真的希望有人會努力回答這個問題。提前致謝。順便說一句,我不需要在C++中的答案,Java或.NET語言也可以。
任何有興趣的代碼:
布爾遊戲:: tryMove(用戶,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);
我覺得你提供了太多的代碼嚇跑了每一個人。 – Brian 2010-07-28 19:39:13
我猜這個代碼甚至沒有必要,因爲我只想知道如何去做。 – 2010-07-29 05:55:02