2013-03-25 4 views
3

먼저 호텔 객실에 앉아있는 나의 죽은 시간을 코딩하는 항공사 파일럿입니다. 그래서 내 무지를 용서합니다. Obj를 사용하여 블랙 잭 게임을 쓰고 있습니다. C 및 Cocos2D. 내 문제는 다음과 같습니다 : 내가 스탠드를 쳤을 때 17에 도달 할 때까지 딜러를 위해 카드를 그려야합니다.하지만 그 일을 처리했지만 루프에 지연을 삽입하자마자 작동이 멈 춥니 다. 나는 같은 지연을 구현하는 여러 가지 시도 : 그냥 모든 버튼을 정지루프 내에서 지연을 실행 중

[self performSelector:@selector(dealDealerCard:faceUp:) withObject:self afterDelay:2.0]; 

합니다. 나는 또한 실행 액션으로 CCSequence를 시도했다.

// if the stand button was pressed 

-(void)standButtonPressed:(id)sender 
{ 
BJDrawnCard *holeCard = [dealerHand getFlippedCard]; 
[holeCard flipCard]; 
while ([dealerHand getTotal]<=17){ 
    [self performSelector:@selector(dealDealerCard:faceUp:) withObject:self afterDelay:2.0]; 

} 

여기 방법입니다 : 정리해 너무

// Deal Dealers Card 

-(void)dealDealerCard:(id) dummy faceUp:(BOOL)isFaceUp 
{ 
drawnCard=[havila drawFromDeck]; 
if (isFaceUp) { 
[drawnCard setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:drawnCard.imageFileName]]; 
}else [drawnCard setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:@"Backside.png"]]; 
[dealerHand getCard:drawnCard]; 
[drawnCard setScale:0.5f]; 
[drawnCard setPosition:[self shoePosition]]; 
[cardsheet addChild:drawnCard]; 
// animate the cards 
float cardVelocity = (sqrtf((size.width*size.width)+(size.height*size.height)))/0.5; //  set the base speed for the movment 

// calculate the time needed to move the card 
CGPoint moveDifference = ccpSub([self dealerCardPosition], 
           [self shoePosition]); 
float moveDuration = ccpLength(moveDifference)/
cardVelocity; 

// define the movement 
CCMoveTo *move = [CCMoveTo actionWithDuration: 
        moveDuration position:[self dealerCardPosition]]; 
CCDelayTime *delay = [CCDelayTime 
         actionWithDuration:0.5]; 

//Run the action 

[drawnCard runAction:[CCSequence actions:move,delay,nil]]; 

numDealerHits++; 

} 

: 나는 또한 스케줄러 및 NSTimer 등 여기

내 코드를 시도 나는 실행하기 위해 노력하고있어 이 메서드를 총 호출 수가 17이 될 때까지 호출간에 2.0 초 지연으로 호출하는 조건부 루프.

어떤 도움을 받으실 수 있습니다.

+1

일반 규칙 : 사용 안함 GUI 쓰레드에 지연을 코딩한다. 그 작업을 지연없이 파견 할 수있는 조각으로 작업을 분할해야합니다. –

+0

"나는 ...."유일한 질문은 질문하지 않은 질문입니다. 나는 당신이 차기를 위해 무역/예술/과학을 연습한다는 것이 멋지다는 것을 알았습니다. – YvesLeBorg

+0

피드백을 보내 주셔서 감사합니다. 운 좋게도 답을 찾아 보았습니다. 나는 Hot Licks가 맞을 것으로 생각하고 GUI를 어떻게 든 메인 코드에서 분리해야한다고 생각한다. 아마도 –

답변

1
-(void)standButtonPressed:(id)sender 
{ 
    BJDrawnCard *holeCard = [dealerHand getFlippedCard]; 
    [holeCard flipCard]; 
    if ([dealerHand getTotal]<=17){ 
     [self performSelector:@selector(dealDealerCard:faceUp:) withObject:self afterDelay:2.0]; 

    } 
} 

으로 시도 할 수있는 경우가 더 많은 결정이있는 경우 더

if ([dealerHand getTotal]<=17) { 
    id more = [CCCallBlock actionWithBlock:^{ 
    [self performSelector:@selector(dealDealerCard:faceUp:) withObject:self afterDelay:2.0]; 
}]; 
    [drawnCard runAction:[CCSequence actions:move,delay,more,nil]]; 
} else { 
    [drawnCard runAction:[CCSequence actions:move,delay,nil]]; 
} 
+0

그는 performSelector를 사용해 보았습니다. 어쨌든 여기에 대해서는 언급하지 않겠습니다. CCCallBlock 클래스를 어떻게 얻었는지 알고 싶습니다. –

+0

나는 그것이 cocos2d 2.0에 등장했다고 생각한다. 이 경우 UI가 차단되지 않습니다. – YvesLeBorg

+1

멋지다, 프레임 워크에서 그걸 몰랐다. 나는이 한 가지 이유 때문에 당신의 대답을 포기합니다. –

1

GUI 스레드 지연으로 인해 첫 번째 솔루션을 사용하는 것이 UI를 고정시킵니다.

당신은 당신의 선택의 맨 끝에 GCD

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    <#code to be executed on the main queue after delay#> 
}); 
+0

그 GCD와 나는 포스트 +1을 편집 할 권한이있다. –

+0

실수로 죄송합니다. 감사. –

+0

Fabrizio에게 감사드립니다. 코드가 한 번 실행해도 문제가 없지만 조건부 루프 내에서 실행해야하고 내 버튼이 멈 춥니 다. –

0

는 동결되지 않습니다하는이 시도 UI가 지연되고 시작됩니다.

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 

     //do work 
    }); 
+0

감사합니다 waf, 귀하의 코드가 잘 작동합니다. 내 문제는 그것이 루프의 일부로 실행해야하고 그 때 내 버튼이 동결하고 아무것도 일어나지 않는 것입니다. –

+0

흠 이것은 적어도 uielements를 업데이트하지 않고 루프 내에서 작동하지 않습니다. 모든 것이 한 번에 실행됩니다. 또한 setNeedsLayout 및 setNeedsDisplay를 바로 호출하면 – Ixx

관련 문제