新增礼物动画的combo状态管理功能,优化用户状态判断逻辑,确保多用户并发送礼时动画正常显示。同时,添加状态通知机制以实现组件间通信,提升代码可维护性和用户体验。
This commit is contained in:
@@ -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
|
||||
|
@@ -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; // 2秒combo窗口
|
||||
}
|
||||
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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user