4

まず、私はホテルの部屋に座っている私のデッドアワーをコーディングしている航空会社のパイロットなので、無知を許してください。私はObjを使用してこのブラックジャックゲームを書いています。CとCocos2D。iOSの場合私の問題は次のとおりです。スタンドを押すと、コードが17に達するまでディーラーのカードを描画するようにします。なんとかそれを実行できましたが、ループに遅延を挿入するとすぐに機能しなくなります。私は次のような遅延を実装するために多くの方法を試しました:

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

すべてのボタンがフリーズします。また、実行アクションを使用してCCSequenceを試しました。スケジューラーやNSTimerなども試してみました。

これが私のコードです:

// 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++;

}

要約すると、合計が17になるまで呼び出しの間に2.0秒の遅延でこのメソッドを呼び出す条件付きループを実行しようとしています。

どんな助けでもありがたいです。

4

3 に答える 3

2
-(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]];
}
于 2013-03-25T12:02:16.090 に答える
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#>
});
于 2013-03-25T11:59:38.880 に答える
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
    });
于 2013-03-25T12:05:44.987 に答える