2013-10-18 19 views
9

Tôi đã cố gắng triển khai trình xử lý sự kiện trong trò chơi theo lượt để người chơi có thể nhận khi lượt của anh ấy hoạt động hoặc khi anh ấy được bạn bè mời. GKTurnBasedEventHandler không được chấp nhận trong IOS 7 và tôi đã đọc trong tài liệu hướng dẫn rằng tôi nên sử dụng GKLocalPlayerListener; nhưng đó là phần mở rộng của nó. Có ai đã sử dụng nó rồi, bởi vì không có thông tin nào ở đâu cả.Trung tâm trò chơi IOS GKLocalPlayerListener

Đây là những gì tôi đã thử trước đây, và nó không hoạt động.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
    [localPlayer authenticateWithCompletionHandler:^(NSError *error) 
    { 
     if (localPlayer.isAuthenticated) 
     { 
      GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
      [localPlayer registerListener:self]; 
     } 
    }]; 

    return YES; 
} 

-(void)handleInviteFromGameCenter:(NSArray *)playersToInvite 
{ 
    NSLog(@"test"); 
} 

- (void)player:(GKPlayer *)player receivedTurnEventForMatch:(GKTurnBasedMatch *)match didBecomeActive:(BOOL)didBecomeActive 
{ 
    NSLog(@"test"); 
} 
+0

bạn đã tìm ra hoặc tìm thấy bất kỳ điều gì khác về điều này? tôi đang gặp khó khăn khi tìm bất cứ điều gì về việc sử dụng GKLocalPlayerListener. tài liệu và các ví dụ có sẵn vẫn tận dụng các API không dùng nữa. – iksnae

+0

Chưa, một số công cụ khẩn cấp khác xuất hiện, nhưng nếu tôi làm tôi sẽ đăng giải pháp. – Macaret

+0

Nó hoạt động đối với tôi ở một mức độ nào đó. Các phương thức tương tự với các phương thức hiện không được chấp nhận, ngoại trừ việc trình phát hiện tại cũng được chuyển. Tuy nhiên, những gì tôi đang gặp phải là tìm ra thời điểm các trình lắng nghe bỏ/đăng ký lại, ví dụ: khi ứng dụng chuyển đổi giữa bg/fg. Đây cũng là một vấn đề đối với người nghe mời trong iOS 6. – Drux

Trả lời

2

Dưới đây là một số mã mà tôi sử dụng để đăng ký GKLocalPlayerListener

__weak GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { 
    if (viewController) { 
     [authenticateFromViewController presentViewController:viewController animated:YES completion:^{ 
      [localPlayer registerListener:self]; 
      NSLog(@"Authenticated. Registering Turn Based Events listener"); 
     }]; 
    } else if (localPlayer.authenticated) { 
     [localPlayer registerListener:self]; 
     NSLog(@"User Already Authenticated. Registering Turn Based Events listener"); 
    } else { 
     NSLog(@"Unable to Authenticate with Game Center: %@", [error localizedDescription]); 
    } 
}; 

Các trạng thái tài liệu mà bạn chỉ nên đăng ký cho một GKLocalPlayerEventListener một lần, do đó bạn có thể cải thiện mã này bằng cách kiểm tra nếu bạn đã đã đăng ký.

Lưu ý rằng authenticateWithCompletionHandler không còn được dùng trong iOS 6 và chúng khuyên bạn nên đặt thuộc tính authenticateHandler như tôi đã làm ở trên.

1

Tôi tin rằng bạn đã có mặt ở đó. Chỉ cần lần này làm một vài điều. Đảm bảo bạn không thêm nhiều người nghe trước khi thêm người nghe, chỉ cần hủy đăng ký tất cả người nghe.

Tôi đảm bảo rằng tôi chỉ thực hiện việc này một lần trong toàn bộ dự án của mình, nhưng tôi có được trình phát nội bộ nhiều lần.

-(void) onLocalPlayerAuthChanged:(GKLocalPlayer*)authPlayer { 

    [authPlayer unregisterAllListeners]; 
    [authPlayer registerListener:_Whatever_]; 

} 
1

Tôi có thể là một chút trễ, nhưng hy vọng nó sẽ giúp ai đó ngoài kia ...

Đây là những gì tôi làm. Theo số Apple's documentation Tôi tạo phương thức riêng của [my] hiển thị chế độ xem xác thực khi thích hợp cho ứng dụng [my].

- (void)authenticateLocalUser 
    { 
     if ([GKLocalPlayer localPlayer].authenticated == NO) { 
      __weak typeof(self) weakSelf = self; 
      __weak GKLocalPlayer *weakPlayer = [GKLocalPlayer localPlayer]; 

      weakPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { 
       if (viewController != nil) { 
        [weakSelf showAuthenticationDialogWhenReasonable:viewController]; 
       } else if (weakPlayer.isAuthenticated) { 
        // Player has been authenticated! 
        [weakPlayer registerListener:weakSelf]; 
       } else { 
        // Should disable Game Center? 
       } 
      }; 

     } else { 
      // Already authenticated 
      [[GKLocalPlayer localPlayer] registerListener:self]; 
     } 
    } 


    -(void)showAuthenticationDialogWhenReasonable:(UIViewController *)controller 
    { 
     [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:controller animated:YES completion:nil]; 
    } 

Mã này nằm trong một lớp trợ giúp đơn, có thể đơn giản nếu bạn có trong lớp học của riêng bạn.

+0

Cảm ơn bạn rất nhiều, nó đã được chờ đợi từ 15 giờ qua cho tôi, và chỉ cần ủy nhiệm đã được đề cập ở khắp mọi nơi, nhưng cú pháp chính xác không có sẵn. Và tôi thực sự chuyển đổi nó thành mục đích của riêng tôi. https://stackoverflow.com/questions/44889019/gkturnbasedeventlistener-could-not-be-set-to-delegate-of-my-viewcontroller –

Các vấn đề liên quan