我在Cocos2d X游戏中使用了这种方法。
void OpponentNode::discard(int cardNum)
{
log("\nOpponentNode::discard <%d>\n", cardNum);
for (int i = 0; i < vecOpponentHand.size(); i++)
{
if (vecOpponentHand.at(i) == cardNum)
{
vecOpponentHand.erase(vecOpponentHand.begin() + i);
break;
}
}
CardSprite * discardedCard;
for (int i = 0; i < vecOpponentCards.size(); i++)
{
if (vecOpponentCards.at(i)->getTag() == cardNum)
{
discardedCard = vecOpponentCards.at(i);
vecOpponentCards.erase(vecOpponentCards.begin() + i);
break;
}
}
log("\nOpponentNode::discard <%d>\n", cardNum);
discardedCard->makeFaceUp();
RotateTo * rotate = RotateTo::create(0.4 * SPEED_MULTIPLIER, 0);
MoveTo * move = MoveTo::create(0.4 * SPEED_MULTIPLIER,
origin + Vec2(visibleSize.width * 0.75, visibleSize.height * 0.6));
Spawn * spawn = Spawn::create(rotate, move, NULL);
CallFunc * callFunc = CallFunc::create(
[&]()
{
log("\nOpponentNode::discard <%d>\n", cardNum); //this one shows garbage/different value
if (delegate)
{
delegate->opponentNodeDidFinishDiscard(this, cardNum);
}
this->removeChild(discardedCard);
});
discardedCard->runAction(Sequence::create(spawn, callFunc, NULL));
log("\nOpponentNode::discard <%d>\n", cardNum);
}
奇怪的是,当我如上所述记录整数cardNum时,我从lambda函数内部的日志中获得了不同的值。例如,我从顶部2个日志和最底部日志中获取“OpponentNode::discard ”,但从lambda函数内部的日志中获取“OpponentNode::discard ”。
其他要点:
我的猜测是整数cardNum在执行之前被释放。谁能指出我正确的方向?
最佳答案
您正在捕获对cardNum
参数的引用。我认为您想按值(value)来捕获那个。
我不清楚delegate
是什么。假设它是一个类成员,那么我认为您只需要[this, discardedCard, cardNum]
即可。您可以将其缩写为[=]
,尽管我认为显式的更为清晰。