新增礼物动画的combo状态管理功能,优化用户状态判断逻辑,确保多用户并发送礼时动画正常显示。同时,添加状态通知机制以实现组件间通信,提升代码可维护性和用户体验。

This commit is contained in:
edwinQQQ
2025-08-28 16:33:38 +08:00
parent d4ac93adbb
commit 24a4e75fae
6 changed files with 315 additions and 75 deletions

View File

@@ -6,6 +6,7 @@
//
#import <Foundation/Foundation.h>
@class UIView;
@class GiftReceiveInfoModel;
NS_ASSUME_NONNULL_BEGIN
@@ -52,6 +53,13 @@ NS_ASSUME_NONNULL_BEGIN
- (void)enqueueGift:(GiftReceiveInfoModel *)giftInfo;
- (void)startGiftQueue;
- (void)stopGiftQueue;
// 🔧 新增Combo状态管理方法
- (void)setUserComboState:(BOOL)isCombo forUser:(NSString *)uid;
- (void)clearUserComboState:(NSString *)uid;
- (void)updateUserGiftTime:(NSString *)uid;
- (void)cleanupExpiredStates;
@end
NS_ASSUME_NONNULL_END

View File

@@ -20,6 +20,11 @@
@property (nonatomic, strong) GiftAnimationHelper *animationHelper;
// 🔧 Combo
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *userComboStates;
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSDate *> *userLastGiftTime;
@property (nonatomic, assign) NSTimeInterval comboTimeWindow;
@end
@implementation GiftAnimationManager
@@ -32,6 +37,11 @@
dispatch_source_cancel(_giftTimer);
_giftTimer = nil;
}
// 🔧 combo
[self cleanupExpiredStates];
[self.userComboStates removeAllObjects];
[self.userLastGiftTime removeAllObjects];
}
- (instancetype)initWithContainerView:(UIView *)containerView {
@@ -44,6 +54,11 @@
_comboAnimationDelay = 0.2;
_standardAnimationDelay = 0.3;
_queue = dispatch_queue_create("com.GiftAnimationManager.queue", DISPATCH_QUEUE_SERIAL);
// 🔧 Combo
_userComboStates = [NSMutableDictionary dictionary];
_userLastGiftTime = [NSMutableDictionary dictionary];
_comboTimeWindow = 2.0; // 2combo
}
return self;
}
@@ -245,8 +260,31 @@
// Helper methods
- (BOOL)shouldUseComboAnimationForSender:(NSString *)uid {
return [[GiftComboManager sharedManager] isActive] &&
[uid isEqualToString:[AccountInfoStorage instance].getUid];
if (!uid || uid.length == 0) {
return NO;
}
// 使
BOOL isUserInCombo = [self.userComboStates[uid] boolValue];
if (isUserInCombo) {
BOOL isCurrentUser = [uid isEqualToString:[AccountInfoStorage instance].getUid];
NSLog(@"[Combo effect] 🎯 用户 %@ 处于combo状态是否当前用户: %@", uid, isCurrentUser ? @"YES" : @"NO");
return isCurrentUser;
}
//
NSDate *lastGiftTime = self.userLastGiftTime[uid];
if (lastGiftTime) {
NSTimeInterval timeSinceLastGift = [[NSDate date] timeIntervalSinceDate:lastGiftTime];
if (timeSinceLastGift <= self.comboTimeWindow) {
BOOL isCurrentUser = [uid isEqualToString:[AccountInfoStorage instance].getUid];
NSLog(@"[Combo effect] 🎯 用户 %@ 在时间窗口内,是否当前用户: %@", uid, isCurrentUser ? @"YES" : @"NO");
return isCurrentUser;
}
}
NSLog(@"[Combo effect] 🎯 用户 %@ 不使用combo动画", uid);
return NO;
}
- (CGPoint)fallbackPointForEndPoint:(BOOL)isEndPoint {
@@ -268,4 +306,51 @@
KScreenHeight - kSafeAreaBottomHeight - kGetScaleWidth(140));
}
// 🔧 Combo
- (void)setUserComboState:(BOOL)isCombo forUser:(NSString *)uid {
if (!uid || uid.length == 0) {
NSLog(@"[Combo effect] ⚠️ 用户ID为空无法设置combo状态");
return;
}
if (isCombo) {
self.userComboStates[uid] = @(YES);
NSLog(@"[Combo effect] ✅ 设置用户 %@ 为combo状态", uid);
} else {
[self.userComboStates removeObjectForKey:uid];
NSLog(@"[Combo effect] 🔄 清除用户 %@ 的combo状态", uid);
}
}
- (void)clearUserComboState:(NSString *)uid {
[self setUserComboState:NO forUser:uid];
}
- (void)updateUserGiftTime:(NSString *)uid {
if (!uid || uid.length == 0) {
return;
}
self.userLastGiftTime[uid] = [NSDate date];
NSLog(@"[Combo effect] ⏰ 更新用户 %@ 的送礼时间", uid);
}
- (void)cleanupExpiredStates {
NSDate *now = [NSDate date];
NSMutableArray *expiredUsers = [NSMutableArray array];
[self.userLastGiftTime enumerateKeysAndObjectsUsingBlock:^(NSString *uid, NSDate *lastTime, BOOL *stop) {
if ([now timeIntervalSinceDate:lastTime] > self.comboTimeWindow * 2) {
[expiredUsers addObject:uid];
}
}];
for (NSString *uid in expiredUsers) {
[self.userLastGiftTime removeObjectForKey:uid];
[self.userComboStates removeObjectForKey:uid];
NSLog(@"[Combo effect] 🧹 清理过期用户状态: %@", uid);
}
}
@end

View File

@@ -374,6 +374,11 @@ BannerSchedulerDelegate
name:@"RoomTypeChanged"
object:nil];
// 🔧 combo
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleComboStateChanged:)
name:@"GiftComboStateChanged"
object:nil];
// 🎮
self.gameGestureManager = [[GameBannerGestureManager alloc] init];
@@ -1261,6 +1266,9 @@ BannerSchedulerDelegate
return;
}
// 🔧
[self.giftAnimationManager updateUserGiftTime:receiveInfo.uid];
GiftInfoModel *giftInfo = receiveInfo.gift;
if (attachment.second == Custom_Message_Sub_AllMicroLuckySend ||
attachment.second == Custom_Message_Sub_AllBatchMicroLuckySend ||
@@ -1299,9 +1307,7 @@ BannerSchedulerDelegate
if (receiveInfo.isHomeShow) {
return;
}
// combo
[[GiftComboManager sharedManager] receiveGiftInfoForDisplayComboFlags:receiveInfo
container:self];
@@ -4009,4 +4015,20 @@ BannerSchedulerDelegate
}
}
// 🔧 combo
- (void)handleComboStateChanged:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
NSString *uid = userInfo[@"uid"];
BOOL isCombo = [userInfo[@"isCombo"] boolValue];
NSLog(@"[Combo effect] 🔔 收到combo状态变化通知 - 用户: %@, 状态: %@", uid, isCombo ? @"YES" : @"NO");
// combo
if (isCombo) {
[self.giftAnimationManager setUserComboState:YES forUser:uid];
} else {
[self.giftAnimationManager clearUserComboState:uid];
}
}
@end