Cocos2d - вращение / вращение одного спрайта вокруг другого - PullRequest
0 голосов
/ 27 октября 2011

У меня есть спрайты, по сути, ядро ​​(родитель) и электрон (ребенок). Я пытаюсь найти способ заставить электрон вращаться вокруг ядра. Я нашел несколько сообщений о перемещении опорных точек, но это, очевидно, связано с текстурой спрайта, а не с самим спрайтом.

Это мой текущий метод инициализации для моего родительского спрайта:

self = [super init];
if (self) {

    CCSprite *orbitAnchor = [CCSprite new];
    [self addChild:orbitAnchor];
    orbitAnchor.position = ccp(32,32);

    CCSprite *orbiter = [CCSprite spriteWithFile:@"line.png" rect:CGRectMake(0, 0, 8, 8)];
    [orbitAnchor addChild:orbiter];
    orbiter.position = ccp(40,40);

    CCAction *orbitAction = [CCRepeatForever actionWithAction:[CCRotateTo actionWithDuration:1 angle:720]];
    [orbitAnchor runAction:orbitAction];

    [self initAnimations];
}

return self;

Хотя эти числа абсолютно произвольны - я просто вставил их туда и получил то, что выглядело лучше всего. Я уверен, что есть более программный способ делать то, что я хочу.

По сути, я ищу способ установить точку оси дочернего элемента в центре родительского элемента, а затем повернуть ее вокруг этой точки. Это кажется относительно простым делом с помощью CCRotate и тому подобного, но я думаю, что мне не хватает того, что искать, чтобы переместить опорную точку ребенка. Любые предложения / другие сообщения?

Спасибо

Ответы [ 2 ]

1 голос
/ 28 октября 2011

У вас есть [CCSprite new], который используется необычно, вероятно, не поддерживается. Если узел привязки орбиты не должен отображать текстуру, вы можете просто использовать CCNode в качестве привязки.

Технически вы все делаете правильно, исходя из того, что я вижу. Возможно, вы захотите попробовать без действий поворота и вместо этого вручную изменить направление в методе обновления по расписанию.

  CCNode *orbitAnchor = [CCNode node];
  [self addChild:orbitAnchor z:0 tag:1];
  orbitAnchor.position = ccp(32,32);

  CCSprite *orbiter = [CCSprite spriteWithFile:@"line.png" rect:CGRectMake(0, 0, 8, 8)];
  [orbitAnchor addChild:orbiter z:0 tag:2];
  orbiter.position = ccp(40,40);

  [self scheduleUpdate];

Метод обновления:

-(void) update:(ccTime)delta
{
  CCNode* orbitAnchor = [self getChildByTag:1];
  orbitAnchor.direction += 5;
}

Из имени файла изображения похоже, что вы пытаетесь нарисовать линию от orbitAnchor к орбитальному аппарату. Вы можете сделать это с помощью ccDrawLine:

-(void) draw
{
  CCNode* orbitAnchor = [self getChildByTag:1];
  CCNode* orbiter = [self getChildByTag:2];
  ccDrawLine(orbitAnchor.position, orbiter.position);
}
0 голосов
/ 28 октября 2011

Якорные точки. Автоматически объекты размещаются на основе центра объекта, верно? с точками привязки вы можете перемещать это вокруг, поэтому, если вы вращаете объект, он будет вращаться вокруг привязки. http://www.qcmat.com/understanding-anchorpoint-in-cocos2d/

...