Pārlūkot izejas kodu

游戏逻辑 暂时提交

SuperC 1 gadu atpakaļ
vecāks
revīzija
db4c91c330
39 mainītis faili ar 2464 papildinājumiem un 0 dzēšanām
  1. BIN
      MiMoLive/.DS_Store
  2. 126 0
      MiMoLive/MiMoLive.xcodeproj/project.pbxproj
  3. BIN
      MiMoLive/MiMoLive.xcworkspace/xcuserdata/yanxuyao.xcuserdatad/UserInterfaceState.xcuserstate
  4. 8 0
      MiMoLive/MiMoLive/Classes/Base/Web/MOWebViewController.h
  5. 18 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVC.h
  6. 243 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVC.m
  7. 21 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVcReusableView.h
  8. 96 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVcReusableView.m
  9. 100 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVcReusableView.xib
  10. 29 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameItemCell.h
  11. 91 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameItemCell.m
  12. 11 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOEnterDataModels.h
  13. 25 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGame2.h
  14. 126 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGame2.m
  15. 21 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGameConfig.h
  16. 97 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGameConfig.m
  17. 23 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGameEnterData.h
  18. 112 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGameEnterData.m
  19. 23 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOSo88GM.h
  20. 111 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOSo88GM.m
  21. 20 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGameBaseData.h
  22. 115 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGameBaseData.m
  23. 9 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGameDataModels.h
  24. 23 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGamelist.h
  25. 110 0
      MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGamelist.m
  26. 29 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowCell.h
  27. 90 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowCell.m
  28. 25 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowView.h
  29. 235 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowView.m
  30. 98 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowView.xib
  31. 34 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOImageTitleBaseView.h
  32. 124 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOImageTitleBaseView.m
  33. 21 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOLiveGameCenterReusableView.h
  34. 85 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOLiveGameCenterReusableView.m
  35. 100 0
      MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOLiveGameCenterReusableView.xib
  36. 1 0
      MiMoLive/MiMoLive/Classes/Main/Manage/MOSvgaSourceManage.h
  37. 7 0
      MiMoLive/MiMoLive/Global/NetManager/MOAPIUrl.h
  38. 13 0
      MiMoLive/MiMoLive/Global/NetManager/MOHttpManager.h
  39. 44 0
      MiMoLive/MiMoLive/Global/NetManager/MOHttpManager.m

BIN
MiMoLive/.DS_Store


+ 126 - 0
MiMoLive/MiMoLive.xcodeproj/project.pbxproj

@@ -856,6 +856,22 @@
 		A6A8415F2C78700900CF546A /* MOVoiceSSView.m in Sources */ = {isa = PBXBuildFile; fileRef = A6A8415E2C78700900CF546A /* MOVoiceSSView.m */; };
 		A6A936902C6219CC000F0ABB /* MOSuperNumView.m in Sources */ = {isa = PBXBuildFile; fileRef = A6A9368F2C6219CC000F0ABB /* MOSuperNumView.m */; };
 		A6A936922C6219DD000F0ABB /* MOSuperNumView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A6A936912C6219DD000F0ABB /* MOSuperNumView.xib */; };
+		A6AAFD9A2CEDD8C5004C4D59 /* MOGameShowView.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFD912CEDD8C5004C4D59 /* MOGameShowView.m */; };
+		A6AAFD9B2CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFD922CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.m */; };
+		A6AAFD9C2CEDD8C5004C4D59 /* MOGameShowCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFD932CEDD8C5004C4D59 /* MOGameShowCell.m */; };
+		A6AAFD9D2CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A6AAFD952CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.xib */; };
+		A6AAFD9E2CEDD8C5004C4D59 /* MOImageTitleBaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFD962CEDD8C5004C4D59 /* MOImageTitleBaseView.m */; };
+		A6AAFD9F2CEDD8C5004C4D59 /* MOGameShowView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A6AAFD992CEDD8C5004C4D59 /* MOGameShowView.xib */; };
+		A6AAFDB82CEDD8E9004C4D59 /* MOGameCenterVcReusableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A6AAFDA22CEDD8E9004C4D59 /* MOGameCenterVcReusableView.xib */; };
+		A6AAFDB92CEDD8E9004C4D59 /* MOGameCenterVC.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFDA52CEDD8E9004C4D59 /* MOGameCenterVC.m */; };
+		A6AAFDBA2CEDD8E9004C4D59 /* MOGameBaseData.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFDA72CEDD8E9004C4D59 /* MOGameBaseData.m */; };
+		A6AAFDBB2CEDD8E9004C4D59 /* MOGame2.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFDAC2CEDD8E9004C4D59 /* MOGame2.m */; };
+		A6AAFDBC2CEDD8E9004C4D59 /* MOGameConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFDAD2CEDD8E9004C4D59 /* MOGameConfig.m */; };
+		A6AAFDBD2CEDD8E9004C4D59 /* MOGameEnterData.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFDB22CEDD8E9004C4D59 /* MOGameEnterData.m */; };
+		A6AAFDBE2CEDD8E9004C4D59 /* MOSo88GM.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFDB32CEDD8E9004C4D59 /* MOSo88GM.m */; };
+		A6AAFDBF2CEDD8E9004C4D59 /* MOGamelist.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFDB42CEDD8E9004C4D59 /* MOGamelist.m */; };
+		A6AAFDC02CEDD8E9004C4D59 /* MOGameCenterVcReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFDB62CEDD8E9004C4D59 /* MOGameCenterVcReusableView.m */; };
+		A6AAFDC12CEDD8E9004C4D59 /* MOGameItemCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A6AAFDB72CEDD8E9004C4D59 /* MOGameItemCell.m */; };
 		A6AB6C1C2AFBCF6700422B99 /* M_SenseME_Verify_p_3.118.0.1.model in Resources */ = {isa = PBXBuildFile; fileRef = A6AB6A2D2AFBCF6700422B99 /* M_SenseME_Verify_p_3.118.0.1.model */; };
 		A6AB6C1D2AFBCF6700422B99 /* M_SenseME_DogFace_p_2.0.0.1.model in Resources */ = {isa = PBXBuildFile; fileRef = A6AB6A2E2AFBCF6700422B99 /* M_SenseME_DogFace_p_2.0.0.1.model */; };
 		A6AB6C202AFBCF6700422B99 /* M_SenseME_Attribute_p_1.2.8.1.model in Resources */ = {isa = PBXBuildFile; fileRef = A6AB6A312AFBCF6700422B99 /* M_SenseME_Attribute_p_1.2.8.1.model */; };
@@ -2846,6 +2862,37 @@
 		A6A9368E2C6219CC000F0ABB /* MOSuperNumView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MOSuperNumView.h; sourceTree = "<group>"; };
 		A6A9368F2C6219CC000F0ABB /* MOSuperNumView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MOSuperNumView.m; sourceTree = "<group>"; };
 		A6A936912C6219DD000F0ABB /* MOSuperNumView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MOSuperNumView.xib; sourceTree = "<group>"; };
+		A6AAFD902CEDD8C5004C4D59 /* MOImageTitleBaseView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOImageTitleBaseView.h; sourceTree = "<group>"; };
+		A6AAFD912CEDD8C5004C4D59 /* MOGameShowView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGameShowView.m; sourceTree = "<group>"; };
+		A6AAFD922CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOLiveGameCenterReusableView.m; sourceTree = "<group>"; };
+		A6AAFD932CEDD8C5004C4D59 /* MOGameShowCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGameShowCell.m; sourceTree = "<group>"; };
+		A6AAFD942CEDD8C5004C4D59 /* MOGameShowView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGameShowView.h; sourceTree = "<group>"; };
+		A6AAFD952CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MOLiveGameCenterReusableView.xib; sourceTree = "<group>"; };
+		A6AAFD962CEDD8C5004C4D59 /* MOImageTitleBaseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOImageTitleBaseView.m; sourceTree = "<group>"; };
+		A6AAFD972CEDD8C5004C4D59 /* MOGameShowCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGameShowCell.h; sourceTree = "<group>"; };
+		A6AAFD982CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOLiveGameCenterReusableView.h; sourceTree = "<group>"; };
+		A6AAFD992CEDD8C5004C4D59 /* MOGameShowView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MOGameShowView.xib; sourceTree = "<group>"; };
+		A6AAFDA12CEDD8E9004C4D59 /* MOGameCenterVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGameCenterVC.h; sourceTree = "<group>"; };
+		A6AAFDA22CEDD8E9004C4D59 /* MOGameCenterVcReusableView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MOGameCenterVcReusableView.xib; sourceTree = "<group>"; };
+		A6AAFDA32CEDD8E9004C4D59 /* MOGameCenterVcReusableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGameCenterVcReusableView.h; sourceTree = "<group>"; };
+		A6AAFDA42CEDD8E9004C4D59 /* MOGameItemCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGameItemCell.h; sourceTree = "<group>"; };
+		A6AAFDA52CEDD8E9004C4D59 /* MOGameCenterVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGameCenterVC.m; sourceTree = "<group>"; };
+		A6AAFDA72CEDD8E9004C4D59 /* MOGameBaseData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGameBaseData.m; sourceTree = "<group>"; };
+		A6AAFDA82CEDD8E9004C4D59 /* MOGamelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGamelist.h; sourceTree = "<group>"; };
+		A6AAFDA92CEDD8E9004C4D59 /* MOGameDataModels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGameDataModels.h; sourceTree = "<group>"; };
+		A6AAFDAB2CEDD8E9004C4D59 /* MOEnterDataModels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOEnterDataModels.h; sourceTree = "<group>"; };
+		A6AAFDAC2CEDD8E9004C4D59 /* MOGame2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGame2.m; sourceTree = "<group>"; };
+		A6AAFDAD2CEDD8E9004C4D59 /* MOGameConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGameConfig.m; sourceTree = "<group>"; };
+		A6AAFDAE2CEDD8E9004C4D59 /* MOGameEnterData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGameEnterData.h; sourceTree = "<group>"; };
+		A6AAFDAF2CEDD8E9004C4D59 /* MOSo88GM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOSo88GM.h; sourceTree = "<group>"; };
+		A6AAFDB02CEDD8E9004C4D59 /* MOGameConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGameConfig.h; sourceTree = "<group>"; };
+		A6AAFDB12CEDD8E9004C4D59 /* MOGame2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGame2.h; sourceTree = "<group>"; };
+		A6AAFDB22CEDD8E9004C4D59 /* MOGameEnterData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGameEnterData.m; sourceTree = "<group>"; };
+		A6AAFDB32CEDD8E9004C4D59 /* MOSo88GM.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOSo88GM.m; sourceTree = "<group>"; };
+		A6AAFDB42CEDD8E9004C4D59 /* MOGamelist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGamelist.m; sourceTree = "<group>"; };
+		A6AAFDB52CEDD8E9004C4D59 /* MOGameBaseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MOGameBaseData.h; sourceTree = "<group>"; };
+		A6AAFDB62CEDD8E9004C4D59 /* MOGameCenterVcReusableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGameCenterVcReusableView.m; sourceTree = "<group>"; };
+		A6AAFDB72CEDD8E9004C4D59 /* MOGameItemCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MOGameItemCell.m; sourceTree = "<group>"; };
 		A6AB6A1D2AFBCF5D00422B99 /* model.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = model.bundle; sourceTree = "<group>"; };
 		A6AB6A232AFBCF6700422B99 /* st_mobile_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = st_mobile_common.h; sourceTree = "<group>"; };
 		A6AB6A242AFBCF6700422B99 /* st_mobile_animal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = st_mobile_animal.h; sourceTree = "<group>"; };
@@ -4222,6 +4269,7 @@
 		A60A0F3A2AD3E09A00421EA4 /* Classes */ = {
 			isa = PBXGroup;
 			children = (
+				A6AAFDA02CEDD8E9004C4D59 /* GameCenterVC */,
 				A601BEB42AD828FB0021CF03 /* Tools */,
 				A62477F02AD5360C000C2E10 /* Login */,
 				A60A0F3F2AD3E12800421EA4 /* Welcome */,
@@ -5636,6 +5684,7 @@
 		A65D42E02AFA0D69006523ED /* View */ = {
 			isa = PBXGroup;
 			children = (
+				A6AAFD8F2CEDD8C5004C4D59 /* MOGameShowView */,
 				A6014F7C2C64AE0E00E9A523 /* VoiceRoom */,
 				A60880752C381ACD00C950E3 /* TicketRoom */,
 				A6F3FBFE2C342C1800602D14 /* DiamondsWinner */,
@@ -7150,6 +7199,67 @@
 			path = UIView;
 			sourceTree = "<group>";
 		};
+		A6AAFD8F2CEDD8C5004C4D59 /* MOGameShowView */ = {
+			isa = PBXGroup;
+			children = (
+				A6AAFD942CEDD8C5004C4D59 /* MOGameShowView.h */,
+				A6AAFD912CEDD8C5004C4D59 /* MOGameShowView.m */,
+				A6AAFD992CEDD8C5004C4D59 /* MOGameShowView.xib */,
+				A6AAFD982CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.h */,
+				A6AAFD922CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.m */,
+				A6AAFD952CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.xib */,
+				A6AAFD972CEDD8C5004C4D59 /* MOGameShowCell.h */,
+				A6AAFD932CEDD8C5004C4D59 /* MOGameShowCell.m */,
+				A6AAFD902CEDD8C5004C4D59 /* MOImageTitleBaseView.h */,
+				A6AAFD962CEDD8C5004C4D59 /* MOImageTitleBaseView.m */,
+			);
+			path = MOGameShowView;
+			sourceTree = "<group>";
+		};
+		A6AAFDA02CEDD8E9004C4D59 /* GameCenterVC */ = {
+			isa = PBXGroup;
+			children = (
+				A6AAFDA62CEDD8E9004C4D59 /* Model */,
+				A6AAFDA12CEDD8E9004C4D59 /* MOGameCenterVC.h */,
+				A6AAFDA52CEDD8E9004C4D59 /* MOGameCenterVC.m */,
+				A6AAFDA32CEDD8E9004C4D59 /* MOGameCenterVcReusableView.h */,
+				A6AAFDB62CEDD8E9004C4D59 /* MOGameCenterVcReusableView.m */,
+				A6AAFDA22CEDD8E9004C4D59 /* MOGameCenterVcReusableView.xib */,
+				A6AAFDA42CEDD8E9004C4D59 /* MOGameItemCell.h */,
+				A6AAFDB72CEDD8E9004C4D59 /* MOGameItemCell.m */,
+			);
+			path = GameCenterVC;
+			sourceTree = "<group>";
+		};
+		A6AAFDA62CEDD8E9004C4D59 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				A6AAFDAA2CEDD8E9004C4D59 /* Enter */,
+				A6AAFDA92CEDD8E9004C4D59 /* MOGameDataModels.h */,
+				A6AAFDB52CEDD8E9004C4D59 /* MOGameBaseData.h */,
+				A6AAFDA72CEDD8E9004C4D59 /* MOGameBaseData.m */,
+				A6AAFDA82CEDD8E9004C4D59 /* MOGamelist.h */,
+				A6AAFDB42CEDD8E9004C4D59 /* MOGamelist.m */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		A6AAFDAA2CEDD8E9004C4D59 /* Enter */ = {
+			isa = PBXGroup;
+			children = (
+				A6AAFDAB2CEDD8E9004C4D59 /* MOEnterDataModels.h */,
+				A6AAFDAE2CEDD8E9004C4D59 /* MOGameEnterData.h */,
+				A6AAFDB22CEDD8E9004C4D59 /* MOGameEnterData.m */,
+				A6AAFDB12CEDD8E9004C4D59 /* MOGame2.h */,
+				A6AAFDAC2CEDD8E9004C4D59 /* MOGame2.m */,
+				A6AAFDAF2CEDD8E9004C4D59 /* MOSo88GM.h */,
+				A6AAFDB32CEDD8E9004C4D59 /* MOSo88GM.m */,
+				A6AAFDB02CEDD8E9004C4D59 /* MOGameConfig.h */,
+				A6AAFDAD2CEDD8E9004C4D59 /* MOGameConfig.m */,
+			);
+			path = Enter;
+			sourceTree = "<group>";
+		};
 		A6AB66302AFBCA2C00422B99 /* SenseLib */ = {
 			isa = PBXGroup;
 			children = (
@@ -9495,6 +9605,7 @@
 				A686EFBE2C0DA77C004FA294 /* MOAnchorTaskRuleView.xib in Resources */,
 				A6A2FB512BAAC4FC004A88C1 /* icon_live_sign_in.svga in Resources */,
 				A6A147412C9C2DE2005F7A6D /* MOHPMedalCollectionViewCell.xib in Resources */,
+				A6AAFD9D2CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.xib in Resources */,
 				A669B16E2C8F18730065EDD2 /* MOCongratulationsView.xib in Resources */,
 				A67908D92C0C507E001B73AE /* MOAchorTaskShowView.xib in Resources */,
 				A6C5630A2B6A34CB0068F266 /* MOWishRuleView.xib in Resources */,
@@ -9619,6 +9730,7 @@
 				A60C3D492B346E5600BCADA1 /* MOLiveIncomeCell.xib in Resources */,
 				A661229F2BF259EB00FC1CAD /* MOFanNameplateDisplayVC.xib in Resources */,
 				A6A63EA12AF394BF009ED032 /* MOFanClubSetCell.xib in Resources */,
+				A6AAFDB82CEDD8E9004C4D59 /* MOGameCenterVcReusableView.xib in Resources */,
 				A6716BF02B2C289D006735C7 /* MOPkMatchView.xib in Resources */,
 				A608FE232B26F4FF00CA7C81 /* MOLiveProportionalView.xib in Resources */,
 				A6F8CE5B2C353959003475BE /* MODiaWinView.xib in Resources */,
@@ -9658,6 +9770,7 @@
 				A67100762B18A74800511828 /* MORankListVC.xib in Resources */,
 				A6758E402BDE3AF500FA6017 /* MOLikeListView.xib in Resources */,
 				A6C1FB6C2AEE668F000908C9 /* MOAnchorApplicationVC.xib in Resources */,
+				A6AAFD9F2CEDD8C5004C4D59 /* MOGameShowView.xib in Resources */,
 				A6403D062B876DC4002D2BDD /* MOLivePkRuleView.xib in Resources */,
 				A6A08FA42B38254300ECE79D /* MOTheMedalVC.xib in Resources */,
 				A6733DAE2AF27B1F00F57852 /* MOIntroductionCell.xib in Resources */,
@@ -9961,6 +10074,7 @@
 				A6F0F52C2CD8A46A0047B965 /* EMMsgVideoBubbleView.m in Sources */,
 				A680E9AC2ADE73C800DDFEC3 /* UIView+JCAddition.m in Sources */,
 				A6999C7F2C90235B009AE37C /* MOFirstRechargeTableViewCell.m in Sources */,
+				A6AAFDBD2CEDD8E9004C4D59 /* MOGameEnterData.m in Sources */,
 				A6B3A8562C3EF790006BEAF2 /* MODrawOpenView.m in Sources */,
 				A6F0F5642CD8A46A0047B965 /* EaseGridCell.m in Sources */,
 				A62478022AD553EC000C2E10 /* POBaseStyleTableViewCell.m in Sources */,
@@ -10142,6 +10256,7 @@
 				A6272B5F2B0F4401006464EB /* UIView+YYText.m in Sources */,
 				A6E229A22B207FD50052C371 /* MOLiveEndView.m in Sources */,
 				A60A0F472AD3E59800421EA4 /* POLanguageVC.m in Sources */,
+				A6AAFDBF2CEDD8E9004C4D59 /* MOGamelist.m in Sources */,
 				A60040A82B0E1EE9000DC104 /* MOWishList.m in Sources */,
 				A6723BF02BD79CBB00665479 /* MOQualityVideoCell.m in Sources */,
 				A6D753852AD688DC00553091 /* Effects.m in Sources */,
@@ -10398,12 +10513,14 @@
 				A6AE56882B6BC0C600D3DA94 /* MOTopsUserView.m in Sources */,
 				A60963D22B5E8F9A009C9D4D /* MOFamilyContriCell.m in Sources */,
 				A6E74E8C2B0A33B6002076BD /* MOMemberTableView.m in Sources */,
+				A6AAFD9E2CEDD8C5004C4D59 /* MOImageTitleBaseView.m in Sources */,
 				A68E71D62B329DB800F6C623 /* MOPkWeUser.m in Sources */,
 				A6D753882AD688DC00553091 /* EffectsProcess.m in Sources */,
 				A6DAC8472B29E3F90064AFFD /* MOChooseTimeCell.m in Sources */,
 				A6272BFA2B0F78BB006464EB /* MOGiftCollectionView.m in Sources */,
 				A64DED2E2AE7A88600488471 /* MOContactEmptyCell.m in Sources */,
 				A6F0F5402CD8A46A0047B965 /* EMPickFileViewController.m in Sources */,
+				A6AAFD9C2CEDD8C5004C4D59 /* MOGameShowCell.m in Sources */,
 				A68C05532AE950820080F6EC /* MOGuildData.m in Sources */,
 				A62ED6242C6A40B00044DAC6 /* MOSeatBaseView.m in Sources */,
 				A6C429212AF7C5BC0026008E /* EMUserDataModel.m in Sources */,
@@ -10706,6 +10823,7 @@
 				A69559D12B1F0908003ADFA8 /* MOWishRecordCell.m in Sources */,
 				A60A0F3D2AD3E11000421EA4 /* MOBaseViewController.m in Sources */,
 				A6C1FB662AEE55C2000908C9 /* MOAnchorApplyVC.m in Sources */,
+				A6AAFDB92CEDD8E9004C4D59 /* MOGameCenterVC.m in Sources */,
 				A67908F92C0C794F001B73AE /* MOAnchorTaskTableView.m in Sources */,
 				A6F0F5802CD8A46A0047B965 /* EaseWebImageError.m in Sources */,
 				A63664902AF0FDB9002C0BFC /* MONameplateDisplayCell.m in Sources */,
@@ -10721,9 +10839,11 @@
 				A6073C832B4D8F4800AAAAD9 /* MOFamilyAuditCell.m in Sources */,
 				A698D9992C4F95F3007597D1 /* MOEMNoticeBaseView.m in Sources */,
 				A6014F902C64CD5B00E9A523 /* MOInviteTableView.m in Sources */,
+				A6AAFDBE2CEDD8E9004C4D59 /* MOSo88GM.m in Sources */,
 				A6A08DDF2B0DCF9400864707 /* MOLiveMenuView.m in Sources */,
 				A6A08FA32B38254300ECE79D /* MOTheMedalVC.m in Sources */,
 				A6B9183D2C21901B00B149EF /* MOMentionTextView.m in Sources */,
+				A6AAFDBC2CEDD8E9004C4D59 /* MOGameConfig.m in Sources */,
 				A61943F52AE507EC00D2878F /* MORecommendAnchorCell.m in Sources */,
 				A68638442C7C38AA00A7BF6F /* MOContributionListView.m in Sources */,
 				A69559D52B1F2E9E003ADFA8 /* MOLiveCenterView.m in Sources */,
@@ -10732,6 +10852,8 @@
 				A6C966C32B2EE9D300C0903B /* MOShopBaseData.m in Sources */,
 				A68B40DB2B3173170027D881 /* MOAnchorCenterInfoView.m in Sources */,
 				A6F0F5862CD8A46A0047B965 /* EaseImageHEICCoder.m in Sources */,
+				A6AAFD9A2CEDD8C5004C4D59 /* MOGameShowView.m in Sources */,
+				A6AAFDBB2CEDD8E9004C4D59 /* MOGame2.m in Sources */,
 				A608EBDC2AE6A9810092317D /* MOFriendListView.m in Sources */,
 				A62477EA2AD5314D000C2E10 /* BigBtn.m in Sources */,
 				A680E9BC2ADEBE9700DDFEC3 /* Reachability+More.m in Sources */,
@@ -10748,6 +10870,7 @@
 				A64A15642BB1C2DD004719CA /* MOPictureBrowser.m in Sources */,
 				A6FA69932B3C695B00E84AC0 /* MOGradeTipCell.m in Sources */,
 				A608EBA72AE64C990092317D /* MOModifyBirthdayVC.m in Sources */,
+				A6AAFDBA2CEDD8E9004C4D59 /* MOGameBaseData.m in Sources */,
 				A6D05D462C47B0260060014C /* MOUserSetData.m in Sources */,
 				A6F0F59F2CD8A46A0047B965 /* EaseWebImageTransition.m in Sources */,
 				A63317932B3AEFF1008DE717 /* MOPrivilegesItemInfo.m in Sources */,
@@ -10771,6 +10894,7 @@
 				A6FC21052B3D8C75001F4CC0 /* BarrageCanvas.m in Sources */,
 				A614852C2C737B2F00DDD3C7 /* MOGiftUserView.m in Sources */,
 				A6EDCA002B353E7E002CAC3C /* MOAnchorCenterHeadView.m in Sources */,
+				A6AAFDC12CEDD8E9004C4D59 /* MOGameItemCell.m in Sources */,
 				A696A0942B2B376000E98158 /* MOInvitePkCell.m in Sources */,
 				A6673B3C2B442AF2002566A7 /* LBInputAlertView.m in Sources */,
 				A6D7538D2AD688DC00553091 /* EFMotionManager.m in Sources */,
@@ -10781,10 +10905,12 @@
 				A6990F7E2B10B2BD00C8BDF1 /* MOStatusInfo.m in Sources */,
 				A6F0F5512CD8A46A0047B965 /* EaseConstraint.m in Sources */,
 				A609ED5B2BFCA4AA00368C86 /* MOBezierAnimationLab.m in Sources */,
+				A6AAFDC02CEDD8E9004C4D59 /* MOGameCenterVcReusableView.m in Sources */,
 				A6A08FCD2B39658600ECE79D /* TYCyclePagerView.m in Sources */,
 				A67908FC2C0C84B2001B73AE /* MOTaskEnterView.m in Sources */,
 				A66D74482B0C90820032FA23 /* MOWishListView.m in Sources */,
 				A6733D952AF2243700F57852 /* MOJoinFamilyListCell.m in Sources */,
+				A6AAFD9B2CEDD8C5004C4D59 /* MOLiveGameCenterReusableView.m in Sources */,
 				A669ADF22C662857003F3D75 /* MOApplicationTableViewCell.m in Sources */,
 				A68638502C7C8EC500A7BF6F /* MOYRippleView.m in Sources */,
 				A6CF8D572C1B1C4C00F59221 /* MORedPacketDTopView.m in Sources */,

BIN
MiMoLive/MiMoLive.xcworkspace/xcuserdata/yanxuyao.xcuserdatad/UserInterfaceState.xcuserstate


+ 8 - 0
MiMoLive/MiMoLive/Classes/Base/Web/MOWebViewController.h

@@ -14,6 +14,7 @@
 
 #import "MOBaseViewController.h"
 #import <WebKit/WebKit.h>
+#import "MOEnterDataModels.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -47,6 +48,13 @@ NS_ASSUME_NONNULL_BEGIN
 
 @property (nonatomic, assign) BOOL isFirstAdWeb;
 
+//进入基础类
+@property (nonatomic, strong) MOGameEnterData *enterBaseData;
+@property (nonatomic, strong) MOGame2 *game2Config;
+@property (nonatomic, assign) BOOL isGame;
+
+@property (nonatomic, assign) BOOL isMiniGame;
+
 @end
 
 NS_ASSUME_NONNULL_END

+ 18 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVC.h

@@ -0,0 +1,18 @@
+//
+//  MOGameCenterVC.h
+//  KoKoLive
+//
+//  Created by SuperC on 2024/4/29.
+//
+
+#import "MOBaseViewController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOGameCenterVC : MOBaseViewController
+
++ (NSString *)getCurrentLanguages;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 243 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVC.m

@@ -0,0 +1,243 @@
+//
+//  MOGameCenterVC.m
+//  KoKoLive
+//
+//  Created by SuperC on 2024/4/29.
+//
+
+#import "MOGameCenterVC.h"
+#import "MOGameItemCell.h"
+#import "MOWebViewController.h"
+#import "MOEnterDataModels.h"
+#import "MOGameCenterVcReusableView.h"
+
+@interface MOGameCenterVC ()<UICollectionViewDelegate,UICollectionViewDataSource>
+
+@property (nonatomic, strong) UIImageView *bgImgView;
+
+@property (nonatomic, strong) UICollectionView *collectionView;
+
+/** 数据源 */
+@property (nonatomic, strong) NSArray *dataArr;
+@property (nonatomic, strong) NSArray *headDataArr;
+/** 没有更多的数据视图 */
+@property (nonatomic, strong) MONoMoreDataView *noMoreDataView;
+
+@end
+
+@implementation MOGameCenterVC
+
+- (void)viewWillAppear:(BOOL)animated
+{
+    [super viewWillAppear:animated];
+    [self.navigationController setNavigationBarHidden:NO animated:animated];
+    
+    [self mo_setNavLeftItemWithImage:[UIImage imageNamed:@"icon_new_left_gray"] andBackgroundImg:[UIImage imageNamed:@"icon_mine_base_bg"]];
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+    self.navigationItem.title = NSLocalString(@"koko_game_center_title");
+    
+//    [self setNavLeftItemWithImage:[UIImage imageNamed:@"icon_nav_back"]];
+    
+    [self setupUI];
+    
+    [self getHttpData];
+}
+
+- (void)getHttpData{
+    WEAKSELF
+    [kHttpManager toGetGameListWithParams:nil andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
+        if(kCode_Success){
+            NSLog(@"%@",[[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding]);
+            MOGameBaseData *baseModel = [MOGameBaseData modelObjectWithDictionary:data[@"data"]];
+            NSArray *baseArr = [baseModel.gamelist copy];
+            if(baseArr.count > 5){
+                weakSelf.headDataArr = [baseArr subarrayWithRange:NSMakeRange(0, 5)];
+                weakSelf.dataArr = [baseArr subarrayWithRange:NSMakeRange(5, baseArr.count - 5)];
+            }
+            else{
+                weakSelf.headDataArr = [baseArr copy];
+                weakSelf.dataArr = [NSArray array];
+            }
+            [weakSelf.collectionView reloadData];
+            weakSelf.noMoreDataView.isHaveData = (baseArr.count > 0) ? YES : NO;
+        }
+        else{
+            kShowNetError(data)
+        }
+    }];
+}
+
+- (void)setupUI{
+    [self.view addSubview:self.bgImgView];
+    [self.bgImgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self.view);
+    }];
+    
+    NSArray *colorArr = @[[MOTools colorWithHexString:@"#EEF2FD" alpha:1.0],[MOTools colorWithHexString:@"#FAFAFC" alpha:1.0]];
+    UIImage *image = [MOTools createGradientRectImageWithBounds:CGRectMake(0, 0, SCREENWIDTH, (SCREENHEIGHT - NAV_BAR_HEIGHT)) Colors:colorArr GradientType:1];
+    [self.bgImgView setImage:image];
+    
+    [self.view addSubview:self.collectionView];
+    [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.left.equalTo(self.view).offset(22.0);
+        make.right.equalTo(self.view).offset(-22.0);
+        make.top.equalTo(self.view).offset(12.0);
+        make.bottom.equalTo(self.view);
+    }];
+    
+    self.collectionView.backgroundView = self.noMoreDataView;
+}
+
+#pragma mark UICollectionViewDelegate,UICollectionViewDataSource
+- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
+{
+    return 1;
+}
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
+{
+    return self.dataArr.count;
+}
+
+-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
+    MOGamelist *model = self.dataArr[indexPath.row];
+    MOGameItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:MOGameItemCell_ID forIndexPath:indexPath];
+    cell.cellModel = model;
+    return cell;
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    [collectionView deselectItemAtIndexPath:indexPath animated:YES];
+    MOGamelist *model = self.dataArr[indexPath.row];
+    
+    if(model.id.length == 0){
+        return;
+    }
+    
+    NSDictionary *dict = @{@"id":model.id};
+    [self toEnterGameWith:dict];
+    
+}
+
+- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
+{
+    if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
+        WEAKSELF
+        MOGameCenterVcReusableView *headView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:MOGameCenterVcReusableView_ID forIndexPath:indexPath];
+        headView.dataArr = self.headDataArr;
+        headView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            if(cellModel.id.length == 0){
+                return;
+            }
+            
+            NSString *getDefaultLan = [MOGameCenterVC getCurrentLanguages];
+            NSDictionary *dict = @{@"id":cellModel.id};
+            [weakSelf toEnterGameWith:dict];
+        };
+        return headView;
+    }
+    else{
+        UICollectionReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"sectionFoot" forIndexPath:indexPath];
+        return view;
+    }
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
+    CGFloat height = 318;
+    return CGSizeMake(SCREENWIDTH, height);
+}
+
+
+- (void)toEnterGameWith:(NSDictionary *)dict{
+    WEAKSELF
+    
+    [MBProgressHUD showActivityMessageInWindow:@""];
+    
+    [kHttpManager toEnterGameWithParams:dict andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
+        [MBProgressHUD hideHUD];
+        if(kCode_Success){
+            NSLog(@"%@",[[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding]);
+            
+            MOGameEnterData *baseData = [MOGameEnterData modelObjectWithDictionary:data[@"data"]];
+            if(baseData.result.length != 0){
+                MOWebViewController *vc = [[MOWebViewController alloc] init];
+                vc.enterBaseData = baseData;
+                vc.isGame = YES;
+                vc.game2Config = baseData.game2;
+                vc.webUrl = [NSURL URLWithString:baseData.result];
+                [weakSelf.navigationController pushViewController:vc animated:YES];
+            }
+        }
+        else{
+            kShowNetError(data)
+        }
+    }];
+}
+
++ (NSString *)getCurrentLanguages{
+    
+    NSString *defaultLanguageStr = @"en";
+    
+    NSArray *languages = [NSLocale preferredLanguages];
+    if(languages.count > 0){
+        NSString *languageStr = [languages firstObject];
+        if([languageStr hasPrefix:@"id"]){
+            defaultLanguageStr = @"id";
+        }
+        
+        if([languageStr hasPrefix:@"zh"] || [languageStr hasPrefix:@"tw"]){
+            defaultLanguageStr = @"tw";
+        }
+    }
+    
+    return defaultLanguageStr;
+}
+
+#pragma mark - Lazy
+- (UICollectionView *)collectionView
+{
+    if (!_collectionView)
+    {
+        UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
+        
+        CGFloat width = (SCREENWIDTH - 22.0 * 2 - 10.0 * 2.0) / 3.0;
+        CGFloat height = width + 16.0;
+        
+        flow.itemSize = CGSizeMake(width, height);
+        flow.minimumLineSpacing = 0.0;//行间距
+        flow.minimumInteritemSpacing = 10.0;//列间距
+        flow.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
+        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, SCREENWIDTH, 100) collectionViewLayout:flow];
+        _collectionView.backgroundColor = [UIColor clearColor];
+        _collectionView.dataSource = self;
+        _collectionView.delegate = self;
+        _collectionView.showsVerticalScrollIndicator = NO;
+        _collectionView.showsHorizontalScrollIndicator = NO;
+        [_collectionView registerClass:[MOGameItemCell class] forCellWithReuseIdentifier:MOGameItemCell_ID];
+        
+        [_collectionView registerNib:[UINib nibWithNibName:@"MOGameCenterVcReusableView" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:MOGameCenterVcReusableView_ID];
+        [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"sectionFoot"];
+    }
+    return _collectionView;
+}
+
+- (MONoMoreDataView *)noMoreDataView{
+    if(!_noMoreDataView){
+        _noMoreDataView = [MONoMoreDataView moNoMoreDataView];
+    }
+    return _noMoreDataView;
+}
+
+- (UIImageView *)bgImgView{
+    if(!_bgImgView){
+        _bgImgView = [[UIImageView alloc] init];
+    }
+    return _bgImgView;
+}
+
+@end

+ 21 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVcReusableView.h

@@ -0,0 +1,21 @@
+//
+//  MOGameCenterVcReusableView.h
+//  KoKoLive
+//
+//  Created by SuperC on 2024/9/6.
+//
+
+#define MOGameCenterVcReusableView_ID @"MOGameCenterVcReusableView_ID"
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOGameCenterVcReusableView : UICollectionReusableView
+
+@property (nonatomic, strong) NSArray *dataArr;
+@property (nonatomic, copy) void (^viewClickBlock)(MOGamelist *cellModel);
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 96 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVcReusableView.m

@@ -0,0 +1,96 @@
+//
+//  MOGameCenterVcReusableView.m
+//  KoKoLive
+//
+//  Created by SuperC on 2024/9/6.
+//
+
+#import "MOGameCenterVcReusableView.h"
+#import "MOImageTitleBaseView.h"
+
+@interface MOGameCenterVcReusableView ()
+
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *firstIconView;
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *secondIconView;
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *thirdIconView;
+
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *fourIconView;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint *fourIconViewHeight;
+
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *fiveIconView;
+
+@end
+
+@implementation MOGameCenterVcReusableView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (void)setDataArr:(NSArray *)dataArr{
+    _dataArr = dataArr;
+    
+    WEAKSELF
+    if(dataArr.count >= 1){
+        self.firstIconView.cellModel = dataArr[0];
+        self.firstIconView.titleFont = [MOTextTools getTheFontWithSize:12.0 AndFontName:@"Humnst777 BlkCn BT"];
+        self.firstIconView.titleColor = [MOTools colorWithHexString:@"#737373" alpha:1.0];
+        self.firstIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.firstIconView noDataShow];
+    }
+    
+    if(dataArr.count >= 2){
+        self.secondIconView.cellModel = dataArr[1];
+        self.secondIconView.titleFont = [MOTextTools getTheFontWithSize:12.0 AndFontName:@"Humnst777 BlkCn BT"];
+        self.secondIconView.titleColor = [MOTools colorWithHexString:@"#737373" alpha:1.0];
+        self.secondIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.secondIconView noDataShow];
+    }
+    
+    if(dataArr.count >= 3){
+        self.thirdIconView.cellModel = dataArr[2];
+        self.thirdIconView.titleFont = [MOTextTools getTheFontWithSize:12.0 AndFontName:@"Humnst777 BlkCn BT"];
+        self.thirdIconView.titleColor = [MOTools colorWithHexString:@"#737373" alpha:1.0];
+        self.thirdIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.thirdIconView noDataShow];
+    }
+    
+    if(dataArr.count >= 4){
+        self.fourIconView.cellModel = dataArr[3];
+        self.fourIconView.titleFont = [MOTextTools getTheFontWithSize:12.0 AndFontName:@"Humnst777 BlkCn BT"];
+        self.fourIconView.titleColor = [MOTools colorWithHexString:@"#737373" alpha:1.0];
+        self.fourIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.fourIconView noDataShow];
+    }
+    
+    if(dataArr.count >= 5){
+        self.fiveIconView.cellModel = dataArr[4];
+        self.fiveIconView.titleFont = [MOTextTools getTheFontWithSize:12.0 AndFontName:@"Humnst777 BlkCn BT"];
+        self.fiveIconView.titleColor = [MOTools colorWithHexString:@"#737373" alpha:1.0];
+        self.fiveIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.fiveIconView noDataShow];
+    }
+}
+
+@end

+ 100 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameCenterVcReusableView.xib

@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <collectionReusableView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="U6b-Vx-4bR" customClass="MOGameCenterVcReusableView">
+            <rect key="frame" x="0.0" y="0.0" width="365" height="281"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="DM5-y8-hcd">
+                    <rect key="frame" x="0.0" y="0.0" width="365" height="281"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="I6Z-qE-z6u">
+                            <rect key="frame" x="0.0" y="0.0" width="177.66666666666666" height="281"/>
+                            <subviews>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Qvg-oj-QRR" customClass="MOImageTitleBaseView">
+                                    <rect key="frame" x="0.0" y="0.0" width="177.66666666666666" height="175"/>
+                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                </view>
+                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iK5-h4-yrG" customClass="MOImageTitleBaseView">
+                                    <rect key="frame" x="0.0" y="175" width="177.66666666666666" height="106"/>
+                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="106" id="bRK-wH-T9H"/>
+                                    </constraints>
+                                </view>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="Qvg-oj-QRR" secondAttribute="trailing" id="E2L-Ud-8IB"/>
+                                <constraint firstAttribute="trailing" secondItem="iK5-h4-yrG" secondAttribute="trailing" id="FI1-oz-APN"/>
+                                <constraint firstItem="Qvg-oj-QRR" firstAttribute="leading" secondItem="I6Z-qE-z6u" secondAttribute="leading" id="OIH-Kl-ibY"/>
+                                <constraint firstAttribute="bottom" secondItem="iK5-h4-yrG" secondAttribute="bottom" id="WH5-k3-p9x"/>
+                                <constraint firstItem="iK5-h4-yrG" firstAttribute="top" secondItem="Qvg-oj-QRR" secondAttribute="bottom" id="asr-Wa-ISB"/>
+                                <constraint firstItem="iK5-h4-yrG" firstAttribute="leading" secondItem="I6Z-qE-z6u" secondAttribute="leading" id="foi-tw-I7m"/>
+                                <constraint firstItem="Qvg-oj-QRR" firstAttribute="top" secondItem="I6Z-qE-z6u" secondAttribute="top" id="oQc-Rh-WiO"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6d1-9K-wJI">
+                            <rect key="frame" x="187.66666666666663" y="0.0" width="177.33333333333337" height="281"/>
+                            <subviews>
+                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="qUk-zy-2wa">
+                                    <rect key="frame" x="0.0" y="0.0" width="177.33333333333334" height="281"/>
+                                    <subviews>
+                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Htg-QZ-jfj" customClass="MOImageTitleBaseView">
+                                            <rect key="frame" x="0.0" y="0.0" width="177.33333333333334" height="93.666666666666671"/>
+                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                        </view>
+                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4xL-FC-HmK" customClass="MOImageTitleBaseView">
+                                            <rect key="frame" x="0.0" y="93.666666666666657" width="177.33333333333334" height="93.666666666666657"/>
+                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                        </view>
+                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xgN-0E-k2o" customClass="MOImageTitleBaseView">
+                                            <rect key="frame" x="0.0" y="187.33333333333334" width="177.33333333333334" height="93.666666666666657"/>
+                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                        </view>
+                                    </subviews>
+                                </stackView>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstItem="qUk-zy-2wa" firstAttribute="leading" secondItem="6d1-9K-wJI" secondAttribute="leading" id="IaR-vK-Pf1"/>
+                                <constraint firstAttribute="bottom" secondItem="qUk-zy-2wa" secondAttribute="bottom" id="Vco-mT-PNi"/>
+                                <constraint firstItem="qUk-zy-2wa" firstAttribute="top" secondItem="6d1-9K-wJI" secondAttribute="top" id="cB3-Gk-UfH"/>
+                                <constraint firstAttribute="trailing" secondItem="qUk-zy-2wa" secondAttribute="trailing" id="txc-Ws-gAW"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                </stackView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="DM5-y8-hcd" firstAttribute="leading" secondItem="U6b-Vx-4bR" secondAttribute="leading" id="23Z-Rr-oZS"/>
+                <constraint firstItem="DM5-y8-hcd" firstAttribute="top" secondItem="U6b-Vx-4bR" secondAttribute="top" id="Pmh-f5-Jlr"/>
+                <constraint firstAttribute="trailing" secondItem="DM5-y8-hcd" secondAttribute="trailing" id="R5T-w1-UYS"/>
+                <constraint firstAttribute="bottom" secondItem="DM5-y8-hcd" secondAttribute="bottom" id="ah4-h9-EHk"/>
+            </constraints>
+            <connections>
+                <outlet property="firstIconView" destination="Qvg-oj-QRR" id="dub-vg-s3x"/>
+                <outlet property="fiveIconView" destination="xgN-0E-k2o" id="zEz-Hi-4Ki"/>
+                <outlet property="fourIconView" destination="iK5-h4-yrG" id="Ha3-24-mzt"/>
+                <outlet property="fourIconViewHeight" destination="bRK-wH-T9H" id="Zs3-bX-rJw"/>
+                <outlet property="secondIconView" destination="Htg-QZ-jfj" id="rr8-TB-PX3"/>
+                <outlet property="thirdIconView" destination="4xL-FC-HmK" id="gjT-Ba-yTj"/>
+            </connections>
+            <point key="canvasLocation" x="164.12213740458014" y="68.661971830985919"/>
+        </collectionReusableView>
+    </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 29 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameItemCell.h

@@ -0,0 +1,29 @@
+//
+//  MOGameItemCell.h
+//  KoKoLive
+//
+//  Created by SuperC on 2024/4/29.
+//
+
+#import <UIKit/UIKit.h>
+#import "MOGameDataModels.h"
+
+#define MOGameItemCell_ID @"MOGameItemCell_ID"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOGameItemCell : UICollectionViewCell
+
+/** 背景 */
+@property (nonatomic, strong) UIView *bgView;
+
+@property (nonatomic, strong) UIImageView *iconImgView;
+
+/** 标题 */
+@property (nonatomic, strong) UILabel *titleLab;
+
+@property (nonatomic, strong) MOGamelist *cellModel;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 91 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/MOGameItemCell.m

@@ -0,0 +1,91 @@
+//
+//  MOGameItemCell.m
+//  KoKoLive
+//
+//  Created by SuperC on 2024/4/29.
+//
+
+#import "MOGameItemCell.h"
+
+@implementation MOGameItemCell
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+    if (self = [super initWithFrame:frame])
+    {
+        self.backgroundColor = [UIColor clearColor];
+        [self setupUI];
+    }
+    return self;
+}
+
+- (void)setupUI{
+    [self.contentView addSubview:self.bgView];
+    [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self.contentView);
+    }];
+    self.bgView.layer.cornerRadius = 6.0;
+    self.bgView.layer.masksToBounds = YES;
+    
+    [self.bgView addSubview:self.titleLab];
+    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.equalTo(self.bgView).offset(0.0);
+        make.left.equalTo(self.bgView).offset(3.0);
+        make.right.equalTo(self.bgView).offset(-3.0);
+        make.height.equalTo(@12.0);
+    }];
+    
+    [self.bgView addSubview:self.iconImgView];
+    [self.iconImgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.equalTo(self.titleLab.mas_top).offset(0.0);
+        make.left.right.top.equalTo(self.bgView);
+    }];
+    self.iconImgView.layer.cornerRadius = 16.0;
+    self.iconImgView.layer.masksToBounds = YES;
+}
+
+- (void)setCellModel:(MOGamelist *)cellModel{
+    _cellModel = cellModel;
+    
+    [self.iconImgView sd_setImageWithURL:[NSURL URLWithString:cellModel.icon]];
+    self.titleLab.text = cellModel.name;
+}
+
+#pragma mark - Lazy
+- (UIView *)bgView
+{
+    if (_bgView == nil)
+    {
+        _bgView = [UIView new];
+        _bgView.backgroundColor = [UIColor clearColor];
+    }
+    return _bgView;
+}
+
+- (UIImageView *)iconImgView{
+    if (!_iconImgView)
+    {
+        _iconImgView = [[UIImageView alloc] init];
+        _iconImgView.clipsToBounds = YES;
+        _iconImgView.userInteractionEnabled = NO;
+        _iconImgView.contentMode = UIViewContentModeScaleAspectFill;
+    }
+    return _iconImgView;
+}
+
+- (UILabel *)titleLab
+{
+    if(!_titleLab)
+    {
+        _titleLab = [UILabel new];
+        _titleLab.textColor = UIColorFromHex(0x737373);
+        _titleLab.textAlignment = NSTextAlignmentCenter;
+        _titleLab.font = [MOTextTools getTheFontWithSize:12.0 AndFontName:@"Humnst777 BlkCn BT"];
+        _titleLab.backgroundColor = [UIColor clearColor];
+    }
+    return _titleLab;
+}
+
+
+
+@end

+ 11 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOEnterDataModels.h

@@ -0,0 +1,11 @@
+//
+//  DataModels.h
+//
+//  Created by SuperCabbage  on 2024/5/15
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "MOGame2.h"
+#import "MOGameEnterData.h"
+#import "MOGameConfig.h"
+#import "MOSo88GM.h"

+ 25 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGame2.h

@@ -0,0 +1,25 @@
+//
+//  MOGame2.h
+//
+//  Created by SuperCabbage  on 2024/5/15
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class MOGameConfig;
+
+@interface MOGame2 : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *appId;
+@property (nonatomic, assign) double gsp;
+@property (nonatomic, strong) NSString *code;
+@property (nonatomic, strong) NSString *appChannel;
+@property (nonatomic, strong) NSString *userId;
+@property (nonatomic, strong) MOGameConfig *gameConfig;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 126 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGame2.m

@@ -0,0 +1,126 @@
+//
+//  MOGame2.m
+//
+//  Created by SuperCabbage  on 2024/5/15
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "MOGame2.h"
+#import "MOGameConfig.h"
+
+
+NSString *const kMOGame2AppId = @"appId";
+NSString *const kMOGame2Gsp = @"gsp";
+NSString *const kMOGame2Code = @"code";
+NSString *const kMOGame2AppChannel = @"appChannel";
+NSString *const kMOGame2UserId = @"userId";
+NSString *const kMOGame2GameConfig = @"gameConfig";
+
+
+@interface MOGame2 ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation MOGame2
+
+@synthesize appId = _appId;
+@synthesize gsp = _gsp;
+@synthesize code = _code;
+@synthesize appChannel = _appChannel;
+@synthesize userId = _userId;
+@synthesize gameConfig = _gameConfig;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict {
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict {
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if (self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.appId = [self objectOrNilForKey:kMOGame2AppId fromDictionary:dict];
+            self.gsp = [[self objectOrNilForKey:kMOGame2Gsp fromDictionary:dict] doubleValue];
+            self.code = [self objectOrNilForKey:kMOGame2Code fromDictionary:dict];
+            self.appChannel = [self objectOrNilForKey:kMOGame2AppChannel fromDictionary:dict];
+            self.userId = [self objectOrNilForKey:kMOGame2UserId fromDictionary:dict];
+            self.gameConfig = [MOGameConfig modelObjectWithDictionary:[dict objectForKey:kMOGame2GameConfig]];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation {
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.appId forKey:kMOGame2AppId];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.gsp] forKey:kMOGame2Gsp];
+    [mutableDict setValue:self.code forKey:kMOGame2Code];
+    [mutableDict setValue:self.appChannel forKey:kMOGame2AppChannel];
+    [mutableDict setValue:self.userId forKey:kMOGame2UserId];
+    [mutableDict setValue:[self.gameConfig dictionaryRepresentation] forKey:kMOGame2GameConfig];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description  {
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict {
+    id object = [dict objectForKey:aKey];
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder {
+    self = [super init];
+
+    self.appId = [aDecoder decodeObjectForKey:kMOGame2AppId];
+    self.gsp = [aDecoder decodeDoubleForKey:kMOGame2Gsp];
+    self.code = [aDecoder decodeObjectForKey:kMOGame2Code];
+    self.appChannel = [aDecoder decodeObjectForKey:kMOGame2AppChannel];
+    self.userId = [aDecoder decodeObjectForKey:kMOGame2UserId];
+    self.gameConfig = [aDecoder decodeObjectForKey:kMOGame2GameConfig];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_appId forKey:kMOGame2AppId];
+    [aCoder encodeDouble:_gsp forKey:kMOGame2Gsp];
+    [aCoder encodeObject:_code forKey:kMOGame2Code];
+    [aCoder encodeObject:_appChannel forKey:kMOGame2AppChannel];
+    [aCoder encodeObject:_userId forKey:kMOGame2UserId];
+    [aCoder encodeObject:_gameConfig forKey:kMOGame2GameConfig];
+}
+
+- (id)copyWithZone:(NSZone *)zone {
+    MOGame2 *copy = [[MOGame2 alloc] init];
+    
+    
+    
+    if (copy) {
+
+        copy.appId = [self.appId copyWithZone:zone];
+        copy.gsp = self.gsp;
+        copy.code = [self.code copyWithZone:zone];
+        copy.appChannel = [self.appChannel copyWithZone:zone];
+        copy.userId = [self.userId copyWithZone:zone];
+        copy.gameConfig = [self.gameConfig copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 21 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGameConfig.h

@@ -0,0 +1,21 @@
+//
+//  MOGameConfig.h
+//
+//  Created by SuperCabbage  on 2024/5/15
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface MOGameConfig : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, assign) double sceneMode;
+@property (nonatomic, strong) NSString *currencyIcon;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 97 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGameConfig.m

@@ -0,0 +1,97 @@
+//
+//  MOGameConfig.m
+//
+//  Created by SuperCabbage  on 2024/5/15
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "MOGameConfig.h"
+
+
+NSString *const kMOGameConfigSceneMode = @"sceneMode";
+NSString *const kMOGameConfigCurrencyIcon = @"currencyIcon";
+
+
+@interface MOGameConfig ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation MOGameConfig
+
+@synthesize sceneMode = _sceneMode;
+@synthesize currencyIcon = _currencyIcon;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict {
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict {
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if (self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.sceneMode = [[self objectOrNilForKey:kMOGameConfigSceneMode fromDictionary:dict] doubleValue];
+            self.currencyIcon = [self objectOrNilForKey:kMOGameConfigCurrencyIcon fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation {
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.sceneMode] forKey:kMOGameConfigSceneMode];
+    [mutableDict setValue:self.currencyIcon forKey:kMOGameConfigCurrencyIcon];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description  {
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict {
+    id object = [dict objectForKey:aKey];
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder {
+    self = [super init];
+
+    self.sceneMode = [aDecoder decodeDoubleForKey:kMOGameConfigSceneMode];
+    self.currencyIcon = [aDecoder decodeObjectForKey:kMOGameConfigCurrencyIcon];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeDouble:_sceneMode forKey:kMOGameConfigSceneMode];
+    [aCoder encodeObject:_currencyIcon forKey:kMOGameConfigCurrencyIcon];
+}
+
+- (id)copyWithZone:(NSZone *)zone {
+    MOGameConfig *copy = [[MOGameConfig alloc] init];
+    
+    
+    
+    if (copy) {
+
+        copy.sceneMode = self.sceneMode;
+        copy.currencyIcon = [self.currencyIcon copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 23 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGameEnterData.h

@@ -0,0 +1,23 @@
+//
+//  MOGameEnterData.h
+//
+//  Created by SuperCabbage  on 2024/5/15
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class MOGame2,MOSo88GM;
+
+@interface MOGameEnterData : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *result;
+@property (nonatomic, assign) double type;//游戏类型(1=网页打开,2=BaiShun,3=So88)
+@property (nonatomic, strong) MOGame2 *game2;
+@property (nonatomic, strong) MOSo88GM *so88GM;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 112 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOGameEnterData.m

@@ -0,0 +1,112 @@
+//
+//  MOGameEnterData.m
+//
+//  Created by SuperCabbage  on 2024/5/15
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "MOGameEnterData.h"
+#import "MOGame2.h"
+#import "MOSo88GM.h"
+
+NSString *const kMOGameEnterDataResult = @"result";
+NSString *const kMOGameEnterDataType = @"type";
+NSString *const kMOGameEnterDataGame2 = @"game2";
+NSString *const kMOGameEnterDataSo88GM = @"so88";
+
+
+@interface MOGameEnterData ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation MOGameEnterData
+
+@synthesize result = _result;
+@synthesize type = _type;
+@synthesize game2 = _game2;
+@synthesize so88GM = _so88GM;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict {
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict {
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if (self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.result = [self objectOrNilForKey:kMOGameEnterDataResult fromDictionary:dict];
+            self.type = [[self objectOrNilForKey:kMOGameEnterDataType fromDictionary:dict] doubleValue];
+            self.game2 = [MOGame2 modelObjectWithDictionary:[dict objectForKey:kMOGameEnterDataGame2]];
+        self.so88GM = [MOSo88GM modelObjectWithDictionary:[dict objectForKey:kMOGameEnterDataSo88GM]];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation {
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.result forKey:kMOGameEnterDataResult];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.type] forKey:kMOGameEnterDataType];
+    [mutableDict setValue:[self.game2 dictionaryRepresentation] forKey:kMOGameEnterDataGame2];
+    [mutableDict setValue:[self.so88GM dictionaryRepresentation] forKey:kMOGameEnterDataSo88GM];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description  {
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict {
+    id object = [dict objectForKey:aKey];
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder {
+    self = [super init];
+
+    self.result = [aDecoder decodeObjectForKey:kMOGameEnterDataResult];
+    self.type = [aDecoder decodeDoubleForKey:kMOGameEnterDataType];
+    self.game2 = [aDecoder decodeObjectForKey:kMOGameEnterDataGame2];
+    self.so88GM = [aDecoder decodeObjectForKey:kMOGameEnterDataSo88GM];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_result forKey:kMOGameEnterDataResult];
+    [aCoder encodeDouble:_type forKey:kMOGameEnterDataType];
+    [aCoder encodeObject:_game2 forKey:kMOGameEnterDataGame2];
+    [aCoder encodeObject:_so88GM forKey:kMOGameEnterDataSo88GM];
+}
+
+- (id)copyWithZone:(NSZone *)zone {
+    MOGameEnterData *copy = [[MOGameEnterData alloc] init];
+    
+    
+    
+    if (copy) {
+
+        copy.result = [self.result copyWithZone:zone];
+        copy.type = self.type;
+        copy.game2 = [self.game2 copyWithZone:zone];
+        copy.so88GM = [self.so88GM copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 23 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOSo88GM.h

@@ -0,0 +1,23 @@
+//
+//  MOSo88GM.h
+//
+//  Created by SuperCabbage  on 2024/11/19
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface MOSo88GM : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, assign) double appId;
+@property (nonatomic, strong) NSString *code;
+@property (nonatomic, assign) double gameId;
+@property (nonatomic, strong) NSString *userId;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 111 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/Enter/MOSo88GM.m

@@ -0,0 +1,111 @@
+//
+//  MOSo88GM.m
+//
+//  Created by SuperCabbage  on 2024/11/19
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "MOSo88GM.h"
+
+
+NSString *const kMOSo88GMAppId = @"appId";
+NSString *const kMOSo88GMCode = @"code";
+NSString *const kMOSo88GMGameId = @"gameId";
+NSString *const kMOSo88GMUserId = @"userId";
+
+
+@interface MOSo88GM ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation MOSo88GM
+
+@synthesize appId = _appId;
+@synthesize code = _code;
+@synthesize gameId = _gameId;
+@synthesize userId = _userId;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict {
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict {
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if (self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.appId = [[self objectOrNilForKey:kMOSo88GMAppId fromDictionary:dict] doubleValue];
+            self.code = [self objectOrNilForKey:kMOSo88GMCode fromDictionary:dict];
+            self.gameId = [[self objectOrNilForKey:kMOSo88GMGameId fromDictionary:dict] doubleValue];
+            self.userId = [self objectOrNilForKey:kMOSo88GMUserId fromDictionary:dict];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation {
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.appId] forKey:kMOSo88GMAppId];
+    [mutableDict setValue:self.code forKey:kMOSo88GMCode];
+    [mutableDict setValue:[NSNumber numberWithDouble:self.gameId] forKey:kMOSo88GMGameId];
+    [mutableDict setValue:self.userId forKey:kMOSo88GMUserId];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description  {
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict {
+    id object = [dict objectForKey:aKey];
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder {
+    self = [super init];
+
+    self.appId = [aDecoder decodeDoubleForKey:kMOSo88GMAppId];
+    self.code = [aDecoder decodeObjectForKey:kMOSo88GMCode];
+    self.gameId = [aDecoder decodeDoubleForKey:kMOSo88GMGameId];
+    self.userId = [aDecoder decodeObjectForKey:kMOSo88GMUserId];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeDouble:_appId forKey:kMOSo88GMAppId];
+    [aCoder encodeObject:_code forKey:kMOSo88GMCode];
+    [aCoder encodeDouble:_gameId forKey:kMOSo88GMGameId];
+    [aCoder encodeObject:_userId forKey:kMOSo88GMUserId];
+}
+
+- (id)copyWithZone:(NSZone *)zone {
+    MOSo88GM *copy = [[MOSo88GM alloc] init];
+    
+    
+    
+    if (copy) {
+
+        copy.appId = self.appId;
+        copy.code = [self.code copyWithZone:zone];
+        copy.gameId = self.gameId;
+        copy.userId = [self.userId copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 20 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGameBaseData.h

@@ -0,0 +1,20 @@
+//
+//  MOGameBaseData.h
+//
+//  Created by SuperCabbage  on 2024/4/29
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface MOGameBaseData : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSArray *gamelist;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 115 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGameBaseData.m

@@ -0,0 +1,115 @@
+//
+//  MOGameBaseData.m
+//
+//  Created by SuperCabbage  on 2024/4/29
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "MOGameBaseData.h"
+#import "MOGamelist.h"
+
+
+NSString *const kMOGameBaseDataGamelist = @"list";
+
+
+@interface MOGameBaseData ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation MOGameBaseData
+
+@synthesize gamelist = _gamelist;
+
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict {
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict {
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if (self && [dict isKindOfClass:[NSDictionary class]]) {
+    NSObject *receivedMOGamelist = [dict objectForKey:kMOGameBaseDataGamelist];
+    NSMutableArray *parsedMOGamelist = [NSMutableArray array];
+    
+    if ([receivedMOGamelist isKindOfClass:[NSArray class]]) {
+        for (NSDictionary *item in (NSArray *)receivedMOGamelist) {
+            if ([item isKindOfClass:[NSDictionary class]]) {
+                [parsedMOGamelist addObject:[MOGamelist modelObjectWithDictionary:item]];
+            }
+       }
+    } else if ([receivedMOGamelist isKindOfClass:[NSDictionary class]]) {
+       [parsedMOGamelist addObject:[MOGamelist modelObjectWithDictionary:(NSDictionary *)receivedMOGamelist]];
+    }
+
+    self.gamelist = [NSArray arrayWithArray:parsedMOGamelist];
+
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation {
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    NSMutableArray *tempArrayForGamelist = [NSMutableArray array];
+    
+    for (NSObject *subArrayObject in self.gamelist) {
+        if ([subArrayObject respondsToSelector:@selector(dictionaryRepresentation)]) {
+            // This class is a model object
+            [tempArrayForGamelist addObject:[subArrayObject performSelector:@selector(dictionaryRepresentation)]];
+        } else {
+            // Generic object
+            [tempArrayForGamelist addObject:subArrayObject];
+        }
+    }
+    [mutableDict setValue:[NSArray arrayWithArray:tempArrayForGamelist] forKey:kMOGameBaseDataGamelist];
+
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description  {
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict {
+    id object = [dict objectForKey:aKey];
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder {
+    self = [super init];
+
+    self.gamelist = [aDecoder decodeObjectForKey:kMOGameBaseDataGamelist];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_gamelist forKey:kMOGameBaseDataGamelist];
+}
+
+- (id)copyWithZone:(NSZone *)zone {
+    MOGameBaseData *copy = [[MOGameBaseData alloc] init];
+    
+    
+    
+    if (copy) {
+
+        copy.gamelist = [self.gamelist copyWithZone:zone];
+    }
+    
+    return copy;
+}
+
+
+@end

+ 9 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGameDataModels.h

@@ -0,0 +1,9 @@
+//
+//  DataModels.h
+//
+//  Created by SuperCabbage  on 2024/4/29
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "MOGamelist.h"
+#import "MOGameBaseData.h"

+ 23 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGamelist.h

@@ -0,0 +1,23 @@
+//
+//  MOGamelist.h
+//
+//  Created by SuperCabbage  on 2024/4/29
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+
+@interface MOGamelist : NSObject <NSCoding, NSCopying>
+
+@property (nonatomic, strong) NSString *id;
+@property (nonatomic, strong) NSString *icon;
+@property (nonatomic, strong) NSString *name;
+@property (nonatomic, assign) double minHeight;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict;
+- (instancetype)initWithDictionary:(NSDictionary *)dict;
+- (NSDictionary *)dictionaryRepresentation;
+
+@end

+ 110 - 0
MiMoLive/MiMoLive/Classes/GameCenterVC/Model/MOGamelist.m

@@ -0,0 +1,110 @@
+//
+//  MOGamelist.m
+//
+//  Created by SuperCabbage  on 2024/4/29
+//  Copyright (c) 2024 __MyCompanyName__. All rights reserved.
+//
+
+#import "MOGamelist.h"
+
+
+NSString *const kMOGamelistId = @"id";
+NSString *const kMOGamelistIcon = @"icon";
+NSString *const kMOGamelistName = @"name";
+NSString *const kMOGamelistMinHeight = @"minHeight";
+
+@interface MOGamelist ()
+
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict;
+
+@end
+
+@implementation MOGamelist
+
+@synthesize id = _id;
+@synthesize icon = _icon;
+@synthesize name = _name;
+@synthesize minHeight = _minHeight;
+
++ (instancetype)modelObjectWithDictionary:(NSDictionary *)dict {
+    return [[self alloc] initWithDictionary:dict];
+}
+
+- (instancetype)initWithDictionary:(NSDictionary *)dict {
+    self = [super init];
+    
+    // This check serves to make sure that a non-NSDictionary object
+    // passed into the model class doesn't break the parsing.
+    if (self && [dict isKindOfClass:[NSDictionary class]]) {
+            self.id = [self objectOrNilForKey:kMOGamelistId fromDictionary:dict];
+            self.icon = [self objectOrNilForKey:kMOGamelistIcon fromDictionary:dict];
+            self.name = [self objectOrNilForKey:kMOGamelistName fromDictionary:dict];
+
+        self.minHeight = [[self objectOrNilForKey:kMOGamelistMinHeight fromDictionary:dict] doubleValue];
+    }
+    
+    return self;
+    
+}
+
+- (NSDictionary *)dictionaryRepresentation {
+    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary];
+    [mutableDict setValue:self.id forKey:kMOGamelistId];
+    [mutableDict setValue:self.icon forKey:kMOGamelistIcon];
+    [mutableDict setValue:self.name forKey:kMOGamelistName];
+
+    [mutableDict setValue:[NSNumber numberWithDouble:self.minHeight] forKey:kMOGamelistMinHeight];
+    return [NSDictionary dictionaryWithDictionary:mutableDict];
+}
+
+- (NSString *)description  {
+    return [NSString stringWithFormat:@"%@", [self dictionaryRepresentation]];
+}
+
+#pragma mark - Helper Method
+- (id)objectOrNilForKey:(id)aKey fromDictionary:(NSDictionary *)dict {
+    id object = [dict objectForKey:aKey];
+    return [object isEqual:[NSNull null]] ? nil : object;
+}
+
+
+#pragma mark - NSCoding Methods
+
+- (id)initWithCoder:(NSCoder *)aDecoder {
+    self = [super init];
+
+    self.id = [aDecoder decodeObjectForKey:kMOGamelistId];
+    self.icon = [aDecoder decodeObjectForKey:kMOGamelistIcon];
+    self.name = [aDecoder decodeObjectForKey:kMOGamelistName];
+    
+    self.minHeight = [aDecoder decodeDoubleForKey:kMOGamelistMinHeight];
+    return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+
+    [aCoder encodeObject:_id forKey:kMOGamelistId];
+    [aCoder encodeObject:_icon forKey:kMOGamelistIcon];
+    [aCoder encodeObject:_name forKey:kMOGamelistName];
+    [aCoder encodeDouble:_minHeight forKey:kMOGamelistMinHeight];
+}
+
+- (id)copyWithZone:(NSZone *)zone {
+    MOGamelist *copy = [[MOGamelist alloc] init];
+    
+    
+    
+    if (copy) {
+
+        copy.id = [self.id copyWithZone:zone];
+        copy.icon = [self.icon copyWithZone:zone];
+        copy.name = [self.name copyWithZone:zone];
+        copy.minHeight = self.minHeight;
+    }
+    
+    return copy;
+}
+
+
+@end

+ 29 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowCell.h

@@ -0,0 +1,29 @@
+//
+//  MOGameShowCell.h
+//  KoKoLive
+//
+//  Created by SuperC on 2024/4/29.
+//
+
+#import <UIKit/UIKit.h>
+#import "MOGameDataModels.h"
+
+#define MOGameShowCell_ID @"MOGameShowCell_ID"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOGameShowCell : UICollectionViewCell
+
+/** 背景 */
+@property (nonatomic, strong) UIView *bgView;
+
+@property (nonatomic, strong) UIImageView *iconImgView;
+
+/** 标题 */
+@property (nonatomic, strong) UILabel *titleLab;
+
+@property (nonatomic, strong) MOGamelist *cellModel;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 90 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowCell.m

@@ -0,0 +1,90 @@
+//
+//  MOGameShowCell.m
+//  KoKoLive
+//
+//  Created by SuperC on 2024/4/29.
+//
+
+#import "MOGameShowCell.h"
+
+@implementation MOGameShowCell
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+    if (self = [super initWithFrame:frame])
+    {
+        self.backgroundColor = [UIColor clearColor];
+        [self setupUI];
+    }
+    return self;
+}
+
+- (void)setupUI{
+    [self.contentView addSubview:self.bgView];
+    [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.edges.equalTo(self.contentView);
+    }];
+    self.bgView.layer.cornerRadius = 16.0;
+    self.bgView.layer.masksToBounds = YES;
+    
+    [self.bgView addSubview:self.titleLab];
+    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.equalTo(self.bgView).offset(0.0);
+        make.left.equalTo(self.bgView).offset(3.0);
+        make.right.equalTo(self.bgView).offset(-3.0);
+        make.height.equalTo(@12.0);
+    }];
+    
+    [self.bgView addSubview:self.iconImgView];
+    [self.iconImgView mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.equalTo(self.titleLab.mas_top).offset(0.0);
+        make.left.right.top.equalTo(self.bgView);
+    }];
+    self.iconImgView.layer.cornerRadius = 16.0;
+    self.iconImgView.layer.masksToBounds = YES;
+}
+
+- (void)setCellModel:(MOGamelist *)cellModel{
+    _cellModel = cellModel;
+    
+    [self.iconImgView sd_setImageWithURL:[NSURL URLWithString:cellModel.icon]];
+    self.titleLab.text = cellModel.name;
+}
+
+
+#pragma mark - Lazy
+- (UIView *)bgView
+{
+    if (_bgView == nil)
+    {
+        _bgView = [UIView new];
+        _bgView.backgroundColor = [UIColor clearColor];
+    }
+    return _bgView;
+}
+
+- (UIImageView *)iconImgView{
+    if (!_iconImgView)
+    {
+        _iconImgView = [[UIImageView alloc] init];
+        _iconImgView.clipsToBounds = YES;
+        _iconImgView.userInteractionEnabled = NO;
+        _iconImgView.contentMode = UIViewContentModeScaleAspectFill;
+    }
+    return _iconImgView;
+}
+
+- (UILabel *)titleLab
+{
+    if(!_titleLab)
+    {
+        _titleLab = [UILabel new];
+        _titleLab.textColor = UIColorFromHex(0xC4C4C4);
+        _titleLab.textAlignment = NSTextAlignmentCenter;
+        _titleLab.font = [MOTextTools getTheFontWithSize:10.0 AndFontName:@"Humnst777 BlkCn BT"];
+        _titleLab.backgroundColor = [UIColor clearColor];
+    }
+    return _titleLab;
+}
+
+@end

+ 25 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowView.h

@@ -0,0 +1,25 @@
+//
+//  MOGameShowView.h
+//  KoKoLive
+//
+//  Created by SuperC on 2024/4/29.
+//
+
+#import <UIKit/UIKit.h>
+#import "MOEnterDataModels.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOGameShowView : UIView
+
+@property (nonatomic, copy) void (^openGameBlock)(MOGameEnterData *enterGameData, NSInteger minHeight);
+
++ (instancetype)moGameShowView;
+
+
+- (void)showGameShowView;
+- (void)dismissGameShowView;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 235 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowView.m

@@ -0,0 +1,235 @@
+//
+//  MOGameShowView.m
+//  KoKoLive
+//
+//  Created by SuperC on 2024/4/29.
+//
+
+#import "MOGameShowView.h"
+#import "MOGameShowCell.h"
+#import "MOGameCenterVC.h"
+#import "UIImage+YYAdd.h"
+#import "MOLiveGameCenterReusableView.h"
+
+@interface MOGameShowView ()<UICollectionViewDelegate,UICollectionViewDataSource>
+
+@property (weak, nonatomic) IBOutlet UIView *bgView;
+
+@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
+
+/** 数据源 */
+@property (nonatomic, strong) NSArray *dataArr;
+
+@property (nonatomic, strong) NSArray *headDataArr;
+
+/** 没有更多的数据视图 */
+@property (nonatomic, strong) MONoMoreDataView *noMoreDataView;
+
+
+@property (weak, nonatomic) IBOutlet UIImageView *bgImgView;
+
+@property (weak, nonatomic) IBOutlet UIImageView *rightImgView;
+
+
+@end
+
+@implementation MOGameShowView
+
++ (instancetype)moGameShowView{
+    return [[[NSBundle mainBundle] loadNibNamed:@"MOGameShowView" owner:self options:nil] firstObject];
+}
+
+- (void)awakeFromNib{
+    [super awakeFromNib];
+    
+    self.bgView.layer.cornerRadius = 16.0;
+    self.bgView.layer.maskedCorners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner;
+    self.bgView.layer.masksToBounds = YES;
+    
+    UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
+    
+    CGFloat width = (SCREENWIDTH - 10.0 * 2 - 15.0 * 3.0) / 4.0;
+    CGFloat height = width + 16.0;
+    
+    flow.itemSize = CGSizeMake(width, height);
+    flow.minimumLineSpacing = 0.0;//行间距
+    flow.minimumInteritemSpacing = 15.0;//列间距
+    [self.collectionView setCollectionViewLayout:flow];
+    self.collectionView.delegate = self;
+    self.collectionView.dataSource = self;
+    [self.collectionView registerClass:[MOGameShowCell class] forCellWithReuseIdentifier:MOGameShowCell_ID];
+    [self.collectionView registerNib:[UINib nibWithNibName:@"MOLiveGameCenterReusableView" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:MOLiveGameCenterReusableView_ID];
+    [self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"sectionFoot"];
+    
+    self.collectionView.backgroundView = self.noMoreDataView;
+    
+//    UIImage *newRightImg = [[UIImage imageNamed:@"icon_game_center_left"] imageByFlipHorizontal];
+//    [self.rightImgView setImage:newRightImg];
+    
+//    NSArray *colorArr = @[[MOTools colorWithHexString:@"#050331" alpha:1.0],[MOTools colorWithHexString:@"#58109B" alpha:1.0]];
+//    UIImage *image = [MOTools createGradientRectImageWithBounds:CGRectMake(0, 0, SCREENWIDTH, 389.0) Colors:colorArr GradientType:1];
+//    [self.bgImgView setImage:image];
+    
+}
+
+- (void)getHttpData{
+    WEAKSELF
+    [kHttpManager toGetGameListWithParams:nil andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
+        if(kCode_Success){
+            NSLog(@"%@",[[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding]);
+            MOGameBaseData *baseModel = [MOGameBaseData modelObjectWithDictionary:data[@"data"]];
+            
+            NSArray *baseArr = [baseModel.gamelist copy];
+            if(baseArr.count > 5){
+                weakSelf.headDataArr = [baseArr subarrayWithRange:NSMakeRange(0, 5)];
+                weakSelf.dataArr = [baseArr subarrayWithRange:NSMakeRange(5, baseArr.count - 5)];
+            }
+            else{
+                weakSelf.headDataArr = [baseArr copy];
+                weakSelf.dataArr = [NSArray array];
+            }
+            
+            [weakSelf.collectionView reloadData];
+            weakSelf.noMoreDataView.isHaveData = (weakSelf.dataArr.count > 0) ? YES : NO;
+        }
+        else{
+            kShowNetError(data)
+        }
+    }];
+}
+
+- (IBAction)closeBtnClick:(id)sender {
+    [self dismissGameShowView];
+}
+
+#pragma mark UICollectionViewDelegate,UICollectionViewDataSource
+- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
+{
+    return 1;
+}
+
+- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
+{
+    return self.dataArr.count;
+}
+
+-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
+    MOGamelist *model = self.dataArr[indexPath.row];
+    MOGameShowCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:MOGameShowCell_ID forIndexPath:indexPath];
+    cell.cellModel = model;
+    return cell;
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    [collectionView deselectItemAtIndexPath:indexPath animated:YES];
+    MOGamelist *model = self.dataArr[indexPath.row];
+    
+    if(model.id.length == 0){
+        return;
+    }
+    
+    NSString *getDefaultLan = [MOGameCenterVC getCurrentLanguages];
+    NSDictionary *dict = @{@"id":model.id};
+    [self toEnterGameWith:dict AndMinHeight:model.minHeight];
+    
+}
+
+- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
+{
+    if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
+        WEAKSELF
+        MOLiveGameCenterReusableView *headView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:MOLiveGameCenterReusableView_ID forIndexPath:indexPath];
+        headView.dataArr = self.headDataArr;
+        headView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            if(cellModel.id.length == 0){
+                return;
+            }
+            
+            NSString *getDefaultLan = [MOGameCenterVC getCurrentLanguages];
+            NSDictionary *dict = @{@"id":cellModel.id};
+            [weakSelf toEnterGameWith:dict AndMinHeight:cellModel.minHeight];
+        };
+        return headView;
+    }
+    else{
+        UICollectionReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"sectionFoot" forIndexPath:indexPath];
+        return view;
+    }
+}
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
+    
+    CGFloat width = (SCREENWIDTH - 10.0 * 4) / 3.0;
+    CGFloat height = 150.0;
+    
+    return CGSizeMake((SCREENWIDTH - 10.0 * 2), height);
+}
+
+
+- (void)toEnterGameWith:(NSDictionary *)dict AndMinHeight:(NSInteger)minHeight{
+    WEAKSELF
+    
+    [MBProgressHUD showActivityMessageInWindow:@""];
+    
+    [kHttpManager toEnterGameWithParams:dict andBlock:^(id  _Nonnull data, NSError * _Nonnull error) {
+        [MBProgressHUD hideHUD];
+        if(kCode_Success){
+//            NSLog(@"%@",[[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding]);
+            MOGameEnterData *baseData = [MOGameEnterData modelObjectWithDictionary:data[@"data"]];
+            if(baseData.result.length != 0){
+                weakSelf.openGameBlock ? weakSelf.openGameBlock(baseData,minHeight) : nil;
+                [weakSelf dismissGameShowView];
+            }
+        }
+        else{
+            kShowNetError(data)
+        }
+    }];
+}
+
+- (void)showGameShowView{
+    self.frame = CGRectMake(0, 0, SCREENWIDTH, SCREENHEIGHT);
+    
+    CGRect actionViewRect = self.bgView.frame;
+    actionViewRect.origin.y = SCREENHEIGHT;
+    self.bgView.frame = actionViewRect;
+    
+    WEAKSELF
+    [UIView animateWithDuration:0.3 animations:^{
+        CGRect actionViewRect = weakSelf.bgView.frame;
+        actionViewRect.origin.y = SCREENHEIGHT - 389.0;
+        weakSelf.bgView.frame = actionViewRect;
+    }];
+    
+    //不能滑动
+    SendNotification(@"MOShowLivePagesVCCannotScroll")
+    
+    [self getHttpData];
+}
+
+- (void)dismissGameShowView{
+    //完成下移动画
+    WEAKSELF
+    [UIView animateWithDuration:0.3 animations:^
+     {
+        CGRect actionSheetViewRect = weakSelf.bgView.frame;
+        actionSheetViewRect.origin.y = SCREENHEIGHT;
+        weakSelf.bgView.frame = actionSheetViewRect;
+    } completion:^(BOOL finished)
+     {
+        [self removeFromSuperview];
+    }];
+    
+    //可以滑动
+    SendNotification(@"MOShowLivePagesVCCanScroll")
+}
+
+- (MONoMoreDataView *)noMoreDataView{
+    if(!_noMoreDataView){
+        _noMoreDataView = [MONoMoreDataView moNoMoreDataView];
+    }
+    return _noMoreDataView;
+}
+
+@end

+ 98 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOGameShowView.xib

@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="MOGameShowView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="R97-YJ-xns">
+                    <rect key="frame" x="0.0" y="463" width="393" height="389"/>
+                    <subviews>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_game_bg" translatesAutoresizingMaskIntoConstraints="NO" id="57w-dH-Zx0">
+                            <rect key="frame" x="0.0" y="0.0" width="393" height="389"/>
+                        </imageView>
+                        <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="none" translatesAutoresizingMaskIntoConstraints="NO" id="yY5-fe-50U">
+                            <rect key="frame" x="10" y="60" width="373" height="329"/>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="UbJ-j9-zA3">
+                                <size key="itemSize" width="128" height="128"/>
+                                <size key="headerReferenceSize" width="0.0" height="0.0"/>
+                                <size key="footerReferenceSize" width="0.0" height="0.0"/>
+                                <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
+                            </collectionViewFlowLayout>
+                        </collectionView>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_game_center_title" translatesAutoresizingMaskIntoConstraints="NO" id="5Wh-48-hUI">
+                            <rect key="frame" x="107.66666666666669" y="3" width="178" height="55"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="178" id="DCa-TX-EkS"/>
+                                <constraint firstAttribute="height" constant="55" id="bBf-r6-OMD"/>
+                            </constraints>
+                        </imageView>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="游戏中心" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MRb-IV-1Mb">
+                            <rect key="frame" x="152" y="17.333333333333314" width="89.333333333333314" height="26.333333333333329"/>
+                            <fontDescription key="fontDescription" type="boldSystem" pointSize="22"/>
+                            <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <nil key="highlightedColor"/>
+                        </label>
+                    </subviews>
+                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="389" id="4NO-ku-QiZ"/>
+                        <constraint firstItem="MRb-IV-1Mb" firstAttribute="centerX" secondItem="5Wh-48-hUI" secondAttribute="centerX" id="E32-EU-gge"/>
+                        <constraint firstItem="5Wh-48-hUI" firstAttribute="centerX" secondItem="R97-YJ-xns" secondAttribute="centerX" id="FVz-CD-EdH"/>
+                        <constraint firstItem="MRb-IV-1Mb" firstAttribute="centerY" secondItem="5Wh-48-hUI" secondAttribute="centerY" id="HUF-ZG-J5s"/>
+                        <constraint firstItem="57w-dH-Zx0" firstAttribute="top" secondItem="R97-YJ-xns" secondAttribute="top" id="Ixo-Rw-i0M"/>
+                        <constraint firstItem="yY5-fe-50U" firstAttribute="top" secondItem="R97-YJ-xns" secondAttribute="top" constant="60" id="Kza-vi-jev"/>
+                        <constraint firstItem="57w-dH-Zx0" firstAttribute="leading" secondItem="R97-YJ-xns" secondAttribute="leading" id="MXk-hU-TyU"/>
+                        <constraint firstAttribute="bottom" secondItem="yY5-fe-50U" secondAttribute="bottom" id="N1f-GQ-ZqE"/>
+                        <constraint firstAttribute="bottom" secondItem="57w-dH-Zx0" secondAttribute="bottom" id="QeS-PU-lhK"/>
+                        <constraint firstAttribute="trailing" secondItem="yY5-fe-50U" secondAttribute="trailing" constant="10" id="T2V-8D-F2G"/>
+                        <constraint firstItem="5Wh-48-hUI" firstAttribute="top" secondItem="R97-YJ-xns" secondAttribute="top" constant="3" id="eUc-ey-boN"/>
+                        <constraint firstItem="yY5-fe-50U" firstAttribute="leading" secondItem="R97-YJ-xns" secondAttribute="leading" constant="10" id="oep-Mo-buT"/>
+                        <constraint firstAttribute="trailing" secondItem="57w-dH-Zx0" secondAttribute="trailing" id="x29-LP-Ddz"/>
+                    </constraints>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="zMN-Kg-2a2">
+                    <rect key="frame" x="0.0" y="0.0" width="393" height="463"/>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <connections>
+                        <action selector="closeBtnClick:" destination="iN0-l3-epB" eventType="touchUpInside" id="kGL-FV-Im2"/>
+                    </connections>
+                </button>
+            </subviews>
+            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="R97-YJ-xns" secondAttribute="trailing" id="Nle-cF-eHy"/>
+                <constraint firstAttribute="bottom" secondItem="R97-YJ-xns" secondAttribute="bottom" id="OZk-tW-SOk"/>
+                <constraint firstItem="R97-YJ-xns" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="Rem-LP-V4M"/>
+                <constraint firstItem="R97-YJ-xns" firstAttribute="top" secondItem="zMN-Kg-2a2" secondAttribute="bottom" id="aZv-Bw-YTf"/>
+                <constraint firstItem="zMN-Kg-2a2" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="anf-U0-8cp"/>
+                <constraint firstAttribute="trailing" secondItem="zMN-Kg-2a2" secondAttribute="trailing" id="eGL-Nn-kLh"/>
+                <constraint firstItem="zMN-Kg-2a2" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="x97-2d-JzJ"/>
+            </constraints>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="bgImgView" destination="57w-dH-Zx0" id="vPR-5L-cpr"/>
+                <outlet property="bgView" destination="R97-YJ-xns" id="6a3-vZ-oSM"/>
+                <outlet property="collectionView" destination="yY5-fe-50U" id="yhC-Np-yyb"/>
+            </connections>
+            <point key="canvasLocation" x="66" y="-11"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="icon_game_bg" width="375" height="404"/>
+        <image name="icon_game_center_title" width="185.66667175292969" height="56"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 34 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOImageTitleBaseView.h

@@ -0,0 +1,34 @@
+//
+//  MOImageTitleBaseView.h
+//  KoKoLive
+//
+//  Created by SuperC on 2024/9/5.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOImageTitleBaseView : UIView
+
+@property (nonatomic, strong) UIFont *titleFont;
+@property (nonatomic, strong) UIColor *titleColor;
+
+/** 背景 */
+@property (nonatomic, strong) UIView *bgView;
+
+@property (nonatomic, strong) UIImageView *iconImgView;
+
+/** 标题 */
+@property (nonatomic, strong) UILabel *titleLab;
+
+@property (nonatomic, strong) MOGamelist *cellModel;
+
+@property (nonatomic, strong) UIButton *viewButton;
+@property (nonatomic, copy) void (^viewClickBlock)(MOGamelist *cellModel);
+
+- (void)noDataShow;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 124 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOImageTitleBaseView.m

@@ -0,0 +1,124 @@
+//
+//  MOImageTitleBaseView.m
+//  KoKoLive
+//
+//  Created by SuperC on 2024/9/5.
+//
+
+#import "MOImageTitleBaseView.h"
+
+@implementation MOImageTitleBaseView
+
+- (instancetype)initWithCoder:(NSCoder *)coder{
+    self = [super initWithCoder:coder];
+    if(self){
+        self.layer.masksToBounds = YES;
+        self.backgroundColor = [UIColor clearColor];
+        
+        [self addSubview:self.bgView];
+        [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.edges.equalTo(self.self);
+        }];
+        self.bgView.layer.cornerRadius = 16.0;
+        self.bgView.layer.masksToBounds = YES;
+        self.bgView.hidden = YES;
+        
+        [self.bgView addSubview:self.titleLab];
+        [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.bottom.equalTo(self.bgView);
+            make.left.equalTo(self.bgView).offset(3.0);
+            make.right.equalTo(self.bgView).offset(-3.0);
+            make.height.equalTo(@12.0);
+        }];
+        
+        [self.bgView addSubview:self.iconImgView];
+        [self.iconImgView mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.bottom.equalTo(self.titleLab.mas_top);
+            make.left.right.top.equalTo(self.bgView);
+        }];
+        self.iconImgView.layer.cornerRadius = 16.0;
+        self.iconImgView.layer.masksToBounds = YES;
+        
+        [self.bgView addSubview:self.viewButton];
+        [self.viewButton mas_makeConstraints:^(MASConstraintMaker *make) {
+            make.edges.equalTo(self.bgView);
+        }];
+        
+    }
+    return self;
+}
+
+- (void)setCellModel:(MOGamelist *)cellModel{
+    _cellModel = cellModel;
+    
+    [self.iconImgView sd_setImageWithURL:[NSURL URLWithString:cellModel.icon]];
+    self.titleLab.text = cellModel.name;
+    self.bgView.hidden = NO;
+}
+
+- (void)setTitleFont:(UIFont *)titleFont{
+    _titleFont = titleFont;
+    
+    self.titleLab.font = titleFont;
+}
+
+- (void)setTitleColor:(UIColor *)titleColor{
+    _titleColor = titleColor;
+    
+    [self.titleLab setTextColor:titleColor];
+}
+
+- (void)noDataShow{
+    self.bgView.hidden = YES;
+}
+
+#pragma mark - Lazy
+- (UIView *)bgView
+{
+    if (_bgView == nil)
+    {
+        _bgView = [UIView new];
+        _bgView.backgroundColor = [UIColor clearColor];
+    }
+    return _bgView;
+}
+
+- (UIImageView *)iconImgView{
+    if (!_iconImgView)
+    {
+        _iconImgView = [[UIImageView alloc] init];
+        _iconImgView.clipsToBounds = YES;
+        _iconImgView.userInteractionEnabled = NO;
+        _iconImgView.contentMode = UIViewContentModeScaleAspectFill;
+    }
+    return _iconImgView;
+}
+
+- (UILabel *)titleLab
+{
+    if(!_titleLab)
+    {
+        _titleLab = [UILabel new];
+        _titleLab.textColor = UIColorFromHex(0xC4C4C4);
+        _titleLab.textAlignment = NSTextAlignmentCenter;
+        _titleLab.font = [MOTextTools getTheFontWithSize:10.0 AndFontName:@"Humnst777 BlkCn BT"];
+        _titleLab.backgroundColor = [UIColor clearColor];
+    }
+    return _titleLab;
+}
+
+- (UIButton *)viewButton{
+    if(!_viewButton){
+        _viewButton = [UIButton buttonWithType:UIButtonTypeCustom];
+        _viewButton.backgroundColor = [UIColor clearColor];
+        [_viewButton setTitle:@"" forState:UIControlStateNormal];
+        [_viewButton addTarget:self action:@selector(viewButtonClick) forControlEvents:UIControlEventTouchUpInside];
+    }
+    return _viewButton;
+}
+
+- (void)viewButtonClick{
+    self.viewClickBlock ? self.viewClickBlock(self.cellModel) : nil;
+}
+
+@end

+ 21 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOLiveGameCenterReusableView.h

@@ -0,0 +1,21 @@
+//
+//  MOLiveGameCenterReusableView.h
+//  KoKoLive
+//
+//  Created by SuperC on 2024/9/5.
+//
+
+#define MOLiveGameCenterReusableView_ID @"MOLiveGameCenterReusableView_ID"
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MOLiveGameCenterReusableView : UICollectionReusableView
+
+@property (nonatomic, strong) NSArray *dataArr;
+@property (nonatomic, copy) void (^viewClickBlock)(MOGamelist *cellModel);
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 85 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOLiveGameCenterReusableView.m

@@ -0,0 +1,85 @@
+//
+//  MOLiveGameCenterReusableView.m
+//  KoKoLive
+//
+//  Created by SuperC on 2024/9/5.
+//
+
+#import "MOLiveGameCenterReusableView.h"
+#import "MOImageTitleBaseView.h"
+
+@interface MOLiveGameCenterReusableView ()
+
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *firstIconView;
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *secondIconView;
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *thirdIconView;
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *fourIconView;
+@property (weak, nonatomic) IBOutlet MOImageTitleBaseView *fiveIconView;
+
+
+@end
+
+@implementation MOLiveGameCenterReusableView
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (void)setDataArr:(NSArray *)dataArr{
+    _dataArr = dataArr;
+    
+    WEAKSELF
+    if(dataArr.count >= 1){
+        self.firstIconView.cellModel = dataArr[0];
+        self.firstIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.firstIconView noDataShow];
+    }
+    
+    if(dataArr.count >= 2){
+        self.secondIconView.cellModel = dataArr[1];
+        self.secondIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.secondIconView noDataShow];
+    }
+    
+    if(dataArr.count >= 3){
+        self.thirdIconView.cellModel = dataArr[2];
+        self.thirdIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.thirdIconView noDataShow];
+    }
+    
+    if(dataArr.count >= 4){
+        self.fourIconView.cellModel = dataArr[3];
+        self.fourIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.fourIconView noDataShow];
+    }
+    
+    if(dataArr.count >= 5){
+        self.fiveIconView.cellModel = dataArr[4];
+        self.fiveIconView.viewClickBlock = ^(MOGamelist * _Nonnull cellModel) {
+            weakSelf.viewClickBlock ? weakSelf.viewClickBlock(cellModel) : nil;
+        };
+    }
+    else{
+        [self.fiveIconView noDataShow];
+    }
+    
+}
+
+@end

+ 100 - 0
MiMoLive/MiMoLive/Classes/Live/View/MOGameShowView/MOLiveGameCenterReusableView.xib

@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22154" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22130"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <collectionReusableView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="U6b-Vx-4bR" customClass="MOLiveGameCenterReusableView">
+            <rect key="frame" x="0.0" y="0.0" width="358" height="132"/>
+            <autoresizingMask key="autoresizingMask"/>
+            <subviews>
+                <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="3Ei-0A-qaD">
+                    <rect key="frame" x="0.0" y="0.0" width="358" height="132"/>
+                    <subviews>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Sv9-rg-EyA" customClass="MOImageTitleBaseView">
+                            <rect key="frame" x="0.0" y="0.0" width="112.66666666666667" height="132"/>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hmr-ew-4hW">
+                            <rect key="frame" x="122.66666666666666" y="0.0" width="112.66666666666666" height="132"/>
+                            <subviews>
+                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="m8S-tO-Mio">
+                                    <rect key="frame" x="0.0" y="0.0" width="112.66666666666667" height="132"/>
+                                    <subviews>
+                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SNw-AT-zVZ" customClass="MOImageTitleBaseView">
+                                            <rect key="frame" x="0.0" y="0.0" width="112.66666666666667" height="66"/>
+                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                        </view>
+                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MDd-Ax-LAF" customClass="MOImageTitleBaseView">
+                                            <rect key="frame" x="0.0" y="66" width="112.66666666666667" height="66"/>
+                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                        </view>
+                                    </subviews>
+                                </stackView>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="m8S-tO-Mio" secondAttribute="trailing" id="TRW-Wv-Tc2"/>
+                                <constraint firstItem="m8S-tO-Mio" firstAttribute="top" secondItem="hmr-ew-4hW" secondAttribute="top" id="gGG-Zb-bMW"/>
+                                <constraint firstAttribute="bottom" secondItem="m8S-tO-Mio" secondAttribute="bottom" id="jJR-IC-UfW"/>
+                                <constraint firstItem="m8S-tO-Mio" firstAttribute="leading" secondItem="hmr-ew-4hW" secondAttribute="leading" id="ska-kV-19p"/>
+                            </constraints>
+                        </view>
+                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8TG-4U-Z8O">
+                            <rect key="frame" x="245.33333333333334" y="0.0" width="112.66666666666666" height="132"/>
+                            <subviews>
+                                <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" translatesAutoresizingMaskIntoConstraints="NO" id="UCi-Hk-bbe">
+                                    <rect key="frame" x="0.0" y="0.0" width="112.66666666666667" height="132"/>
+                                    <subviews>
+                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="DRd-1N-Agj" customClass="MOImageTitleBaseView">
+                                            <rect key="frame" x="0.0" y="0.0" width="112.66666666666667" height="66"/>
+                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                        </view>
+                                        <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vr4-FN-nHV" customClass="MOImageTitleBaseView">
+                                            <rect key="frame" x="0.0" y="66" width="112.66666666666667" height="66"/>
+                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                        </view>
+                                    </subviews>
+                                </stackView>
+                            </subviews>
+                            <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="UCi-Hk-bbe" secondAttribute="trailing" id="L4P-1Y-r4R"/>
+                                <constraint firstAttribute="bottom" secondItem="UCi-Hk-bbe" secondAttribute="bottom" id="YR8-2X-TPH"/>
+                                <constraint firstItem="UCi-Hk-bbe" firstAttribute="leading" secondItem="8TG-4U-Z8O" secondAttribute="leading" id="Z9o-1w-mL3"/>
+                                <constraint firstItem="UCi-Hk-bbe" firstAttribute="top" secondItem="8TG-4U-Z8O" secondAttribute="top" id="fOx-nM-4mE"/>
+                            </constraints>
+                        </view>
+                    </subviews>
+                </stackView>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="9Gg-ye-v9C"/>
+            <constraints>
+                <constraint firstItem="3Ei-0A-qaD" firstAttribute="top" secondItem="U6b-Vx-4bR" secondAttribute="top" id="IN5-ZW-q8e"/>
+                <constraint firstItem="9Gg-ye-v9C" firstAttribute="trailing" secondItem="3Ei-0A-qaD" secondAttribute="trailing" id="Jx4-8q-2aJ"/>
+                <constraint firstItem="3Ei-0A-qaD" firstAttribute="leading" secondItem="9Gg-ye-v9C" secondAttribute="leading" id="oQ3-Rp-m4x"/>
+                <constraint firstAttribute="bottom" secondItem="3Ei-0A-qaD" secondAttribute="bottom" id="ybi-4d-6sV"/>
+            </constraints>
+            <connections>
+                <outlet property="firstIconView" destination="Sv9-rg-EyA" id="Act-nI-OeA"/>
+                <outlet property="fiveIconView" destination="vr4-FN-nHV" id="PUm-A4-aek"/>
+                <outlet property="fourIconView" destination="MDd-Ax-LAF" id="dE8-CP-zIs"/>
+                <outlet property="secondIconView" destination="SNw-AT-zVZ" id="1gk-Vf-Jay"/>
+                <outlet property="thirdIconView" destination="DRd-1N-Agj" id="nWK-m5-U93"/>
+            </connections>
+            <point key="canvasLocation" x="158.77862595419847" y="16.197183098591552"/>
+        </collectionReusableView>
+    </objects>
+    <resources>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 1 - 0
MiMoLive/MiMoLive/Classes/Main/Manage/MOSvgaSourceManage.h

@@ -15,6 +15,7 @@
 #import "MOGiftDataModels.h"
 #import "MOGiftCategoryDataModels.h"
 #import "MORobotSDataModels.h"
+#import "MOGameDataModels.h"
 
 NS_ASSUME_NONNULL_BEGIN
 

+ 7 - 0
MiMoLive/MiMoLive/Global/NetManager/MOAPIUrl.h

@@ -498,6 +498,13 @@ typedef enum
 //礼包信息 - 预下单
 #define kNetPath_Code_RedRainRequest  @"/red-rain/request"
 
+#pragma mark =========== About Game ============
+
+//游戏 - 信息 - 列表
+#define kNetPath_Code_GameInfoList      @"/game/info/list"
+//游戏 - 进入游戏
+#define kNetPath_Code_GameInfoEnter      @"/game/info/enter"
+
 #pragma mark =========== Sign Task ============
 //签到任务 - 签到信息
 #define kNetPath_Code_SignTaskInfo      @"/task/sign/info"

+ 13 - 0
MiMoLive/MiMoLive/Global/NetManager/MOHttpManager.h

@@ -1330,6 +1330,19 @@ NS_ASSUME_NONNULL_BEGIN
 ///   - block: 回调
 - (void)toRequestTheRedRainWithParams:(id)params andBlock:(void (^)(id data, NSError *error))block;
 
+#pragma mark =========== About Game ============
+
+/// 游戏 - 信息 - 列表
+/// - Parameters:
+///   - params: 参数
+///   - block: 回调
+- (void)toGetGameListWithParams:(id)params andBlock:(void (^)(id data, NSError *error))block;
+
+/// 游戏 - 进入游戏
+/// - Parameters:
+///   - params: 参数
+///   - block: 回调
+- (void)toEnterGameWithParams:(id)params andBlock:(void (^)(id data, NSError *error))block;
 
 #pragma mark =========== Sign Task ============
 

+ 44 - 0
MiMoLive/MiMoLive/Global/NetManager/MOHttpManager.m

@@ -4464,6 +4464,50 @@
     }];
 }
 
+#pragma mark =========== About Game ============
+
+/// 游戏 - 信息 - 列表
+/// - Parameters:
+///   - params: 参数
+///   - block: 回调
+- (void)toGetGameListWithParams:(id)params andBlock:(void (^)(id data, NSError *error))block{
+    [[MONetAPIClient sharedJsonClient] requestJsonDataWithPath:[NSString stringWithFormat:@"%@",kNetPath_Code_GameInfoList] withParams:params withMethodType:Post andBlock:^(id data, NSError *error)
+     {
+        if (data)
+        {
+            if ([self handleError:data])
+            {
+                block(data, nil);
+            }
+        }
+        else
+        {
+            block(nil, error);
+        }
+    }];
+}
+
+/// 游戏 - 进入游戏
+/// - Parameters:
+///   - params: 参数
+///   - block: 回调
+- (void)toEnterGameWithParams:(id)params andBlock:(void (^)(id data, NSError *error))block{
+    [[MONetAPIClient sharedJsonClient] requestJsonDataWithPath:[NSString stringWithFormat:@"%@",kNetPath_Code_GameInfoEnter] withParams:params withMethodType:Post andBlock:^(id data, NSError *error)
+     {
+        if (data)
+        {
+            if ([self handleError:data])
+            {
+                block(data, nil);
+            }
+        }
+        else
+        {
+            block(nil, error);
+        }
+    }];
+}
+
 #pragma mark =========== Sign Task ============
 
 /// 签到任务 - 签到信息