Iphone 重置精灵-Box2d(Cocos2d)

Iphone 重置精灵-Box2d(Cocos2d),iphone,cocos2d-iphone,box2d,Iphone,Cocos2d Iphone,Box2d,我有一个球,当它与精灵碰撞时会触发一个动作。然后,在操作完成后,它会用 -(void)removeBall { [self stopAllActions]; _ballBody->SetTransform(b2Vec2(10, 2), 0); } 但是,[自我停止行动]并没有停止行动。我怎样才能停止行动? 有什么想法吗 谢谢==>你可以按照我下面的方式来做 ==>销毁身体对象,创建新的并重置要设置的位置 这肯定会奏效的 _world->DestroyBod

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

-(void)removeBall
{
    [self stopAllActions];
    _ballBody->SetTransform(b2Vec2(10, 2), 0);
}
但是,[自我停止行动]并没有停止行动。我怎样才能停止行动? 有什么想法吗


谢谢

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

==>销毁身体对象,创建新的并重置要设置的位置 这肯定会奏效的

     _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);

祝你好运

==>你可以像我下面做的那样做

==>销毁身体对象,创建新的并重置要设置的位置 这肯定会奏效的

     _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);
祝你好运

我正在使用

-(void)update:(ccTime)delta
{

}
经常检查球体是否与另一个球体发生碰撞,并使用加速计移动球体。所以,要重置球身的位置,我只需替换场景,调用“dealloc”,然后再次启动场景

[[CCDirector sharedDirector] replaceScene:[HelloWorldLayer scene]];
我正在使用

-(void)update:(ccTime)delta
{

}
经常检查球体是否与另一个球体发生碰撞,并使用加速计移动球体。所以,要重置球身的位置,我只需替换场景,调用“dealloc”,然后再次启动场景

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

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);
这是为了重新激活对象:

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);

我已经把附加的代码写下来了,所以我不能完全确定它是否正确(语法上),但我就是这样做的。

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);
这是为了重新激活对象:

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);


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

你在stopAllActions中执行了什么?你在stopAllActions中执行了什么?哦,好的,谢谢,所以我基本上只是完全删除了球体,然后再添加它?我得去上班了,但我回来后会测试一下。它不起作用。这是因为我在“更新”方法中运行操作(我在身体与另一个身体碰撞后运行操作)。因此,我刚刚替换了场景([[CCDirector sharedDirector]replaceSecene:[HelloWorldLayer场景]]"您需要检查代码并在tick timer方法中放入一个方法,然后从中调用该方法,这样您就可以销毁该对象,并且还可以重置该对象position@jon你能显示Stopallaction方法的代码或我建议的代码吗?你参考了下面的链接吗?哦,好的,谢谢,所以我基本上只是完全删除球体然后再添加它?我必须去工作,但我回来后会测试它。它不起作用。这是因为我以“更新”方法运行动作(我在球体与另一个球体碰撞后运行动作)。因此,我只是替换了场景([[CCDirector sharedDirector]ReplaceSecase:[HelloWorldLayer scene]]"您需要检查代码并在tick timer方法中放入一个方法,然后从中调用该方法,这样您就可以销毁该对象,并且还可以重置该对象position@jon你能显示Stopallaction方法的代码或我建议你使用的代码吗?你是否参考了以下链接?这不是你设想的方式这不是您的设想方式我正在使用cocos2d运行所需操作,我需要重置精灵以便可见=否,这不足以简化:cocos2d与Box2D兼容,但Box2D与cocos2d不完全兼容。如果使用cocos2d移动精灵,则破坏了物理模拟。如果要使用Box2D进行碰撞检测然后,你将你的身体设置为传感器,并使用你的联系人侦听器来告诉你何时发生碰撞。我在游戏中使用Box2d,但我也使用and action来设置精灵从平台上“掉落”时的动画。然后,我需要重置它。好的,我要做的是:1)停止精灵上的所有cocos2d操作。2)将主体设置为非活动状态。3) 将主体和精灵移动到“重置位置”。4) 将主体重新设置为活动状态。可选)如果出于任何原因需要,也可以将精灵设置为不可见。我个人这样做是因为我不断重复使用我的对象,从数组中提取它们的指针。我更新了我的答案,删除了一些不需要的代码,并编写了一些新代码来解释移动和重新激活对象。希望这更清楚。我正在使用cocos2d运行所需的操作,我需要重置精灵,以便visible=no不足以简化:cocos2d与Box2D兼容,但Box2D与cocos2d并不完全兼容。如果使用Cocos2D移动精灵,则会破坏物理模拟。如果您只想使用Box2D进行碰撞检测(而不是模拟任何物理),那么您可以将身体设置为传感器,并使用联系人侦听器来告诉您何时发生了碰撞。我在游戏中使用Box2D,但我也使用and action来设置精灵从平台上“脱落”时的动画。然后,我需要重置它。好的,我要做的是:1)停止精灵上的所有cocos2d操作。2) 将主体设置为非活动状态。3) 将主体和精灵移动到“重置位置”。4) 将主体重新设置为活动状态。可选)如果出于任何原因需要,也可以将精灵设置为不可见。我个人这样做是因为我不断重复使用我的对象,从数组中提取它们的指针。我更新了我的答案,删除了一些不需要的代码,并编写了一些新代码来解释移动和重新激活对象。希望这更清楚。