gpt4 book ai didi

c++ - 如何移动多个矩形作为碰撞响应?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:09 25 4
gpt4 key购买 nike

我正在尝试制作一款游戏(使用带有 C++ 的 irrlicht 引擎),您可以在其中使用盒子诱捕敌人。但是当检测到用户与一个或多个盒子之间发生碰撞时,我只是不知道如何检测应该移动什么。另一件事是,还会有一些称为砖 block 的物体可以阻挡移动。

由于我不太擅长解释事情,所以我附上了一张图片,希望它能澄清我的意思:alt text
(来源:jrahmati.info)

我用我的代码尝试了几件事,但没有成功。所以我真的希望有人会努力回答这个问题。提前致谢。顺便说一下,我不一定需要 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);

最佳答案

这是一种推箱子游戏,玩家可以在 8 个方向上移动,并且可以一次移动多个盒子?从鸟瞰图看游戏场是否像推箱子一样,或者它们是我们在示例中看到的掉落箱子(侧 View ,如俄罗斯方 block )?盒子和玩家之间的摩擦力是否无限大(换句话说,玩家触摸的盒子在对角线移动时是否禁止滑离玩家移动的方向)?两个盒子之间的摩擦力是无穷大吗?

我无法专注于您的代码,但这是我的 2cents 算法。该算法暗示任意两个物体之间的摩擦力是无限的。

当玩家移动时,您需要确定哪些可移动对象可能会受到影响。将玩家在移动方向上触摸的对象放入某个搜索堆栈,然后通过向其中放入更多对象,对搜索堆栈中的每个项目重复搜索过程。最后你会用完可移动的物体。如果在任何时候你偶然发现了一个不可移动的物体,那么玩家也不能移动(因为无限摩擦规则),所以什么都不会移动。如果不涉及不可移动的对象,则将堆栈中的所有对象移动一个网格单元。

关于c++ - 如何移动多个矩形作为碰撞响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3354175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com