2011-01-08 10 views
7

tworzę kanon na ogień obiektów. z tyłu kanonu zamocowany jest tłok. tłok działa dla ustawionej prędkości i kąta. kanon obraca się w zakresie 0-90 stopni, a tłok porusza się z przodu iz tyłu, aby dostosować prędkość. kiedy obrócę kanon za pomocą dotknięć, przeniosłem jego działającą grzywnę. kiedy tłok jest odciągany przez dotknięcie przesuwane i obraca się, tłok jest poza koroną.Ograniczyć sprite w cocos2d

jak kontrolować to: -

mój kod do tłoka i rotacji kanonicznego na akcentami przeniesiony. (Para3 jest kanon, para6 jest mój tłoczek): -

CGPoint touchLocation = [self convertTouchToNodeSpace:touch]; 
    CGPoint oldTouchLocation = [touch previousLocationInView:touch.view]; 
    oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation]; 
    oldTouchLocation = [self convertToNodeSpace:oldTouchLocation]; 
    if (CGRectContainsPoint(CGRectMake(para6.position.x-para6.contentSize.width/2, para6.position.y-para6.contentSize.height/2, para6.contentSize.width, para6.contentSize.height), touchLocation) && (touchLocation.y-oldTouchLocation.y == 0)) 
    { 
     CGPoint diff = ccpSub(touchLocation, oldTouchLocation); 
     CGPoint currentpos = [para6 position]; 
     NSLog(@"%d",currentpos); 
     CGPoint destination = ccpAdd(currentpos, diff); 
     if (destination.x < 90 && destination.x >70) 
     { 
      [para6 setPosition:destination]; 
      speed = (70 + (90-destination.x))*3.5 ; 
     } 

    } 
if(CGRectIntersectsRect((CGRectMake(para6.position.x-para6.contentSize.width/8, (para6.position.y+30)-para6.contentSize.height/10, para6.contentSize.width, para6.contentSize.height/10)),(CGRectMake(para3.position.x-para3.contentSize.width/2, para3.position.y-para3.contentSize.height/2, para3.contentSize.width, para3.contentSize.height)))) 

      { 

     [para3 runAction:[CCSequence actions: 
          [CCRotateTo actionWithDuration:rotateDuration angle:rotateDiff], 
          nil]]; 
     CGFloat plungrot = (rotateDiff); 
     CCRotateTo *rot = [CCRotateTo actionWithDuration:rotateDuration angle:plungrot]; 
     [para6 runAction:rot]; 
    } 
} 

Odpowiedz

2

jak o tym, że u używasz zrobić [CCMoveTo actionWithDuration: Stanowisko:] Metoda ??

Dzięki tej metodzie można łatwo kontrolować prędkość za pomocą argumentu "actionWithDuration", który przyjmuje całkowite wartości czasu w sekundach, natomiast kierunek można regulować za pomocą argumentu "position", który przyjmuje ccp (x, y) jako wartości do punkt, do którego chcesz przesunąć tłok.

Można go używać tak ....

CCSprite *plunger = [[CCSprite alloc] initWithFile:@"plunger.png"]; 
    plunger.position = ccp(240,240); 
    [self addChild:plunger z:10]; 
    [plunger release]; 

    id = [CCMoveTo actionWithDuration:3 position:ccp(300,240)]; 

Podane wartości są z mojego wyboru. Możesz ich użyć do swojej zgodności.

Mam nadzieję, że to pomoże ...

1

Mam nadzieję, że zrozumiał pytanie poprawnie: jeśli jest problem, że armaty i tłok zarówno obracać wokół ich własnych punktów środkowych, ale chcesz im obracać razem, to rozwiązanie powinno być, aby tłok sprite dziecko z armaty (w tym także sprawia, że ​​pozycja plugers względem armaty) tj

[para3 addChild:para6] 

następnie wystarczy tylko obrócić armaty i tłok będzie z nim rotacyjnie.

jeśli mam swoje pytanie całkowicie błędne, może można umieścić zrzut ekranu :-)

+0

Dodałem jako dziecko. wciąż jest związany z duszkiem (tłok ogranicza armatę), gdy dotknie zakończona metoda, będzie działać poprawnie. w dotkniętych ruchach nadal ogranicza się po dodaniu dziecka. – Srinivas