Я пытаюсь создать игру (используя движок irrlicht с c ++), где вы можете поймать врага в ловушку с помощью ящиков. Но я просто не понимаю, как определить, что следует перемещать при обнаружении столкновения между пользователем и одним или несколькими блоками. Другое дело, что будут также некоторые объекты, называемые кирпичами, которые смогут блокировать движения.
Поскольку я не очень хорош в объяснении вещей, я включил изображение, поэтому оно, надеюсь, прояснит, что я имею в виду: альтернативный текст http://jrahmati.info/images/collision.gif
Я попробовал несколько вещей с моим кодом, но безуспешно. Поэтому я очень надеюсь, что кто-то предпримет попытку дать ответ на этот вопрос. Заранее спасибо.
Кстати, мне не нужен ответ обязательно на языках c ++, java или .Net, тоже в порядке.
Для всех, кто интересуется кодом:
содержимое 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);