我正在尝试制作一款游戏(使用C++的irrlicht引擎),在这个游戏中,你可以使用箱子来困住你的敌人。但是我不知道如何检测当用户与一个或多个箱子发生碰撞时应该移动什么。另一件事是,还将有一些名为砖块的物体,它们将能够阻止移动。
由于我不太善于解释事情,所以我包含了一张图片,希望能够澄清我的意思:
(来源:jrahmati.info)
我已经尝试了几种方法,但都没有成功。所以我真的希望有人能够花费精力回答这个问题。提前感谢。
顺便说一下,我不一定需要用C++回答,Java或.Net语言也可以。
对于任何对代码感兴趣的人:
bool Game::tryMove(user, dir) 的内容,它试图将所有东西都从玩家身边移开。
由于我不太善于解释事情,所以我包含了一张图片,希望能够澄清我的意思:
![alt text](https://istack.dev59.com/k8EvZ.gif)
对于任何对代码感兴趣的人:
bool Game::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);