Cocos2d - Cirkelen/draaien van de ene sprite rond de andere

Ik moet sprites, in wezen een kern (ouder) en een elektron (kind). Ik probeer een manier te vinden om het elektron om de kern te laten cirkelen. Ik heb hier en daar wat berichten gevonden over het verplaatsen van ankerpunten, maar dat is blijkbaar gerelateerd aan de textuur van de sprite, niet aan de sprite zelf.

Dit is mijn huidige init-methode voor mijn bovenliggende sprite:

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;

Die cijfers zijn echter allemaal volkomen willekeurig - ik heb ze er gewoon in gestopt en heb gekregen wat er het beste uitzag. Ik weet zeker dat er een meer programmatische manier is om te doen wat ik wil.

Kortom, ik ben op zoek naar een manier om het aspunt van het kind in het midden van het bovenliggende element in te stellen en het vervolgens rond dat punt te laten draaien. Het lijkt relatief eenvoudig om CCRotate en dergelijke te gebruiken, maar ik denk dat ik mis wat ik moet zoeken om het ankerpunt van het kind te verplaatsen. Eventuele suggesties/andere berichten?

Bedankt

0

2 antwoord

U hebt [CCSprite nieuw], wat een ongewoon gebruik is, waarschijnlijk niet ondersteund. Tenzij het orbit anchor-knooppunt een textuur moet weergeven, kunt u een CCNode gewoon als anker gebruiken.

Technisch gezien doe je alles goed vanuit wat ik kan zien. U kunt het proberen zonder de rotatie-acties en in plaats daarvan de richting handmatig wijzigen in een geplande updatemethode.

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

Update methode:

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

Van de afbeeldingsbestandsnaam lijkt het erop dat u een lijn probeert te tekenen van de orbitAnchor naar de orbiter. U kunt dat doen met ccDrawLine:

-(void) draw
{
  CCNode* orbitAnchor = [self getChildByTag:1];
  CCNode* orbiter = [self getChildByTag:2];
  ccDrawLine(orbitAnchor.position, orbiter.position);
}
1
toegevoegd

Anchor points. Automatically, objects are placed based on the center of an object right? with anchor points you can move that around, so if you rotate the object it will rotate around the anchorpoint. http://www.qcmat.com/understanding-anchorpoint-in-cocos2d/

0
toegevoegd
Dat is correct, maar ik kan die benadering niet aanbevelen omdat het de textuur van de positie van het knooppunt compenseert. Je kunt exact hetzelfde effect bereiken met meer controle door simpelweg de knooppunthiërarchie te gebruiken. Als knooppunt B het kind is van een ander knooppunt A en knooppunt B verschoven is ten opzichte van knooppunt A, kunt u knooppunt A verplaatsen, roteren of schalen en knooppunt B conformeert zich dienovereenkomstig, inclusief roteren rond knooppunt A.
toegevoegd de auteur LearnCocos2D, de bron
Ik heb uitgelegd waarom het wijzigen van anchorPoint hier een slechte praktijk is: stackoverflow.com/questions/7808981/…
toegevoegd de auteur LearnCocos2D, de bron