执行 setPosition 时墙不动 cocos2d-x

Wall not moving when doing setPosition cocos2d-x


我正在将之前用 Java 编写的 android 游戏转换为 cocos2d-x。在这个游戏中,我需要在几个随机位置生成墙,所以我在我的 init 方法中对我的精灵调用了 setPosition,但 x 轴上的位置没有改变(它们在 y 轴上改变了,虽然 Oo)。
当我在 onTouchBegun() 上调用它并在那里更改它时,位置确实发生了变化,只是在最初的调用中不起作用。我在 google 上找不到任何相关问题,我完全没有想法。
我将在下面添加我用来生成墙的代码:

void WallPair::init(cocos2d::Layer *scene, float height, float width, float gapWidth, Vec2 position){
this->position = position;
this->height = height;
this->scene = scene;
this->gapWidth = gapWidth;
//Pointtrigger (obv)
pointWall = Sprite::create();
pointWall->setScale(gapWidth, height);
pointWall->setPosition(position.x, position.y);
auto pointTrigger = PhysicsBody::createBox(Size(gapWidth, height));
pointTrigger->setDynamic(false);
pointTrigger->setGravityEnable(false);
pointTrigger->setCategoryBitmask((int)PhysicsCategory::POINT);
pointTrigger->setCollisionBitmask((int)PhysicsCategory::NONE);
pointTrigger->setContactTestBitmask((int)PhysicsCategory::PLAYER);
pointWall->setPhysicsBody(pointTrigger);
scene->addChild(pointWall, 2);

leftWall = Sprite::create(texture);
leftWall->setScale(width/leftWall->getContentSize().width, height/leftWall->getContentSize().height);
Size wallSize = Size(leftWall->getContentSize().width * leftWall->getScaleX(), leftWall->getContentSize().height * leftWall->getScaleY());
std::cout << "POSRES: " << (position.x - gapWidth - wallSize.width) << " ::: LEFT;" << std::endl;

std::cout << "LPOS: " << leftWall->getPosition().x << ", LSIZE: " << wallSize.width << std::endl;
std::cout << "SCALE: " << leftWall->getScaleX() << ", " << leftWall->getScaleY() << std::endl;
  // std::cout << "contentSizeLW: " << leftWall->getContentSize().width << " pos: " << (position.x - gapWidth - leftWall->getContentSize().width/2) <<", SCALE: " << leftWall->getScaleY()<<std::endl;
//leftWall->setContentSize(Size(leftWall->getContentSize().width, height));
scene->addChild(leftWall, 2);
auto pbl = PhysicsBody::createBox(wallSize, PhysicsMaterial(0.1f, 1.0f, 1.0f));
pbl->setDynamic(false);
pbl->setGravityEnable(false);
pbl->setCategoryBitmask((int)PhysicsCategory::WALL);
pbl->setCollisionBitmask((int)PhysicsCategory::PLAYER);
pbl->setContactTestBitmask((int)PhysicsCategory::PLAYER);
leftWall->setPhysicsBody(pbl);
leftWall->setPosition(position.x - gapWidth - wallSize.width, position.y);


rightWall = Sprite::create(texture);
rightWall->setScale(width/rightWall->getContentSize().width, height/rightWall->getContentSize().height);
wallSize = Size(rightWall->getContentSize().width * rightWall->getScaleX(), rightWall->getContentSize().height * rightWall->getScaleY());
std::cout << "POSRES: " << (position.x + gapWidth + wallSize.width) << ":::RIGHT;" << std::endl;
//rightWall->setContentSize(Size(rightWall->getContentSize().width * rightWall->getScaleX(), height));


std::cout << "RPOS: " << rightWall->getPosition().x << std::endl;
//rightWall->setContentSize(Size(rightWall->getContentSize().width, height));
 //  std::cout << "contentSizeRW: " << rightWall->getContentSize().width << " pos: " << (position.x + gapWidth + rightWall->getContentSize().width/2) << ", SCALE: " << rightWall->getScaleY() <<std::endl;
scene->addChild(rightWall, 2);
pbl = PhysicsBody::createBox(wallSize, PhysicsMaterial(0.1f, 1.0f, 1.0f));
pbl->setDynamic(false);
pbl->setGravityEnable(false);
pbl->setCategoryBitmask((int)PhysicsCategory::WALL);
pbl->setCollisionBitmask((int)PhysicsCategory::PLAYER);
pbl->setContactTestBitmask((int)PhysicsCategory::PLAYER);

rightWall->setPhysicsBody(pbl);
rightWall->setPosition(position.x + gapWidth + wallSize.width, position.y);


}

WallPair 的 onTouch 方法:

    void touch(){
    leftWall->setPosition(leftWall->getPositionX() - 50.0f, leftWall->getPositionY());
    rightWall->setPosition(rightWall->getPositionX() + 50.0f, rightWall->getPositionY());
}

编辑:
澄清一下:
问题不在于触摸方法。那工作正常。问题是WallPair::init()。尽管 getPosition 告诉我它们应该到处都是(范围从 -500 到 +1500),但它将精灵置于 0 的 xpos 位置。但他们仍然是0。 提前致谢!

因此,经过大量时间谷歌搜索、调试、测试和编码,我发现了问题所在。 如果我在执行 replaceScene 时使用过渡,我将无法手动设置带有物理体的精灵的位置,但我可以在没有过渡的情况下这样做。

我所做的只是更改 replaceScene 代码:

from:
    director->replaceScene(TransitionFlipX::create(2, scene));
to:
    director->replaceScene(scene);

现在可以使用了!