Cocos2d iphone Cocos2d动画恢复

Cocos2d iphone Cocos2d动画恢复,cocos2d-iphone,in-app-purchase,freeze,Cocos2d Iphone,In App Purchase,Freeze,在ray教程之后,我在cocos2d中添加了iAP(但为了适应cocos2d做了一些更改),但在我完成一项交易后,控制台日志显示2013-08-19 16:32:12.626 Game[2483:907]Buying*product*。。。 2013-08-19 16:32:13.208游戏[2483:907]cocos2d:动画停止 2013-08-19 16:32:16.690比赛[2483:907]全场比赛。。。 2013-08-19 16:32:16.725游戏[2483:907]用户对

在ray教程之后,我在cocos2d中添加了iAP(但为了适应cocos2d做了一些更改),但在我完成一项交易后,控制台日志显示
2013-08-19 16:32:12.626 Game[2483:907]Buying*product*。。。
2013-08-19 16:32:13.208游戏[2483:907]cocos2d:动画停止
2013-08-19 16:32:16.690比赛[2483:907]全场比赛。。。
2013-08-19 16:32:16.725游戏[2483:907]用户对*产品*的默认值为是

所以我知道交易是有效的,但游戏永远不会恢复,它只是冻结。有没有办法在交易结束后恢复游戏<代码>[[CCDirector sharedDirector]resume]不起作用,因此我认为这可能与UIAlert视图有关。有什么帮助吗?这是我的iAPHelper.mm:

#import "IAPHelper.h"
#import <StoreKit/StoreKit.h>

NSString *const IAPHelperProductPurchasedNotification
@"IAPHelperProductPurchasedNotification";

@interface IAPHelper () <SKProductsRequestDelegate, SKPaymentTransactionObserver>
@end

@implementation IAPHelper {

SKProductsRequest * _productsRequest;

RequestProductsCompletionHandler _completionHandler;
NSSet * _productIdentifiers;
NSMutableSet * _purchasedProductIdentifiers;

}

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {

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

    // Store product identifiers
    _productIdentifiers = productIdentifiers;
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    // Check for previously purchased products
    _purchasedProductIdentifiers = [NSMutableSet set];
    for (NSString * productIdentifier in _productIdentifiers) {
        BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
        if (productPurchased) {
            [_purchasedProductIdentifiers addObject:productIdentifier];
            NSLog(@"Previously purchased: %@", productIdentifier);
        } else {
            NSLog(@"Not purchased: %@", productIdentifier);
        }
    }

}
return self;
}

- (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler {

_completionHandler = [completionHandler copy];

_productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers];
_productsRequest.delegate = self;
[_productsRequest start];

}

#pragma mark - SKProductsRequestDelegate

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

NSLog(@"Loaded list of products...");
_productsRequest = nil;

NSArray * skProducts = response.products;
for (SKProduct * skProduct in skProducts) {
    NSLog(@"Found product: %@ %@ %0.2f",
          skProduct.productIdentifier,
          skProduct.localizedTitle,
          skProduct.price.floatValue);
}

_completionHandler(YES, skProducts);
_completionHandler = nil;

}

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {

NSLog(@"Failed to load list of products.");
_productsRequest = nil;

_completionHandler(NO, nil);
_completionHandler = nil;

}

- (BOOL)productPurchased:(NSString *)productIdentifier {
return [_purchasedProductIdentifiers containsObject:productIdentifier];
}

- (void)buyProduct:(SKProduct *)product {

NSLog(@"Buying %@...", product.productIdentifier);

SKPayment * payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];

}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction * transaction in transactions) {
    switch (transaction.transactionState)
    {
        case SKPaymentTransactionStatePurchased:
            [self completeTransaction:transaction];
            break;
        case SKPaymentTransactionStateFailed:
            [self failedTransaction:transaction];
            break;
        case SKPaymentTransactionStateRestored:
            [self restoreTransaction:transaction];
        default:
            break;
    }
};
}

- (void)completeTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"completeTransaction...");

[self provideContentForProductIdentifier:transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
NSLog(@"restoreTransaction...");

[self provideContentForProductIdentifier:transaction.originalTransaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void)failedTransaction:(SKPaymentTransaction *)transaction {

NSLog(@"failedTransaction...");
if (transaction.error.code != SKErrorPaymentCancelled)
{
    NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
}

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

- (void)provideContentForProductIdentifier:(NSString *)productIdentifier {

[_purchasedProductIdentifiers addObject:productIdentifier];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:productIdentifier];
[[NSUserDefaults standardUserDefaults] synchronize];
[[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductPurchasedNotification object:productIdentifier userInfo:nil];
NSLog(@"User defaults for %@ are YES", productIdentifier);
}

- (void)restoreCompletedTransactions {
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

@end
#导入“IAPHelper.h”
#进口
NSString*const IAPHELPERPRODUCT PURCHASEDNNOTIATION
@“IAPHelperProductPurchasedNotification”;
@接口IAPHelper()
@结束
@IAPHelper的实现{
SKProductsRequest*\u productsRequest;
RequestProductsCompletionHandler\u completionHandler;
NSSet*\u产品标识符;
NSMutableSet*_purchasedProductIdentifiers;
}
-(id)initWithProductIdentifiers:(NSSet*)productIdentifiers{
if((self=[super init])){
//存储产品标识符
_productIdentifiers=productIdentifiers;
[[SKPaymentQueue defaultQueue]addTransactionObserver:self];
//检查以前购买的产品
_purchasedProductIdentifiers=[NSMutableSet];
for(NSString*productIdentifier在_productIdentifiers中){
BOOL productPurchased=[[NSUserDefaults standardUserDefaults]boolWorkey:productIdentifier];
如果(购买的产品){
[\u purchasedProductIdentifier addObject:productIdentifier];
NSLog(@“以前购买的:%@”,productIdentifier);
}否则{
NSLog(@“未购买:%@”,产品标识符);
}
}
}
回归自我;
}
-(void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler{
_completionHandler=[completionHandler副本];
_productsRequest=[[SKProductsRequest alloc]initWithProductIdentifiers:\u productIdentifiers];
_productsRequest.delegate=self;
[_productsrequeststart];
}
#pragma标记-SKProductsRequestDelegate
-(无效)产品请求:(SKProductsRequest*)请求DID接收方响应:(SKProductsResponse*)响应{
NSLog(@“已加载的产品列表…”);
_productsRequest=零;
NSArray*skProducts=response.products;
用于(SKProduct*SKProduct中的SKProduct){
NSLog(@“找到的产品:%@%@%0.2f”,
skProduct.productIdentifier,
skProduct.localizedTitle,
skProduct.price.floatValue);
}
_completionHandler(是,skProducts);
_completionHandler=nil;
}
-(无效)请求:(SKRequest*)请求失败错误:(NSError*)错误{
NSLog(@“未能加载产品列表”);
_productsRequest=零;
_completionHandler(否,无);
_completionHandler=nil;
}
-(BOOL)购买的产品:(NSString*)产品标识符{
return[_purchasedProductIdentifiercontainsObject:productIdentifier];
}
-(无效)购买产品:(SKProduct*)产品{
NSLog(@“购买%@…”,product.productIdentifier);
SKPayment*payment=[SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue]addPayment:payment];
}
-(void)paymentQueue:(SKPaymentQueue*)队列更新事务:(NSArray*)事务
{
用于(SKPaymentTransaction*交易中的交易){
开关(transaction.transactionState)
{
案例SKPaymentTransactionStatesPurchased:
[自完成交易:交易];
打破
案例SKPaymentTransactionState失败:
[自失效交易:交易];
打破
案例SKPaymentTransactionStateRestored:
[自恢复交易:交易];
违约:
打破
}
};
}
-(作废)CompletTransaction:(SKPaymentTransaction*)交易{
NSLog(@“completeTransaction…”);
[self ProviderContentForProductIdentifier:transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
}
-(无效)恢复交易:(SKPaymentTransaction*)交易{
NSLog(@“restoreTransaction…”);
[self ProviderContentForProductIdentifier:transaction.originalTransaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
}
-(无效)交易失败:(SKPaymentTransaction*)交易{
NSLog(@“传输失败…”);
if(transaction.error.code!=SKErrorPaymentCancelled)
{
NSLog(@“事务错误:%@”,Transaction.error.localizedDescription);
}
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
}
-(void)ProviderContentForProductIdentifier:(NSString*)productIdentifier{
[\u purchasedProductIdentifier addObject:productIdentifier];
[[NSUserDefaults standardUserDefaults]setBool:YES forKey:productIdentifier];
[[NSUserDefaults standardUserDefaults]同步];
[[NSNotificationCenter defaultCenter]postNotificationName:IAPHelperProductPurchasedNotification对象:productIdentifier用户信息:nil];
NSLog(@“用户对%@的默认设置为是”,productIdentifier);
}
-(作废)恢复已完成的交易{
[[SKPaymentQueue defaultQueue]恢复完成的事务];
}
@结束

在弹出警报视图之前,请尝试运行

  [[CCDirector sharedDirector] stopAnimation];
当您在alertview回调或事务完成运行中收到用户的响应时

  [[CCDirector sharedDirector] startAnimation];
Cocos通常不能很好地处理UIKit/Cocoa回调,因此您需要在它们执行任务时暂停渲染。当应用程序在应用程序代理中进入后台/前台时,我们有类似的行为

-(void) applicationDidEnterBackground:(UIApplication*)application {
    [[CCDirector sharedDirector] stopAnimation];
}

-(void) applicationWillEnterForeground:(UIApplication *)application {
    [[CCDirector sharedDirector] startAnimation];
}

-(void)applicationDidBecomeActive:(UIApplication *)application {
    [[CCDirector sharedDirector] resume];
}
似乎我们在ApplicationIDBecomeActive中使用resume。我想不起其中的全部逻辑,但这似乎适用于我们的许多项目