重置精灵 - Box2d(Cocos2d)

Posted

技术标签:

【中文标题】重置精灵 - Box2d(Cocos2d)【英文标题】:Reset Sprite - Box2d(Cocos2d) 【发布时间】:2011-06-12 22:58:03 【问题描述】:

我有一个球,当它与精灵碰撞时会触发一个动作。然后在动作完成后,它会重置它的位置

-(void)removeBall

    [self stopAllActions];
    _ballBody->SetTransform(b2Vec2(10, 2), 0);

但是,[self stopAllActions] 不会停止动作。我怎样才能停止动作? 有任何想法吗?

谢谢

【问题讨论】:

你在 stopAllActions 中执行了什么? 【参考方案1】:

==>你可以按照我下面的方法做

==> 销毁 body 对象并创建新的并重置您想要设置的位置 这肯定会工作

     _world->DestroyBody(_body);
    b2BodyDef  _playerBodyDef;
    _playerBodyDef.type=b2_dynamicBody;
    _playerBodyDef.position.Set(160/PTM_RATIO,240/PTM_RATIO);
    _playerBodyDef.userData=_ball;
    _body=_world->CreateBody(&_playerBodyDef);
    //create the shape for the rounded stick
    b2CircleShape PlayerShape;
    PlayerShape.m_radius = 15.0/PTM_RATIO;  

    //fixtureDef  specifying the shape to circle
    b2FixtureDef _playerShapeDef;
    _playerShapeDef.shape = &PlayerShape;
    _playerShapeDef.density = 1.0f;
    _playerShapeDef.friction = 0.5f;
    _playerShapeDef.restitution = 1.0f;
    _playerShapeDef.filter.groupIndex =k_largeGroup;
    _body->CreateFixture(&_playerShapeDef);

祝你好运

【讨论】:

哦,好的,谢谢,所以我基本上只是完全移除了球体然后再添加它?我得去上班了,等我回来再测试一下。 它没有用。这是因为我在“更新”方法中运行动作(我在身体与另一个身体碰撞后运行动作)。所以,我只是替换了场景([[CCDirector sharedDirector] replaceScene:[HelloWorldLayer scene]]” 您需要检查您的代码并将一个方法放入滴答计时器方法中,然后调用该方法,您可以销毁对象并再次重置位置 @jon 你能显示 Stopallaction 方法的代码还是我建议你的代码 您是否参考了以下链接raywenderlich.com/505/…【参考方案2】:

StopAllActions 是 Cocos2D,而不是 Box2D。我为重用身体、精灵、粒子等所做的设置为 visible=NO 和 body->SetActive(false)。

这是为了停用对象:

CCSprite *sprite = [projectiles objectAtIndex:i];

// Just to continue a loop if the sprite is not visible         
if(sprite.visible == NO) continue;

sprite.visible = NO;

b2Body *body = projectileBodyTracker[i];
body->SetActive(false);

这是为了重新激活对象:

CCSprite *sprite = [projectiles objectAtIndex:i];

sprite.position = moveToPosition;

b2Body *body = projectileBodyTracker[i];
body->SetTransform(moveToPositionVector, rotation);
body->SetActive(true);

我已经在脑海中写下了额外的代码,所以我不能完全确定它是正确的(在语法上),但我就是这样做的。

【讨论】:

我正在使用 cocos2d 来运行所需的操作,我需要重置精灵以便可见 = 不足够 简化:Cocos2D 与 Box2D 兼容,但 Box2D 与 Cocos2D 并不完全兼容。如果你用 Cocos2D 移动精灵,你就破坏了物理模拟。如果您只想使用 Box2D 进行碰撞检测(根本不模拟任何物理),那么您可以将您的身体设置为传感器,并使用您的接触侦听器来告诉您何时发生了碰撞。 我在我的游戏中使用了 Box2d,但我也使用和动作来在精灵从平台上“脱落”时为其设置动画。然后,我需要重置它。 好吧,我要做的是: 1) 停止所有 cocos2d 对 sprite 的操作。 2) 设置身体不活动。 3) 将身体和精灵移动到“重置位置”。 4) 再次激活body。可选)如果出于任何原因需要,您还可以将精灵设置为不可见。我个人这样做是因为我经常重用我的对象,从数组中提取它们的指针。 我已经通过删除一些不需要的代码并编写一些新代码来解释移动和重新激活对象来更新我的答案。希望这更清楚。【参考方案3】:

我正在使用

-(void)update:(ccTime)delta



不断检查ballBody 是否与另一个body 发生碰撞,并使用Accelerometer 移动ballBody。因此,要重置 ballBody 的位置,我只需替换场景,调用“dealloc”然后再次启动场景。

[[CCDirector sharedDirector] replaceScene:[HelloWorldLayer scene]];

【讨论】:

这不是你应该做的方式

以上是关于重置精灵 - Box2d(Cocos2d)的主要内容,如果未能解决你的问题,请参考以下文章

Box2d 和 Cocos2d 在 iOS 上的精灵和定位问题

cocos2d + box2d:向点旋转

边缘 - Cocos2d/Box2D

Box2d Cocos2d 中的联系监听器

单面平台(Box2D/Cocos2D)

Cocos2d / Box2d CCribbon 碰撞检测