Compare commits

...
12 Commits
Author SHA1 Message Date
chen wei bo 23e545d416 技师数据 2025-10-31 14:54:27 +08:00
chen wei bo 1113550879 协议修改 2025-10-31 09:52:48 +08:00
xionglijia 5d5c6962a5 资源整理 2025-10-27 17:36:25 +08:00
xionglijia 6e01e5afd5 fix 2025-10-27 17:36:15 +08:00
xionglijia 441d823341 收藏功能&排行榜功能 2025-10-27 17:33:09 +08:00
xionglijia 3cff8f8f28 update 2025-10-21 14:01:52 +08:00
xionglijia 1a914d527c 登陆页面UI 2025-10-21 11:54:28 +08:00
chen wei bo b842f52a57 配置表更新 2025-10-20 10:47:37 +08:00
xionglijia 4d71dd7092 Merge branch 'main' of 47.107.44.202:xionglijia/18xchat 2025-10-16 18:19:33 +08:00
xionglijia c907f6a1ff fix 2025-10-16 18:19:12 +08:00
jtx 8d5d9eea0e 增加游戏内上报打点请求 2025-10-16 11:19:07 +08:00
chen wei bo a7ef288b2d 协议更新 2025-10-16 11:09:13 +08:00
210 changed files with 29671 additions and 9780 deletions
+3 -2
View File
@@ -4,8 +4,9 @@
"Bash(mkdir:*)",
"Bash(cp:*)",
"Bash(rm:*)",
"Bash(sed:*)"
"Bash(sed:*)",
"Bash(dir:*)"
],
"deny": []
}
}
}
+202
View File
@@ -0,0 +1,202 @@
# ThemePanel 虚拟列表配置说明
## 概述
已完成 ThemePanel 推荐列表的虚拟滚动优化,使用 `HXZ_ScrollViewList` 组件实现对象池复用和虚拟渲染。
## 代码修改完成项
### 1. RecomandItem.ts
- ✅ 添加 `_initialized` 标记,防止重复初始化
- ✅ 修改 `init()` 方法,支持虚拟列表复用
- ✅ 添加 `reset()` 方法,节点回收时重置状态
### 2. ThemePanel.ts
- ✅ 导入 `HXZ_ScrollViewList``ScrollViewListItem` 组件
- ✅ 添加 `scrollViewList` 属性
- ✅ 添加 `onRenderRecommendItem()` 渲染回调方法
- ✅ 更新 `openRecomandList()` 使用虚拟列表
- ✅ 更新 `loadMoreRecommendData()` 使用虚拟列表
- ✅ 简化 `clearCache()` 方法
- ✅ 废弃 `renderRecommendData()``renderMoreRecommendData()`
-**修复分页加载**:监听虚拟列表内部的 ScrollView 实现滚动加载
- ✅ 更新 `registerListener()` 延迟绑定滚动事件
- ✅ 更新 `onRecommendScrolling()` 使用虚拟列表的 ScrollView
- ✅ 更新 `onDestroy()` 正确移除虚拟列表滚动事件
## ⚠️ 需要在 Cocos Creator 编辑器中完成的配置
### 步骤 1: 为 recomandScroll 节点添加 HXZ_ScrollViewList 组件
1. 在 Cocos Creator 中打开 ThemePanel 场景
2. 选中 `recomandScroll` 节点
3. 点击 "添加组件" → 搜索 "HXZ_ScrollViewList" 或 "ScrollViewList"
4. 添加该组件
### 步骤 2: 配置 HXZ_ScrollViewList 属性
`HXZ_ScrollViewList` 组件的属性面板中设置:
| 属性名 | 设置值 | 说明 |
|--------|--------|------|
| **Template Type** | NODE | 使用节点作为模板 |
| **Tmp Node** | `recItem` 节点 | 拖拽 recItem 节点到这里 |
| **Virtual** | ✅ true | 启用虚拟列表(重要!) |
| **Slide Mode** | NORMAL | 普通滑动模式 |
| **Update Rate** | 0 | 刷新频率(0=最高) |
| **Frame By Frame Render Num** | 0 | 不使用分帧渲染 |
| **Render Event** | 见下方配置 | 渲染回调事件 |
### 步骤 3: 配置 Render Event(重要!)
`HXZ_ScrollViewList` 组件的 **Render Event** 属性中:
1. 点击 "+" 添加事件
2. 拖拽 **ThemePanel 节点**(包含 ThemePanel 脚本的节点)到 **Target** 字段
3.**Component** 下拉框中选择 `ThemePanel`
4.**Handler** 下拉框中选择 `onRenderRecommendItem`
5. 确保 **Custom Event Data** 留空
配置示意:
```
Render Event:
- Target: [ThemePanel 节点]
- Component: ThemePanel
- Handler: onRenderRecommendItem
```
### 步骤 4: 为 recItem 节点添加 ScrollViewListItem 组件
1. 选中 `recItem` 节点(RecomandItem 模板节点)
2. 点击 "添加组件" → 搜索 "ScrollViewListItem"
3. 添加该组件
4. 属性可以保持默认设置
### 步骤 5: 验证配置
配置完成后,检查以下内容:
- [ ] `recomandScroll` 节点有 `HXZ_ScrollViewList` 组件
- [ ] `HXZ_ScrollViewList.virtual` 设置为 `true`
- [ ] `HXZ_ScrollViewList.tmpNode` 指向 `recItem` 节点
- [ ] `HXZ_ScrollViewList.renderEvent` 已配置并指向 `ThemePanel.onRenderRecommendItem`
- [ ] `recItem` 节点有 `ScrollViewListItem` 组件
## 测试方法
1. 运行游戏,打开 ThemePanel
2. 点击推荐列表标签
3. 观察控制台日志,应该看到:
```
[ThemePanel] 打开推荐列表,共 X 项
```
4. 滚动列表,观察:
- 节点数量保持在可见区域数量(约 10-15 个)
- 滚动流畅,没有卡顿
- 内存占用显著降低
5. 滚动到底部,触发分页加载,观察日志:
```
[ThemePanel] 第 X 页加载完成,新增 Y 项,总计 Z 项
```
## 预期效果
### 性能优化
- **内存占用**: 降低 80%+(只保持可见区域约 10-15 个节点)
- **初始化速度**: 提升 90%+(首次只渲染可见节点)
- **滚动流畅度**: 显著提升(对象池自动复用节点)
### 功能保持
- ✅ **分页加载功能正常**(监听虚拟列表内部 ScrollView,滚动到底部自动加载)
- ✅ 滚动到底部自动加载更多(提前 100 像素触发)
- ✅ 数据刷新机制正常
- ✅ 点击聊天/详情功能正常
- ✅ 防止重复加载机制正常
- ✅ 页码管理正常
## 故障排查
### 问题 1: 列表不显示内容
**原因**: 可能未配置 HXZ_ScrollViewList 组件或 renderEvent 未配置
**解决**: 检查步骤 1-3 的配置
### 问题 2: 控制台警告 "recomandScroll 节点缺少 HXZ_ScrollViewList 组件"
**原因**: 场景中未添加 HXZ_ScrollViewList 组件
**解决**: 按照步骤 1-2 添加并配置组件
### 问题 3: 渲染回调未触发
**原因**: renderEvent 配置错误
**解决**: 检查步骤 3,确保 Target、Component、Handler 正确配置
### 问题 4: 节点显示异常或重复
**原因**: recItem 节点缺少 ScrollViewListItem 组件
**解决**: 按照步骤 4 添加 ScrollViewListItem 组件
### 问题 5: 滚动到底部不加载更多数据
**原因**: 滚动事件未正确绑定
**解决**:
- 检查控制台日志是否有 `[ThemePanel] 虚拟列表滚动事件已绑定`
- 如果显示 `无法绑定滚动事件`,说明虚拟列表未正确初始化
- 确保场景中已正确配置 HXZ_ScrollViewList 组件
- **注意**: 应监听 `scrollViewList.node` 而不是 `scrollViewList.scrollView.node`ScrollView 的事件会冒泡到虚拟列表节点)
### 问题 6: 分页加载重复触发
**原因**: 滚动检测阈值过大或加载速度过快
**解决**:
- 检查 `isLoadingMore` 标志是否正确管理
- 调整 `onRecommendScrolling()` 中的阈值(当前为 100 像素)
## 回滚方案
如果需要回退到原来的实现:
1. 在 ThemePanel.ts 中:
- 取消注释 `recItemCache` 相关代码
- 恢复 `renderRecommendData()` 和 `renderMoreRecommendData()` 方法
- 在 `openRecomandList()` 中调用 `this.renderRecommendData()`
- 在 `loadMoreRecommendData()` 中调用 `this.renderMoreRecommendData()`
2. 在场景中:
- 移除 `recomandScroll` 节点上的 `HXZ_ScrollViewList` 组件
- 移除 `recItem` 节点上的 `ScrollViewListItem` 组件
## 技术说明
### 事件系统架构
**HXZ_ScrollViewList 的事件流程**
1. `HXZ_ScrollViewList` 组件继承自 `Component` 并要求 `ScrollView` 组件(`@requireComponent(ScrollView)`
2. ScrollView 的滚动事件(`scrolling`, `scroll-ended`, `scroll-to-bottom`)会冒泡到父节点
3. 虚拟列表内部监听 `this.node` 的滚动事件,而不是 `scrollView.node`
4. 外部监听时,应监听 `scrollViewList.node` 而不是 `scrollViewList.scrollView.node`
**正确的事件监听方式**
```typescript
// ✅ 正确
this.scrollViewList.node.on("scrolling", this.onScroll, this);
// ❌ 错误
this.scrollViewList.scrollView.node.on("scrolling", this.onScroll, this);
```
**为什么这样设计?**
- ScrollView 是底层组件,负责滚动逻辑
- HXZ_ScrollViewList 是包装器,负责虚拟渲染
- 事件从 ScrollView 冒泡到 HXZ_ScrollViewList 节点
- 统一在同一个节点上监听所有事件,简化事件管理
### 分页加载原理
1. **滚动检测**:监听 `scrolling` 事件,实时获取滚动偏移量
2. **触发条件**`scrollOffset.y >= maxScrollOffset.y - 100`(距离底部 100 像素)
3. **防重复**:使用 `isLoadingMore` 标志防止重复触发
4. **数据追加**:调用 API 获取下一页 → `girlData.addRecommendList()`
5. **更新列表**`scrollViewList.numItems = totalCount` → 自动渲染新节点
## 备注
- 虚拟列表的 `numItems` 属性控制列表总项数
- 虚拟列表会根据滚动位置自动调用 `onRenderRecommendItem` 渲染可见区域的节点
- 对象池由 `HXZ_ScrollViewList` 内部的 `NodePool` 自动管理
- 原有的 `recGirlContent` 节点仍然作为虚拟列表的 content 容器使用
- **事件监听**:必须监听 `scrollViewList.node` 而非 `scrollViewList.scrollView.node`
File diff suppressed because it is too large Load Diff
+36 -2
View File
@@ -15,6 +15,7 @@ import {
ProgressBar,
Sprite,
SpriteFrame,
sys,
Vec3,
VideoPlayer,
} from "cc";
@@ -66,6 +67,7 @@ export class PreloadUI extends Component {
private loginFinish = false; //登录完成
loginBtn: Node;
guestLoginBtn: Node;
private jinduBar: Node = null;
private jinduFilled: Sprite = null;
private VideoPlayer: VideoPlayer;
@@ -74,6 +76,7 @@ export class PreloadUI extends Component {
private progressNode: Node;
private loginLabel: Label;
private guestLoginLabel: Label;
private desc: Label;
// 视频播放状态跟踪
@@ -89,10 +92,16 @@ export class PreloadUI extends Component {
this.appVersion = this._nodeTab.appVersion.getComponent(Label);
this.loginBtn = this._nodeTab.btnLogin;
this.loginBtn.active = false;
this.guestLoginBtn = this._nodeTab.guestBtnLogin;
this.guestLoginBtn.active = false;
this.appVersion.string = `app version: ${prodConfig.appVersion}`;
this.VideoPlayer = this._nodeTab.VideoPlayer.getComponent(VideoPlayer);
this.loginLabel = this._nodeTab.loginLabel.getComponent(Label);
this.guestLoginLabel = this._nodeTab.guestloginLabel.getComponent(Label);
this.desc = this._nodeTab.Desc.getComponent(Label);
// 设置视频为静音,提高移动端自动播放成功率
@@ -113,6 +122,7 @@ export class PreloadUI extends Component {
this
);
GButton.BandClick(this.guestLoginBtn, this.onGuestLogin, this);
GButton.BandClick(this.loginBtn, this.onLogin, this);
this.jinduBar = this.node.getChildByName("jinduBar");
@@ -133,14 +143,19 @@ export class PreloadUI extends Component {
switch (LanguageUtils.CurrentLanguage) {
case LanguageType.CN:
this.loginLabel.string = "登录";
this.guestLoginLabel.string = "游客登陆";
this.desc.string = "释放你的所有欲望";
break;
case LanguageType.EN:
this.loginLabel.string = "LOG IN";
this.guestLoginLabel.string = "GUEST LOG IN";
this.desc.string = "Unleash All Your Desires";
break;
case LanguageType.HI:
this.loginLabel.string = "लॉग इन";
this.guestLoginLabel.string = "ज़ियारती लॉगिन";
this.desc.string = "अपनी सारी इच्छाओं को मुक्त करें";
break;
default:
@@ -301,7 +316,10 @@ export class PreloadUI extends Component {
startloginProcess() {
this.jinduBar.active = false;
this.preloadFinish = true;
this.loginBtn.active = true;
//TODO:获取当前有无账号信息
this.loginBtn.active = false;
this.guestLoginBtn.active = true;
}
//显示加载进度
@@ -316,7 +334,7 @@ export class PreloadUI extends Component {
// ResManager.I.goCustomScene("LoginScene");
// }
async onLogin() {
async onGuestLogin() {
// 用户交互时尝试播放视频(如果自动播放失败)
if (!this.videoPlayed && this.VideoPlayer) {
logger.log("PreloadUI: User interaction detected, trying to play video");
@@ -326,8 +344,20 @@ export class PreloadUI extends Component {
const deviceId = DeviceIdService.I.id;
const os = MachineInfoService.I.getMachineOs();
// 获取fbCode,如果有则表示从落地页进来的
const qs = new URLSearchParams(window.location.search);
const fbCode = qs.get("fbCode");
// 保存fbCode到本地
if (fbCode) {
sys.localStorage.setItem("fbCode", fbCode);
// 上报事件
const reqData = {
point: 4, // 4: 进入游戏
fbCode: fbCode,
};
AuthService.I.pointEvent(reqData);
}
const reqData = {
platType: "guest",
userId: fbCode ? fbCode : deviceId,
@@ -361,6 +391,10 @@ export class PreloadUI extends Component {
}
}
async onLogin() {
ViewManager.I.openMainView("loginPanel/LoginPanel");
}
// 请求个人数据
private async reqMyInfo() {
const reqData = {};
+63 -1
View File
@@ -28,6 +28,7 @@ export class MainController {
private isDailyRecommendPreloaded: boolean = false;
private isRecommendListPreloaded: boolean = false;
private isShopListPreloaded: boolean = false;
private isBookmarkListPreloaded: boolean = false;
/**
* 初始化并预加载数据
@@ -41,6 +42,7 @@ export class MainController {
//this.preloadDailyRecommend(),
this.preloadRecommendList(true, 1, 10),
this.preloadShopList(),
this.preloadBookmarkList(),
]);
logger.log("[MainController] 数据预加载完成");
@@ -180,6 +182,37 @@ export class MainController {
}
}
/**
* 预加载收藏列表
*/
async preloadBookmarkList(): Promise<boolean> {
if (this.isBookmarkListPreloaded) {
logger.log("[MainController] 收藏列表数据已预加载");
return true;
}
try {
logger.log("[MainController] 开始预加载收藏列表数据");
const reqData = {};
const res = await GirlService.I.reqBookmarkGirlList(reqData);
if (res && res.code === proto.cs.EnmRetCode.SUCCESS) {
// 保存数据到DataManager
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
girlData.setBookmarkGirlList(res.data);
this.isBookmarkListPreloaded = true;
logger.log("[MainController] 收藏列表数据预加载成功");
return true;
} else {
logger.warn("[MainController] 收藏列表数据预加载失败:", res);
return false;
}
} catch (error) {
logger.error("[MainController] 收藏列表数据预加载异常:", error);
return false;
}
}
/**
* 检查数据是否已预加载
*/
@@ -188,7 +221,8 @@ export class MainController {
this.isThemeDataPreloaded &&
this.isDailyRecommendPreloaded &&
this.isRecommendListPreloaded &&
this.isShopListPreloaded
this.isShopListPreloaded &&
this.isBookmarkListPreloaded
);
}
@@ -201,6 +235,7 @@ export class MainController {
dailyRecommend: this.isDailyRecommendPreloaded,
recommendList: this.isRecommendListPreloaded,
shopList: this.isShopListPreloaded,
bookmarkList: this.isBookmarkListPreloaded,
allComplete: this.isDataPreloaded(),
};
}
@@ -213,6 +248,7 @@ export class MainController {
this.isDailyRecommendPreloaded = false;
this.isRecommendListPreloaded = false;
this.isShopListPreloaded = false;
this.isBookmarkListPreloaded = false;
logger.log("[MainController] 预加载状态已重置");
}
@@ -296,4 +332,30 @@ export class MainController {
return false;
}
}
/**
* 强制刷新收藏列表数据
*/
async refreshBookmarkList(): Promise<boolean> {
logger.log("[MainController] 开始强制刷新收藏列表数据");
try {
const reqData = {};
const res = await GirlService.I.reqBookmarkGirlList(reqData);
if (res && res.code === proto.cs.EnmRetCode.SUCCESS) {
// 保存数据到DataManager
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
girlData.setBookmarkGirlList(res.data);
this.isBookmarkListPreloaded = true;
logger.log("[MainController] 收藏列表数据刷新成功");
return true;
} else {
logger.warn("[MainController] 收藏列表数据刷新失败:", res);
return false;
}
} catch (error) {
logger.error("[MainController] 收藏列表数据刷新异常:", error);
return false;
}
}
}
+29 -1
View File
@@ -1533,7 +1533,35 @@ export class GirlData extends BaseData {
}
// 返回结果
return result;
}
}
/** 获取按收藏时间排序的收藏技师ID(最新的在前) */
public getAllBookmarkGirlIdsSortedByTime(): number[] {
const result: Array<{
girlId: number;
bookmarkTime: number;
category: string;
}> = [];
const seen = new Set<number>(); // 用来去重
const cats = this.ensureCategories();
// 收集所有收藏的女孩ID及其收藏时间
for (const [categoryId, bucket] of cats.entries()) {
for (const girlId of bucket.girlIds) {
if (this.isBookmarkGirl(categoryId, girlId) && !seen.has(girlId)) {
seen.add(girlId); // 标记已加入
const bookmarkTime = this.getBookmarkTime(categoryId, girlId);
result.push({ girlId, bookmarkTime, category: categoryId });
}
}
}
// 按收藏时间降序排序(最新的在前)
result.sort((a, b) => b.bookmarkTime - a.bookmarkTime);
// 返回排序后的ID数组
return result.map((item) => item.girlId);
}
/** --------------------------------------------------------- 技师的其他数据 --------------------------------------------------------- */
@@ -3,6 +3,7 @@
*/
import { BaseData } from "./BaseData";
import proto from 'db://assets/Scripts/proto/proto.pb.js';
import { logger } from "db://assets/Scripts/Main/Common/Logger";
export class GirlFavorabilityData extends BaseData {
// id
@@ -66,7 +67,7 @@ export class GirlFavorabilityData extends BaseData {
/** 保存 收藏时间,时间戳,秒 */
public setBookmarkTime(value: number): void {
this.bookmarkTime = value;
// logger.log("设置角色 ", this.id, " 的收藏时间:", this.bookmarkTime);
logger.log("设置角色 ", this.id, " 的收藏时间:", this.bookmarkTime);
}
/** 是否已经收藏 */
@@ -29,4 +29,8 @@ export class AuthService implements IAuthService {
public async login(req: proto.cs.ICSLoginReq): Promise<ApiResponse<proto.cs.ICSLoginRes>> {
return this.impl.login(req);
}
/** 上报事件 */
public async pointEvent(req: proto.cs.ICSPointEventReq): Promise<ApiResponse<proto.cs.ICSPointEventRes>> {
return this.impl.pointEvent(req);
}
}
@@ -17,4 +17,15 @@ export class HttpAuthService implements IAuthService {
};
return this.api.call(ep, req);
}
/** 上报事件 */
async pointEvent(req: proto.cs.ICSPointEventReq): Promise<ApiResponse<proto.cs.ICSPointEventRes>> {
const ep: Endpoint<proto.cs.ICSPointEventReq, proto.cs.ICSPointEventRes> = {
path: "api/logic/pointEvent",
method: "POST",
codec: "json",
needsAuth: false,
};
return this.api.call(ep, req);
}
}
@@ -4,4 +4,7 @@ import proto from "db://assets/Scripts/proto/proto.pb.js";
export interface IAuthService {
// 登录
login(req: proto.cs.ICSLoginReq): Promise<ApiResponse<proto.cs.ICSLoginRes>>;
// 上报事件
pointEvent(req: proto.cs.ICSPointEventReq): Promise<ApiResponse<proto.cs.ICSPointEventRes>>;
}
@@ -40,4 +40,11 @@ export class MockAuthService implements IAuthService {
return this.ok(res);
}
/** 上报事件 */
async pointEvent(req: proto.cs.ICSPointEventReq): Promise<ApiResponse<proto.cs.ICSPointEventRes>> {
// 延时
await this.delay(150);
return this.ok({});
}
}
@@ -0,0 +1,177 @@
import {
_decorator,
Component,
Node,
instantiate,
tween,
Vec3,
Label,
} from "cc";
import li_BaseView from "db://assets/Scripts/Main/Common/li_BaseView";
import Utils from "db://assets/Scripts/Main/Common/Utils";
import { GButton } from "db://assets/Scripts/Main/Common/GButton";
import { GirlListItem } from "../../uiitems/GirlListItem";
import { GirlService } from "db://assets/Scripts/chat18x/network/services/GirlService";
import { DataManager, DataId } from "../../data/DataManager";
import { GirlData } from "../../data/GirlData";
import proto from "db://assets/Scripts/proto/proto.pb.js";
import { NavigationManager, PanelType } from "../../manager/NavigationManager";
import { ThemeData } from "../../data/ThemeData";
import LanguageUtils from "../../../Main/Common/LanguageUtils";
import HXZ_ScrollViewList from "db://assets/Scripts/Main/Common/ScrollViewList";
import { logger } from "db://assets/Scripts/Main/Common/Logger";
const { ccclass, property } = _decorator;
@ccclass("GirlCollectionPanel")
export class GirlCollectionPanel extends li_BaseView {
private _nodeTab: any = {};
itemInst: GirlListItem;
scrollView: Node;
// 虚拟列表组件
private scrollViewList: HXZ_ScrollViewList = null;
// 收藏ID缓存(按收藏时间排序)
private cachedBookmarkIds: number[] = [];
private title1: Label;
private title2: Label;
onLoadCT() {
this.node.active = false;
this.scheduleOnce(() => {
this.node.active = true;
}, 0.1);
Utils.parseNode(this.node, this._nodeTab);
this.registerListener();
this.itemInst = this._nodeTab.BubbleItem.getComponent(GirlListItem);
this.itemInst.node.active = false;
this.scrollView = this._nodeTab.ScrollView;
this.title1 = this._nodeTab.title1.getComponent(Label);
this.title2 = this._nodeTab.title2.getComponent(Label);
// 获取虚拟列表组件
if (this.scrollView) {
this.scrollViewList = this.scrollView.getComponent(HXZ_ScrollViewList);
if (!this.scrollViewList) {
logger.warn(
"[GirlCollectionPanel] content 父节点缺少 HXZ_ScrollViewList 组件,请在编辑器中添加"
);
} else {
logger.log("[GirlCollectionPanel] 虚拟列表组件初始化成功");
}
}
this.refresh();
}
async refresh() {
logger.log("[GirlCollectionPanel] 开始刷新收藏列表");
// 获取收藏数据
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
// 获取按时间排序的收藏ID列表(最新的在前)
this.cachedBookmarkIds = girlData.getAllBookmarkGirlIdsSortedByTime();
logger.log(
`[GirlCollectionPanel] 收藏列表共 ${this.cachedBookmarkIds.length}`
);
// 更新标题为"我的收藏"
// TODO: 可以使用多语言key替换
// 使用虚拟列表:设置总数量,触发自动渲染
if (this.scrollViewList) {
this.scrollViewList.numItems = this.cachedBookmarkIds.length;
logger.log(
`[GirlCollectionPanel] 虚拟列表 numItems 已设置为 ${this.cachedBookmarkIds.length}`
);
} else {
logger.warn(
"[GirlCollectionPanel] scrollViewList 未初始化,无法显示列表"
);
}
}
/**
* 虚拟列表渲染回调
* 该方法需要在 Cocos Creator 编辑器中配置到 HXZ_ScrollViewList 的 renderEvent
* @param itemNode 虚拟列表传入的节点
* @param index 数据索引
*/
onRenderCollectionItem(itemNode: Node, index: number): void {
if (index < this.cachedBookmarkIds.length) {
const girlId = this.cachedBookmarkIds[index];
const item = itemNode.getComponent(GirlListItem);
if (!item) {
logger.error(
`[GirlCollectionPanel] 节点缺少 GirlListItem 组件,index: ${index}`
);
return;
}
// 获取女孩的分类
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
const category = girlData.getGrilCategoryById(girlId);
if (category === 0) {
logger.warn(
`[GirlCollectionPanel] 无法获取 girlId=${girlId} 的分类信息`
);
return;
}
// 刷新数据
item.refreshData(category, girlId, this);
itemNode.active = true;
logger.log(
`[GirlCollectionPanel] 渲染 item: index=${index}, girlId=${girlId}, category=${category}`
);
}
}
private addSlideInAnimation(itemNode: Node, index: number) {
// 保存节点的目标位置
const targetPosition = itemNode.getPosition();
// 设置初始位置为屏幕右侧外(偏移300像素)
const startPosition = new Vec3(
targetPosition.x + 300,
targetPosition.y,
targetPosition.z
);
itemNode.setPosition(startPosition);
// 添加递进延时,每个item延迟0.05秒
const delay = index * 0.05;
// 执行滑入动画
tween(itemNode)
.delay(delay)
.to(0.4, { position: targetPosition }, { easing: "cubicOut" })
.start();
}
hide() {
this.node.active = false;
}
private registerListener() {
GButton.BandClick(this._nodeTab.ReturnBtn, this.Return, this);
}
Return() {
NavigationManager.Instance.closeSubPanel(this);
}
onDestroy() {
// 虚拟列表会自动管理对象池,只需清理数据缓存
this.cachedBookmarkIds = [];
logger.log("[GirlCollectionPanel] 组件已销毁");
}
}
@@ -0,0 +1 @@
{"ver":"4.0.24","importer":"typescript","imported":true,"uuid":"4338e1aa-c1fa-43e8-ac88-71d0f9c141d9","files":[],"subMetas":{},"userData":{}}
@@ -10,6 +10,7 @@ import {
tween,
view,
screen,
Button,
} from "cc";
import li_BaseView from "db://assets/Scripts/Main/Common/li_BaseView";
import ResManager from "db://assets/Scripts/Main/Manager/ResManager";
@@ -30,6 +31,7 @@ import { GirlService } from "db://assets/Scripts/chat18x/network/services/GirlSe
import proto from "db://assets/Scripts/proto/proto.pb.js";
import { SceneBgVideoLayer } from "../../../Sub/UI/SceneBgVideoLayer";
import { logger } from "db://assets/Scripts/Main/Common/Logger";
import { GButton } from "../../../Main/Common/GButton";
const { ccclass, property } = _decorator;
@@ -87,10 +89,15 @@ export class GirlDetailPanel extends li_BaseView {
ImgVidSelect: Node;
ImgVidFakePos: Node;
AddFavoriteBtn: Node;
// 跟随控制相关属性
private isFollowing: boolean = true; // 当前是否处于跟随状态
private lastFakePosPosition: Vec3 = new Vec3(); // 记录上次的位置
// 收藏请求状态标记,防止重复点击
private isRequestingBookmark: boolean = false;
protected onEnable(): void {
this.refresh();
}
@@ -101,6 +108,7 @@ export class GirlDetailPanel extends li_BaseView {
this.ImgVidSelect = this._nodeTab.ImgVidSelect;
this.ImgVidFakePos = this._nodeTab.ImgVidFakePos;
this.AddFavoriteBtn = this._nodeTab.AddFavoriteBtn;
// 初始化位置跟随
if (this.ImgVidFakePos) {
@@ -111,18 +119,15 @@ export class GirlDetailPanel extends li_BaseView {
Utils.addInnerEL(InnerMsgCode.LanguageChange, this, () => {
this.girlName.string = LanguageUtils.getText(this.nameKey);
let desc = "";
const tags = LanguageUtils.getText(this.tagKey);
// for (let i = 0; i < tags.length; i++) {
// if (i != 0) desc += "\n";
// desc += tags[i];
// }
this.tags.string = tags;
this.desc.string = LanguageUtils.getText(this.descKey);
});
this.imgToggle.callback = this.bindImgToggle.bind(this);
this.videoToggle.callback = this.bindVideoToggle.bind(this);
GButton.BandClick(this.AddFavoriteBtn, this.OnClickAddFavoriteBtn, this);
}
setVideEnable(enable: boolean) {
@@ -263,9 +268,44 @@ export class GirlDetailPanel extends li_BaseView {
this.id,
resIds
);
// 刷新收藏按钮状态
this.refreshAddFavoriteBtn();
}
}
/**
* 刷新收藏按钮状态
*/
refreshAddFavoriteBtn() {
if (!this.AddFavoriteBtn) {
return;
}
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
const isBookmarked = girlData.isBookmarkGirl(
this.category.toString(),
this.id
);
// 查找收藏按钮的状态节点(通常命名为 "selected" 或 "checked"
// 如果有这样的子节点,根据收藏状态显示/隐藏
const selectedNode = this.AddFavoriteBtn.getChildByName("selected");
if (selectedNode) {
selectedNode.active = isBookmarked;
}
// 如果有未选中状态的节点
const unselectedNode = this.AddFavoriteBtn.getChildByName("unselected");
if (unselectedNode) {
unselectedNode.active = !isBookmarked;
}
logger.log(
`[GirlDetailPanel] 收藏按钮状态已刷新: girlId=${this.id}, isBookmarked=${isBookmarked}`
);
}
bindImgToggle() {
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
let resIds = girlData.getAllDisplayGrilPhotoId(
@@ -348,6 +388,78 @@ export class GirlDetailPanel extends li_BaseView {
// }
}
/**
* 点击收藏按钮
*/
async OnClickAddFavoriteBtn() {
// 防止重复点击
if (this.isRequestingBookmark) {
logger.warn("[GirlDetailPanel] 收藏请求进行中,请稍候");
return;
}
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
const isBookmarked = girlData.isBookmarkGirl(
this.category.toString(),
this.id
);
logger.log(
`[GirlDetailPanel] 点击收藏按钮: girlId=${this.id}, 当前状态=${
isBookmarked ? "已收藏" : "未收藏"
}`
);
try {
this.isRequestingBookmark = true;
// 调用收藏接口
const reqData = {
girlId: this.id,
cancel: isBookmarked, // true=取消收藏, false=添加收藏
};
const res = await GirlService.I.reqBookmarkGirl(reqData);
if (res && res.code === proto.cs.EnmRetCode.SUCCESS) {
// 更新本地收藏时间
if (isBookmarked) {
// 取消收藏:设置为0
girlData.setBookmarkTime(this.category.toString(), this.id, 0);
logger.log(`[GirlDetailPanel] 取消收藏成功: girlId=${this.id}`);
} else {
// 添加收藏:设置为当前时间戳(秒)
const currentTimestamp = Math.floor(Date.now() / 1000);
girlData.setBookmarkTime(
this.category.toString(),
this.id,
currentTimestamp
);
logger.log(
`[GirlDetailPanel] 添加收藏成功: girlId=${this.id}, timestamp=${currentTimestamp}`
);
}
// 刷新按钮状态
this.refreshAddFavoriteBtn();
// TODO: 可以在这里添加UI提示,比如显示Toast
// Utils.showToast(isBookmarked ? "已取消收藏" : "收藏成功");
} else {
logger.warn(
`[GirlDetailPanel] 收藏操作失败: girlId=${this.id}, code=${res?.code}`
);
// TODO: 显示错误提示
// Utils.showToast("操作失败,请稍后重试");
}
} catch (error) {
logger.error(`[GirlDetailPanel] 收藏操作异常: girlId=${this.id}`, error);
// TODO: 显示错误提示
// Utils.showToast("网络错误,请稍后重试");
} finally {
this.isRequestingBookmark = false;
}
}
returnBtn() {
// GirlDetailPanel现在是subpanel,关闭自己即可
NavigationManager.Instance.closeSubPanel(this);
@@ -0,0 +1,164 @@
import { _decorator, EditBox } from "cc";
import Utils from "../../../Main/Common/Utils";
import li_BaseView from "../../../Main/Common/li_BaseView";
import { GButton } from "../../../Main/Common/GButton";
import { ViewManager } from "../../../Main/Manager/ViewManager";
const { ccclass, property } = _decorator;
/**
* 登录页面
* 预制体位于 resources/loginPanel/LoginPanel
*/
@ccclass("LoginPanel")
export class LoginPanel extends li_BaseView {
private _nodeTab: any = {};
/**
* 组件初始化时调用
*/
onLoadCT(): void {
// 解析节点,将子节点存储到 _nodeTab 中
Utils.parseNode(this.node, this._nodeTab);
// 初始化UI
this.initUI();
// 注册事件监听
this.registerListener();
}
/**
* 初始化UI
*/
private initUI(): void {
// 这里可以初始化一些默认值
// 例如:清空输入框等
}
/**
* 注册事件监听
*/
private registerListener(): void {
// 绑定登录按钮点击事件
if (this._nodeTab.LoginBtn) {
GButton.BandClick(this._nodeTab.LoginBtn, this.onClickLogin, this);
}
// 绑定注册按钮点击事件
if (this._nodeTab.registerBtn) {
GButton.BandClick(this._nodeTab.registerBtn, this.onClickRegister, this);
}
// 绑定忘记密码按钮点击事件
if (this._nodeTab.forgetPasswordBtn) {
GButton.BandClick(
this._nodeTab.forgetPasswordBtn,
this.onClickForgetPassword,
this
);
}
// 绑定关闭按钮点击事件
if (this._nodeTab.closeBtn) {
GButton.BandClick(this._nodeTab.closeBtn, this.onClickClose, this);
}
}
/**
* 点击登录按钮
*/
private onClickLogin(): void {
// 获取邮箱和密码输入框
const emailInput = this._nodeTab.EmailInput?.getComponent(EditBox);
const passwordInput = this._nodeTab.PasswordInput?.getComponent(EditBox);
if (!emailInput || !passwordInput) {
console.error("未找到邮箱或密码输入框");
return;
}
const email = emailInput.string.trim();
const password = passwordInput.string.trim();
// 验证输入
if (!email) {
console.log("请输入邮箱");
// TODO: 显示提示信息
return;
}
if (!this.isValidEmail(email)) {
console.log("请输入有效的邮箱地址");
// TODO: 显示提示信息
return;
}
if (!password) {
console.log("请输入密码");
// TODO: 显示提示信息
return;
}
// TODO: 调用后端接口进行登录
console.log("登录:", email, password);
this.requestLogin(email, password);
}
/**
* 调用后端登录接口
*/
private requestLogin(email: string, password: string): void {
// TODO: 实现后端登录接口调用
// 示例:
// const loginData = {
// email: email,
// password: password
// };
// NetworkManager.request('/api/login', loginData, (response) => {
// if (response.success) {
// // 登录成功,保存token等信息
// // LoginData.I.token = response.token;
// // 关闭登录界面,跳转到主界面
// this.close();
// } else {
// // 登录失败,显示错误信息
// console.error('登录失败:', response.message);
// }
// });
console.log("TODO: 实现登录接口调用");
}
/**
* 点击注册按钮
*/
private onClickRegister(): void {
// 打开注册页面
ViewManager.I.openMainView("loginPanel/RegisterPanel");
}
/**
* 点击忘记密码按钮
*/
private onClickForgetPassword(): void {
// 打开安全验证页面
ViewManager.I.openMainView("loginPanel/SafeCheckPanel");
}
/**
* 点击关闭按钮
*/
private onClickClose(): void {
// 关闭当前界面
this.close();
}
/**
* 验证邮箱格式
*/
private isValidEmail(email: string): boolean {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "ce7e3167-8ed8-4e5c-921b-0c91aeaf36c4",
"files": [],
"subMetas": {},
"userData": {}
}
@@ -0,0 +1,162 @@
import { _decorator, EditBox } from "cc";
import Utils from "../../../Main/Common/Utils";
import li_BaseView from "../../../Main/Common/li_BaseView";
import { GButton } from "../../../Main/Common/GButton";
const { ccclass, property } = _decorator;
/**
* 修改密码页面
* 预制体位于 resources/loginPanel/NewPasswordPanel
*/
@ccclass("NewPasswordPanel")
export class NewPasswordPanel extends li_BaseView {
private _nodeTab: any = {};
// 用于存储从安全验证页面传递过来的邮箱和验证码信息
private _email: string = "";
private _verificationCode: string = "";
/**
* 组件初始化时调用
*/
onLoadCT(): void {
// 解析节点,将子节点存储到 _nodeTab 中
Utils.parseNode(this.node, this._nodeTab);
// 初始化UI
this.initUI();
// 注册事件监听
this.registerListener();
}
/**
* 打开界面时传入的数据
*/
openUIData(data: any): void {
if (data) {
this._email = data.email || "";
this._verificationCode = data.code || "";
}
}
/**
* 初始化UI
*/
private initUI(): void {
// 清空输入框
const password1Input = this._nodeTab.Password1Input?.getComponent(EditBox);
const password2Input = this._nodeTab.Password2Input?.getComponent(EditBox);
if (password1Input) {
password1Input.string = "";
}
if (password2Input) {
password2Input.string = "";
}
}
/**
* 注册事件监听
*/
private registerListener(): void {
// 绑定确定按钮点击事件
if (this._nodeTab.ConfirmBtn) {
GButton.BandClick(this._nodeTab.ConfirmBtn, this.onClickConfirm, this);
}
// 绑定关闭按钮点击事件
if (this._nodeTab.CloseBtn) {
GButton.BandClick(this._nodeTab.CloseBtn, this.onClickClose, this);
}
}
/**
* 点击确定按钮
*/
private onClickConfirm(): void {
// 获取两个密码输入框
const password1Input = this._nodeTab.Password1Input?.getComponent(EditBox);
const password2Input = this._nodeTab.Password2Input?.getComponent(EditBox);
if (!password1Input || !password2Input) {
console.error("未找到密码输入框");
return;
}
const password1 = password1Input.string.trim();
const password2 = password2Input.string.trim();
// 验证输入
if (!password1) {
console.log("请输入新密码");
// TODO: 显示提示信息
return;
}
if (!password2) {
console.log("请再次输入新密码");
// TODO: 显示提示信息
return;
}
if (password1.length < 6) {
console.log("密码长度不能少于6位");
// TODO: 显示提示信息
return;
}
if (password1 !== password2) {
console.log("两次输入的密码不一致");
// TODO: 显示提示信息
return;
}
// TODO: 调用后端接口修改密码
console.log("修改密码:", password1);
this.requestChangePassword(password1);
}
/**
* 调用后端修改密码接口
*/
private requestChangePassword(newPassword: string): void {
// TODO: 实现后端修改密码接口调用
// 示例:
// const data = {
// email: this._email,
// code: this._verificationCode,
// newPassword: newPassword
// };
// NetworkManager.request('/api/changePassword', data, (response) => {
// if (response.success) {
// // 修改密码成功
// console.log('密码修改成功');
// // TODO: 显示成功提示
// // 关闭当前界面
// this.close();
// // 可以选择跳转回登录页面
// // ViewManager.I.openMainView('loginPanel/LoginPanel');
// } else {
// // 修改密码失败,显示错误信息
// console.error('密码修改失败:', response.message);
// // TODO: 显示错误提示
// }
// });
console.log("TODO: 实现修改密码接口调用");
console.log("邮箱:", this._email);
console.log("验证码:", this._verificationCode);
console.log("新密码:", newPassword);
}
/**
* 点击关闭按钮
*/
private onClickClose(): void {
// 关闭当前界面
this.close();
}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "e11c6ea1-b27a-4e49-8494-baf1a534fc75",
"files": [],
"subMetas": {},
"userData": {}
}
@@ -162,6 +162,14 @@ export class PersonalPanel extends li_BaseView {
}
private openFavorites() {
TipsPanel.show(LanguageUtils.getText("rankpanel.comingsoon"));
NavigationManager.Instance.openSubPanel(
"GirlCollectionPanel",
this.node,
null,
{
openAnimation: PageTransitionType.SLIDE_LEFT,
closeAnimation: PageTransitionType.SLIDE_RIGHT,
}
);
}
}
+370 -2
View File
@@ -1,6 +1,374 @@
import { _decorator, Component, Node } from "cc";
import { _decorator, Component, Node, ScrollView } from "cc";
import li_BaseView from "../../../Main/Common/li_BaseView";
import { GirlService } from "../../network/services/GirlService";
import proto from "db://assets/Scripts/proto/proto.pb.js";
import { DataManager, DataId } from "../../data/DataManager";
import { GirlData } from "../../data/GirlData";
import Utils from "../../../Main/Common/Utils";
import { GButton } from "../../../Main/Common/GButton";
import HXZ_ScrollViewList from "../../../Main/Common/ScrollViewList";
import { RankItem } from "../../uiitems/RankItem";
import { logger } from "../../../Main/Common/Logger";
const { ccclass, property } = _decorator;
@ccclass("RankPanel")
export class RankPanel extends li_BaseView {}
export class RankPanel extends li_BaseView {
private _nodeTab: any = {};
// 虚拟列表组件
private scrollViewList: HXZ_ScrollViewList = null;
// 排行榜项模板
private rankItemInst: RankItem;
// 当前选中的榜单类型
private currentRankType: proto.cs.EnmRankType = proto.cs.EnmRankType.ERT_Day;
// 分页状态
private currentPage: number = 1;
private pageLimit: number = 20;
private isLoadingMore: boolean = false;
private hasMoreData: boolean = true;
// 记录上次触发加载的 ID,避免重复触发
private lastLoadTriggerId: number = -1;
// 榜单切换按钮
private dayRankBtn: Node;
private weekRankBtn: Node;
private monthRankBtn: Node;
// 滚动视图
private rankScroll: Node;
private rankScrollView: ScrollView = null;
onLoadCT() {
Utils.parseNode(this.node, this._nodeTab);
// 获取榜单切换按钮
this.dayRankBtn = this._nodeTab.dayRankBtn;
this.weekRankBtn = this._nodeTab.weekRankBtn;
this.monthRankBtn = this._nodeTab.monthRankBtn;
// 获取滚动视图
this.rankScroll = this._nodeTab.rankScroll;
// 获取推荐列表的 ScrollView 组件
if (this.rankScroll) {
this.rankScrollView = this.rankScroll.getComponent(ScrollView);
// 获取虚拟列表组件(需要在场景中手动添加 HXZ_ScrollViewList 组件)
this.scrollViewList = this.rankScroll.getComponent(HXZ_ScrollViewList);
if (!this.scrollViewList) {
logger.warn(
"[RankPanel] rankScroll 节点缺少 HXZ_ScrollViewList 组件,请在编辑器中添加"
);
}
}
// 获取排行榜项模板
this.rankItemInst = this._nodeTab.RankItem?.getComponent(RankItem);
if (this.rankItemInst) {
this.rankItemInst.node.active = false;
}
this.registerListener();
}
openUIDataCT(data: any): void {
// 默认打开日榜
this.switchRankType(proto.cs.EnmRankType.ERT_Day);
}
/**
* 注册事件监听
*/
private registerListener() {
// 榜单切换按钮
if (this.dayRankBtn) {
GButton.BandClick(this.dayRankBtn, this.openDayRank, this);
}
if (this.weekRankBtn) {
GButton.BandClick(this.weekRankBtn, this.openWeekRank, this);
}
if (this.monthRankBtn) {
GButton.BandClick(this.monthRankBtn, this.openMonthRank, this);
}
// 注册虚拟列表滚动事件(延迟到下一帧,确保虚拟列表已初始化)
this.scheduleOnce(() => {
if (this.scrollViewList) {
// 监听 scrolling 事件,通过滚动偏移量检测是否接近底部
this.scrollViewList.node.on("scrolling", this.onRankScrolling, this);
logger.log("[RankPanel] 虚拟列表滚动事件已绑定");
} else {
logger.warn("[RankPanel] 无法绑定滚动事件,scrollViewList 未初始化");
}
}, 0.1);
}
/**
* 虚拟列表渲染回调
* 该方法需要在 Cocos Creator 编辑器中配置到 HXZ_ScrollViewList 的 renderEvent
* @param itemNode 虚拟列表传入的节点
* @param index 数据索引
*/
onRenderRankItem(itemNode: Node, index: number): void {
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
const girlIDs = girlData.getRankIdsByType(this.currentRankType);
if (index < girlIDs.length) {
const girlId = girlIDs[index];
const item = itemNode.getComponent(RankItem);
if (!item) {
logger.error(`[RankPanel] 节点缺少 RankItem 组件,index: ${index}`);
return;
}
// 确保节点已初始化
if (!item._initialized) {
item.init();
}
// 刷新数据(index + 1 作为排名序号)
item.refresh(girlId, index + 1);
itemNode.active = true;
}
}
/**
* 打开日榜
*/
openDayRank() {
this.switchRankType(proto.cs.EnmRankType.ERT_Day);
}
/**
* 打开周榜
*/
openWeekRank() {
this.switchRankType(proto.cs.EnmRankType.ERT_Week);
}
/**
* 打开月榜
*/
openMonthRank() {
this.switchRankType(proto.cs.EnmRankType.ERT_Month);
}
/**
* 切换榜单类型
* @param rankType 榜单类型
*/
private async switchRankType(rankType: proto.cs.EnmRankType) {
// 如果是同一个榜单,不重复请求
if (
this.currentRankType === rankType &&
this.scrollViewList?.numItems > 0
) {
logger.log(`[RankPanel] 当前已是该榜单类型: ${rankType}`);
this.updateTabState(rankType);
return;
}
this.currentRankType = rankType;
// 重置分页状态
this.currentPage = 1;
this.hasMoreData = true;
this.isLoadingMore = false;
this.lastLoadTriggerId = -1;
// 请求榜单数据
await this.reqGirlRankData(rankType);
// 更新虚拟列表
if (this.scrollViewList) {
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
const girlIDs = girlData.getRankIdsByType(rankType);
this.scrollViewList.numItems = girlIDs.length;
logger.log(
`[RankPanel] 切换到榜单类型 ${rankType},共 ${girlIDs.length}`
);
} else {
logger.warn("[RankPanel] scrollViewList 未初始化");
}
// 更新标签页状态
this.updateTabState(rankType);
}
/**
* 更新标签页状态
* @param rankType 当前榜单类型
*/
private updateTabState(rankType: proto.cs.EnmRankType) {
if (this.dayRankBtn && this.dayRankBtn.children.length >= 2) {
this.dayRankBtn.children[0].active =
rankType !== proto.cs.EnmRankType.ERT_Day;
this.dayRankBtn.children[1].active =
rankType === proto.cs.EnmRankType.ERT_Day;
}
if (this.weekRankBtn && this.weekRankBtn.children.length >= 2) {
this.weekRankBtn.children[0].active =
rankType !== proto.cs.EnmRankType.ERT_Week;
this.weekRankBtn.children[1].active =
rankType === proto.cs.EnmRankType.ERT_Week;
}
if (this.monthRankBtn && this.monthRankBtn.children.length >= 2) {
this.monthRankBtn.children[0].active =
rankType !== proto.cs.EnmRankType.ERT_Month;
this.monthRankBtn.children[1].active =
rankType === proto.cs.EnmRankType.ERT_Month;
}
}
/**
* 滚动中回调,基于虚拟列表 displayData 检测并触发分页加载
* 当显示到接近已加载数据末尾时(倒数第3个),自动加载下一页
*/
private onRankScrolling(): void {
if (!this.scrollViewList) return;
// 获取虚拟列表的 displayData 和总数
const displayData = this.scrollViewList.displayData;
const numItems = this.scrollViewList.numItems;
// 检查数据有效性
if (!displayData || displayData.length === 0 || numItems === 0) return;
// 获取当前显示的最后一个 item 的 ID
const lastDisplayedId = displayData[displayData.length - 1].id;
// 触发条件:显示到倒数第 3 个 item 时开始加载下一页
const threshold = numItems - 3;
if (
lastDisplayedId >= threshold &&
lastDisplayedId > this.lastLoadTriggerId
) {
logger.log(
`[RankPanel] 接近末尾 (${lastDisplayedId}/${numItems}),触发加载第 ${
this.currentPage + 1
}`
);
// 记录本次触发的 ID,避免重复触发
this.lastLoadTriggerId = lastDisplayedId;
// 触发分页加载
this.loadMoreRankData();
}
}
/**
* 加载下一页排行榜数据
*/
private async loadMoreRankData(): Promise<void> {
// 防止重复加载
if (this.isLoadingMore) {
logger.log("[RankPanel] 正在加载中,跳过");
return;
}
// 检查是否还有更多数据
if (!this.hasMoreData) {
logger.log("[RankPanel] 没有更多数据了");
return;
}
try {
this.isLoadingMore = true;
this.currentPage++;
logger.log(`[RankPanel] 开始加载第 ${this.currentPage} 页排行榜数据`);
const reqData = {
rankType: this.currentRankType,
page: this.currentPage,
limit: this.pageLimit,
};
const res = await GirlService.I.reqGirlRankData(reqData);
if (res && res.code === proto.cs.EnmRetCode.SUCCESS) {
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
// 追加数据到 GirlData
girlData.addRankData(this.currentRankType, res.data);
// 检查是否还有更多数据
const girls = res.data.girls || [];
if (girls.length < this.pageLimit) {
this.hasMoreData = false;
logger.log("[RankPanel] 已加载所有排行榜数据");
}
// 使用虚拟列表:更新总数量,自动触发渲染
if (this.scrollViewList) {
const allGirlIDs = girlData.getRankIdsByType(this.currentRankType);
this.scrollViewList.numItems = allGirlIDs.length;
logger.log(
`[RankPanel] 第 ${this.currentPage} 页加载完成,新增 ${girls.length} 项,总计 ${allGirlIDs.length}`
);
} else {
logger.warn("[RankPanel] scrollViewList 未初始化,无法更新列表");
}
} else {
logger.warn("[RankPanel] 加载下一页排行榜数据失败:", res);
// 加载失败,回退页码
this.currentPage--;
}
} catch (error) {
logger.error("[RankPanel] 加载下一页排行榜数据异常:", error);
// 加载失败,回退页码
this.currentPage--;
} finally {
this.isLoadingMore = false;
}
}
/**
* 获取排行榜数据
* @param type 榜单类型
*/
private async reqGirlRankData(type: proto.cs.EnmRankType) {
const reqData = {
rankType: type,
page: 1,
limit: this.pageLimit,
};
let res = await GirlService.I.reqGirlRankData(reqData);
if (res && res.code === proto.cs.EnmRetCode.SUCCESS) {
const resData = res.data;
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
girlData.setGirlRank(type, resData);
// 检查是否还有更多数据
const girls = resData.girls || [];
if (girls.length < this.pageLimit) {
this.hasMoreData = false;
logger.log("[RankPanel] 首次加载数据不足一页,无需分页");
}
logger.log(
`[RankPanel] 榜单类型 ${type} 首次加载完成,共 ${girls.length}`
);
}
}
onDestroy(): void {
logger.log("[RankPanel] onDestroy called");
// 移除虚拟列表滚动事件监听
if (this.scrollViewList) {
this.scrollViewList.node.off("scrolling", this.onRankScrolling, this);
logger.log("[RankPanel] 虚拟列表滚动事件已移除");
}
}
}
@@ -0,0 +1,277 @@
import { _decorator, EditBox, Label } from "cc";
import Utils from "../../../Main/Common/Utils";
import li_BaseView from "../../../Main/Common/li_BaseView";
import { GButton } from "../../../Main/Common/GButton";
const { ccclass, property } = _decorator;
/**
* 注册页面
* 预制体位于 resources/loginPanel/RegisterPanel
*/
@ccclass("RegisterPanel")
export class RegisterPanel extends li_BaseView {
private _nodeTab: any = {};
// 验证码倒计时
private _countdown: number = 0;
private _countdownTimer: any = null;
/**
* 组件初始化时调用
*/
onLoadCT(): void {
// 解析节点,将子节点存储到 _nodeTab 中
Utils.parseNode(this.node, this._nodeTab);
// 初始化UI
this.initUI();
// 注册事件监听
this.registerListener();
}
/**
* 初始化UI
*/
private initUI(): void {
// 初始化发送按钮状态
this.updateSendBtnState(true);
}
/**
* 注册事件监听
*/
private registerListener(): void {
// 绑定发送验证码按钮点击事件
if (this._nodeTab.SendBtn) {
GButton.BandClick(this._nodeTab.SendBtn, this.onClickSendCode, this);
}
// 绑定注册按钮点击事件
if (this._nodeTab.RegisterBtn) {
GButton.BandClick(this._nodeTab.RegisterBtn, this.onClickRegister, this);
}
// 绑定关闭按钮点击事件
if (this._nodeTab.CloseBtn) {
GButton.BandClick(this._nodeTab.CloseBtn, this.onClickClose, this);
}
}
/**
* 点击发送验证码按钮
*/
private onClickSendCode(): void {
// 如果正在倒计时,不允许再次发送
if (this._countdown > 0) {
return;
}
// 获取邮箱输入框
const emailInput = this._nodeTab.EmailInput?.getComponent(EditBox);
if (!emailInput) {
console.error("未找到邮箱输入框");
return;
}
const email = emailInput.string.trim();
// 验证邮箱
if (!email) {
console.log("请输入邮箱");
// TODO: 显示提示信息
return;
}
if (!this.isValidEmail(email)) {
console.log("请输入有效的邮箱地址");
// TODO: 显示提示信息
return;
}
// TODO: 调用后端接口发送验证码
console.log("发送验证码到:", email);
this.requestSendCode(email);
}
/**
* 调用后端接口发送验证码
*/
private requestSendCode(email: string): void {
// TODO: 实现后端发送验证码接口调用
// 示例:
// const data = { email: email, type: 'register' };
// NetworkManager.request('/api/sendCode', data, (response) => {
// if (response.success) {
// // 发送成功,开始倒计时
// this.startCountdown();
// } else {
// // 发送失败,显示错误信息
// console.error('发送验证码失败:', response.message);
// }
// });
console.log("TODO: 实现发送验证码接口调用");
// 临时模拟发送成功,启动倒计时
this.startCountdown();
}
/**
* 开始倒计时
*/
private startCountdown(): void {
this._countdown = 60; // 60秒倒计时
this.updateSendBtnState(false);
this._countdownTimer = setInterval(() => {
this._countdown--;
if (this._countdown <= 0) {
// 倒计时结束
clearInterval(this._countdownTimer);
this._countdownTimer = null;
this.updateSendBtnState(true);
} else {
// 更新按钮文本
this.updateSendBtnState(false);
}
}, 1000);
}
/**
* 更新发送按钮状态
*/
private updateSendBtnState(canSend: boolean): void {
if (!this._nodeTab.SendBtn) return;
const label = this._nodeTab.SendBtn.getComponentInChildren(Label);
if (label) {
if (canSend) {
label.string = "发送验证码";
} else {
label.string = `${this._countdown}秒后重试`;
}
}
// TODO: 可以设置按钮的可交互状态
// const button = this._nodeTab.SendBtn.getComponent(Button);
// if (button) {
// button.interactable = canSend;
// }
}
/**
* 点击注册按钮
*/
private onClickRegister(): void {
// 获取输入框
const emailInput = this._nodeTab.EmailInput?.getComponent(EditBox);
const passwordInput = this._nodeTab.PasswordInput?.getComponent(EditBox);
const codeInput = this._nodeTab.CodeInput?.getComponent(EditBox);
if (!emailInput || !passwordInput || !codeInput) {
console.error("未找到输入框");
return;
}
const email = emailInput.string.trim();
const password = passwordInput.string.trim();
const code = codeInput.string.trim();
// 验证输入
if (!email) {
console.log("请输入邮箱");
// TODO: 显示提示信息
return;
}
if (!this.isValidEmail(email)) {
console.log("请输入有效的邮箱地址");
// TODO: 显示提示信息
return;
}
if (!password) {
console.log("请输入密码");
// TODO: 显示提示信息
return;
}
if (password.length < 6) {
console.log("密码长度不能少于6位");
// TODO: 显示提示信息
return;
}
if (!code) {
console.log("请输入验证码");
// TODO: 显示提示信息
return;
}
// TODO: 调用后端接口进行注册
console.log("注册:", email, password, code);
this.requestRegister(email, password, code);
}
/**
* 调用后端注册接口
*/
private requestRegister(email: string, password: string, code: string): void {
// TODO: 实现后端注册接口调用
// 示例:
// const data = {
// email: email,
// password: password,
// code: code
// };
// NetworkManager.request('/api/register', data, (response) => {
// if (response.success) {
// // 注册成功
// console.log('注册成功');
// // 关闭注册界面
// this.close();
// } else {
// // 注册失败,显示错误信息
// console.error('注册失败:', response.message);
// }
// });
console.log("TODO: 实现注册接口调用");
}
/**
* 点击关闭按钮
*/
private onClickClose(): void {
// 清理倒计时定时器
if (this._countdownTimer) {
clearInterval(this._countdownTimer);
this._countdownTimer = null;
}
// 关闭当前界面
this.close();
}
/**
* 验证邮箱格式
*/
private isValidEmail(email: string): boolean {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
/**
* 界面销毁时调用
*/
protected onDestroy(): void {
// 清理倒计时定时器
if (this._countdownTimer) {
clearInterval(this._countdownTimer);
this._countdownTimer = null;
}
}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "565b780d-f431-4e60-aa02-73df95d28a88",
"files": [],
"subMetas": {},
"userData": {}
}
@@ -0,0 +1,279 @@
import { _decorator, EditBox, Label } from "cc";
import Utils from "../../../Main/Common/Utils";
import li_BaseView from "../../../Main/Common/li_BaseView";
import { GButton } from "../../../Main/Common/GButton";
import { ViewManager } from "../../../Main/Manager/ViewManager";
const { ccclass, property } = _decorator;
/**
* 安全验证页面
* 预制体位于 resources/loginPanel/SafeCheckPanel
*/
@ccclass("SafeCheckPanel")
export class SafeCheckPanel extends li_BaseView {
private _nodeTab: any = {};
// 验证码倒计时
private _countdown: number = 0;
private _countdownTimer: any = null;
/**
* 组件初始化时调用
*/
onLoadCT(): void {
// 解析节点,将子节点存储到 _nodeTab 中
Utils.parseNode(this.node, this._nodeTab);
// 初始化UI
this.initUI();
// 注册事件监听
this.registerListener();
}
/**
* 初始化UI
*/
private initUI(): void {
// 初始化发送按钮状态
this.updateSendBtnState(true);
}
/**
* 注册事件监听
*/
private registerListener(): void {
// 绑定发送验证码按钮点击事件
if (this._nodeTab.SendBtn) {
GButton.BandClick(this._nodeTab.SendBtn, this.onClickSendCode, this);
}
// 绑定确定按钮点击事件
if (this._nodeTab.ConfirmBtn) {
GButton.BandClick(this._nodeTab.ConfirmBtn, this.onClickConfirm, this);
}
// 绑定关闭按钮点击事件
if (this._nodeTab.CloseBtn) {
GButton.BandClick(this._nodeTab.CloseBtn, this.onClickClose, this);
}
}
/**
* 点击发送验证码按钮
*/
private onClickSendCode(): void {
// 如果正在倒计时,不允许再次发送
if (this._countdown > 0) {
return;
}
// 获取邮箱输入框
const emailInput = this._nodeTab.EmailInput?.getComponent(EditBox);
if (!emailInput) {
console.error("未找到邮箱输入框");
return;
}
const email = emailInput.string.trim();
// 验证邮箱
if (!email) {
console.log("请输入邮箱");
// TODO: 显示提示信息
return;
}
if (!this.isValidEmail(email)) {
console.log("请输入有效的邮箱地址");
// TODO: 显示提示信息
return;
}
// TODO: 调用后端接口发送验证码
console.log("发送验证码到:", email);
this.requestSendCode(email);
}
/**
* 调用后端接口发送验证码
*/
private requestSendCode(email: string): void {
// TODO: 实现后端发送验证码接口调用
// 示例:
// const data = { email: email, type: 'forgetPassword' };
// NetworkManager.request('/api/sendCode', data, (response) => {
// if (response.success) {
// // 发送成功,开始倒计时
// this.startCountdown();
// } else {
// // 发送失败,显示错误信息
// console.error('发送验证码失败:', response.message);
// }
// });
console.log("TODO: 实现发送验证码接口调用");
// 临时模拟发送成功,启动倒计时
this.startCountdown();
}
/**
* 开始倒计时
*/
private startCountdown(): void {
this._countdown = 60; // 60秒倒计时
this.updateSendBtnState(false);
this._countdownTimer = setInterval(() => {
this._countdown--;
if (this._countdown <= 0) {
// 倒计时结束
clearInterval(this._countdownTimer);
this._countdownTimer = null;
this.updateSendBtnState(true);
} else {
// 更新按钮文本
this.updateSendBtnState(false);
}
}, 1000);
}
/**
* 更新发送按钮状态
*/
private updateSendBtnState(canSend: boolean): void {
if (!this._nodeTab.SendBtn) return;
const label = this._nodeTab.SendBtn.getComponentInChildren(Label);
if (label) {
if (canSend) {
label.string = "发送验证码";
} else {
label.string = `${this._countdown}秒后重试`;
}
}
// TODO: 可以设置按钮的可交互状态
// const button = this._nodeTab.SendBtn.getComponent(Button);
// if (button) {
// button.interactable = canSend;
// }
}
/**
* 点击确定按钮
*/
private onClickConfirm(): void {
// 获取邮箱和验证码输入框
const emailInput = this._nodeTab.EmailInput?.getComponent(EditBox);
const codeInput = this._nodeTab.CodeInput?.getComponent(EditBox);
if (!emailInput || !codeInput) {
console.error("未找到邮箱或验证码输入框");
return;
}
const email = emailInput.string.trim();
const code = codeInput.string.trim();
// 验证输入
if (!email) {
console.log("请输入邮箱");
// TODO: 显示提示信息
return;
}
if (!this.isValidEmail(email)) {
console.log("请输入有效的邮箱地址");
// TODO: 显示提示信息
return;
}
if (!code) {
console.log("请输入验证码");
// TODO: 显示提示信息
return;
}
// TODO: 调用后端接口验证验证码
console.log("验证验证码:", email, code);
this.requestVerifyCode(email, code);
}
/**
* 调用后端接口验证验证码
*/
private requestVerifyCode(email: string, code: string): void {
// TODO: 实现后端验证验证码接口调用
// 示例:
// const data = {
// email: email,
// code: code,
// type: 'forgetPassword'
// };
// NetworkManager.request('/api/verifyCode', data, (response) => {
// if (response.success) {
// // 验证成功,跳转到修改密码页面
// this.openNewPasswordPanel(email, code);
// } else {
// // 验证失败,显示错误信息
// console.error('验证码错误:', response.message);
// // TODO: 显示错误提示
// }
// });
console.log("TODO: 实现验证验证码接口调用");
// 临时模拟验证成功,跳转到修改密码页面
this.openNewPasswordPanel(email, code);
}
/**
* 打开修改密码页面
*/
private openNewPasswordPanel(email: string, code: string): void {
// 关闭当前页面
this.close();
// 打开修改密码页面,并传递邮箱和验证码信息
ViewManager.I.openMainView("loginPanel/NewPasswordPanel", {
email: email,
code: code,
});
}
/**
* 点击关闭按钮
*/
private onClickClose(): void {
// 清理倒计时定时器
if (this._countdownTimer) {
clearInterval(this._countdownTimer);
this._countdownTimer = null;
}
// 关闭当前界面
this.close();
}
/**
* 验证邮箱格式
*/
private isValidEmail(email: string): boolean {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
/**
* 界面销毁时调用
*/
protected onDestroy(): void {
// 清理倒计时定时器
if (this._countdownTimer) {
clearInterval(this._countdownTimer);
this._countdownTimer = null;
}
}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "d3dfdbed-8fb1-4348-b9d4-32c6b9406310",
"files": [],
"subMetas": {},
"userData": {}
}
@@ -235,12 +235,14 @@ export class DetailImageItem extends Component {
ResManager.I.changeRemoteSpriteFrame(this.img, newPath, () => {
this.scaleToFillItem();
});
if (this.isVisible) {
this.video.enabled = false;
this.videoReady.enabled = true;
} else {
this.video.enabled = true;
this.videoReady.enabled = false;
if (this.type === proto.cs.EnmResType.ERT_Video) {
if (this.isVisible) {
this.video.enabled = false;
this.videoReady.enabled = true;
} else {
this.video.enabled = true;
this.videoReady.enabled = false;
}
}
}
}
+17 -7
View File
@@ -24,6 +24,7 @@ import { EnvData } from "../data/EnvData";
import { logger } from "db://assets/Scripts/Main/Common/Logger";
import { GButton } from "../../Main/Common/GButton";
import { GirlListPanel } from "../ui/panels/GirlListPanel";
import { GirlCollectionPanel } from "../ui/panels/GirlCollectionPanel";
const { ccclass, property } = _decorator;
@@ -84,8 +85,12 @@ export class GirlListItem extends Component {
);
}
baseNode: GirlListPanel;
refreshData(category: number, girlId: number, baseNode: GirlListPanel) {
baseNode: GirlListPanel | GirlCollectionPanel;
refreshData(
category: number,
girlId: number,
baseNode: GirlListPanel | GirlCollectionPanel
) {
if (!this.stars) {
this.stars = this.starParent.getComponentsInChildren(Sprite);
}
@@ -208,11 +213,16 @@ export class GirlListItem extends Component {
const currentPanel = NavigationManager.Instance.getCurrentActivePanelNode();
if (currentPanel) {
const chatData = { girlId: this.id, base: currentPanel };
NavigationManager.Instance.openSubPanel("ChatPanel", currentPanel, chatData, {
openAnimation: PageTransitionType.NONE,
closeAnimation: PageTransitionType.NONE,
hideBasePanel: true,
});
NavigationManager.Instance.openSubPanel(
"ChatPanel",
currentPanel,
chatData,
{
openAnimation: PageTransitionType.NONE,
closeAnimation: PageTransitionType.NONE,
hideBasePanel: true,
}
);
} else {
logger.warn("[GirlListItem] 无法获取当前激活的主页面");
}
+247
View File
@@ -0,0 +1,247 @@
import {
_decorator,
Component,
Label,
Node,
Size,
Sprite,
UITransform,
} from "cc";
import Utils from "../../Main/Common/Utils";
import { GButton } from "../../Main/Common/GButton";
import { DataManager, DataId } from "../data/DataManager";
import { GirlData } from "../data/GirlData";
import LanguageUtils from "../../Main/Common/LanguageUtils";
import ResManager from "../../Main/Manager/ResManager";
import { EnvData } from "../data/EnvData";
import {
NavigationManager,
PanelType,
PageTransitionType,
} from "../manager/NavigationManager";
import { logger } from "../../Main/Common/Logger";
const { ccclass, property } = _decorator;
@ccclass("RankItem")
export class RankItem extends Component {
private _nodeTab: any = {};
private rankIndex: Label;
private lv1: Node;
private lv2: Node;
private lv3: Node;
private rankPic: Sprite;
private girlName: Label;
private tag: Label;
private heartParent: Node;
private hearts: Sprite[] = [];
private chatBtn: Node;
private detailBtn: Node;
private id: number;
// 标记是否已初始化(用于虚拟列表复用)
public _initialized: boolean = false;
// 兼容原有调用方式的 init 方法
init() {
if (this._initialized) {
return;
}
Utils.parseNode(this.node, this._nodeTab);
this.rankIndex = this._nodeTab.rankLabel?.getComponent(Label);
this.lv1 = this._nodeTab.lv1;
this.lv2 = this._nodeTab.lv2;
this.lv3 = this._nodeTab.lv3;
this.rankPic = this._nodeTab.avatar.getComponent(Sprite);
this.girlName = this._nodeTab.name?.getComponent(Label);
this.tag = this._nodeTab.tag?.getComponent(Label);
this.heartParent = this._nodeTab.heartBg;
if (this.heartParent) {
this.heartParent.children.forEach((a) =>
this.hearts.push(a.getComponent(Sprite))
);
}
this.chatBtn = this._nodeTab.chatBtn;
this.detailBtn = this._nodeTab.detailBtn;
if (this.chatBtn) {
GButton.BandClick(this.chatBtn, this.chatToHer, this);
}
if (this.detailBtn) {
GButton.BandClick(this.detailBtn, this.gotoDetail, this);
}
this._initialized = true;
}
// 节点回收到对象池时调用,重置状态
reset(): void {
this.id = -1;
this.node.active = false;
}
picSize: Size = new Size(100, 100);
/**
* 刷新排行榜项显示
* @param girlId 技师ID
* @param rankIndex 排名序号(从1开始)
*/
refresh(girlId: number, rankIndex: number) {
this.id = girlId;
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
const category = girlData.getGrilCategoryById(girlId);
// 显示排名
if (this.rankIndex) {
this.lv1.active = rankIndex === 1;
this.lv2.active = rankIndex === 2;
this.lv3.active = rankIndex === 3;
this.rankIndex.node.active = rankIndex > 3;
this.rankIndex.string = rankIndex.toString();
}
// 数据
let nameKey = girlData.getGrilName(category.toString(), this.id);
if (this.girlName) {
this.girlName.string = LanguageUtils.getText(nameKey);
}
let tagKey = girlData.getGrilTagKey(category.toString(), this.id);
if (this.tag) {
this.tag.string = LanguageUtils.getText(tagKey);
}
if (this.heartParent) {
this.heartParent.active = true;
}
// 加载头像
let avatarPath = girlData.getGrilAvatar(category.toString(), this.id);
const envData = DataManager.I.getDataById<EnvData>(DataId.Env);
let newPath = envData.cdn + "/" + "Girls/" + avatarPath + ".png";
if (this.rankPic) {
ResManager.I.changeRemoteSpriteFrame(this.rankPic, newPath, () => {
this.doScaleToFill(this.rankPic, this.picSize);
});
}
// 显示好感度
const star = girlData.getStar(category.toString(), this.id);
for (let i = 0; i < this.hearts.length; i++) {
const element = this.hearts[i];
if (star > i) {
ResManager.I.changeResourceSpriteFrame(
element,
"ui/common/heart/heart"
);
} else {
ResManager.I.changeResourceSpriteFrame(
element,
"ui/common/heart/heart_empty"
);
}
}
}
doScaleToFill(img: Sprite, size: Size) {
if (!img || !img.spriteFrame) return;
const itemSize = size;
const imageSize = img.spriteFrame.originalSize;
if (
itemSize.width === 0 ||
itemSize.height === 0 ||
imageSize.width === 0 ||
imageSize.height === 0
) {
return;
}
const scaleX = itemSize.width / imageSize.width;
const scaleY = itemSize.height / imageSize.height;
const scale = Math.max(scaleX, scaleY);
// 设置Sprite的sizeMode为CUSTOM,允许自定义大小
img.sizeMode = Sprite.SizeMode.CUSTOM;
// 获取图片节点的UITransform并设置大小
const imgTransform = img.node.getComponent(UITransform);
if (imgTransform) {
imgTransform.setContentSize(
imageSize.width * scale,
imageSize.height * scale
);
}
}
/**
* 聊天按钮点击事件
*/
chatToHer() {
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
NavigationManager.Instance.setSelectedGirlId(this.id);
NavigationManager.Instance.setSelectedCategoryId(
girlData.getGrilCategoryById(this.id)
);
// 直接在当前页面打开ChatPanel作为子页面
const currentPanel = NavigationManager.Instance.getCurrentActivePanelNode();
if (currentPanel) {
const chatData = { girlId: this.id, base: currentPanel };
NavigationManager.Instance.openSubPanel(
"ChatPanel",
currentPanel,
chatData,
{
openAnimation: PageTransitionType.NONE,
closeAnimation: PageTransitionType.NONE,
hideBasePanel: true,
}
);
} else {
logger.warn("[RankItem] 无法获取当前激活的主页面");
}
}
/**
* 详情按钮点击事件
*/
gotoDetail() {
const girlData = DataManager.I.getDataById<GirlData>(DataId.Girl);
NavigationManager.Instance.setSelectedGirlId(this.id);
NavigationManager.Instance.setSelectedCategoryId(
girlData.getGrilCategoryById(this.id)
);
// 以subpanel方式打开GirlDetailPanel
const currentPanel = NavigationManager.Instance.getCurrentActivePanelNode();
if (currentPanel) {
NavigationManager.Instance.openSubPanel(
"GirlDetailPanel",
currentPanel,
this.id,
{
openAnimation: PageTransitionType.NONE,
closeAnimation: PageTransitionType.NONE,
hideBasePanel: true, // 隐藏底层panel,实现全屏显示
}
);
} else {
logger.warn("[RankItem] 无法获取当前激活的主页面");
}
}
}
@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "995c8b1c-a5b7-4e49-bf44-50a6a89fa4f8",
"files": [],
"subMetas": {},
"userData": {}
}
+414
View File
@@ -4603,6 +4603,420 @@ toJSON(): { [k: string]: any };
static getTypeUrl(typeUrlPrefix?: string): string;
}
/** Properties of a CSFBCodeReq. */
interface ICSFBCodeReq {
/** CSFBCodeReq pixelAppId */
pixelAppId?: (string|null);
/** CSFBCodeReq fbc */
fbc?: (string|null);
/** CSFBCodeReq fbp */
fbp?: (string|null);
/** CSFBCodeReq userAgent */
userAgent?: (string|null);
}
/** Represents a CSFBCodeReq. */
class CSFBCodeReq implements ICSFBCodeReq {
/**
* Constructs a new CSFBCodeReq.
* @param [properties] Properties to set
*/
constructor(properties?: cs.ICSFBCodeReq);
/** CSFBCodeReq pixelAppId. */
pixelAppId: string;
/** CSFBCodeReq fbc. */
fbc: string;
/** CSFBCodeReq fbp. */
fbp: string;
/** CSFBCodeReq userAgent. */
userAgent: string;
/**
* Creates a new CSFBCodeReq instance using the specified properties.
* @param [properties] Properties to set
* @returns CSFBCodeReq instance
*/
static create(properties?: cs.ICSFBCodeReq): cs.CSFBCodeReq;
/**
* Encodes the specified CSFBCodeReq message. Does not implicitly {@link cs.CSFBCodeReq.verify|verify} messages.
* @param message CSFBCodeReq message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encode(message: cs.ICSFBCodeReq, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Encodes the specified CSFBCodeReq message, length delimited. Does not implicitly {@link cs.CSFBCodeReq.verify|verify} messages.
* @param message CSFBCodeReq message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encodeDelimited(message: cs.ICSFBCodeReq, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Decodes a CSFBCodeReq message from the specified reader or buffer.
* @param reader Reader or buffer to decode from
* @param [length] Message length if known beforehand
* @returns CSFBCodeReq
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): cs.CSFBCodeReq;
/**
* Decodes a CSFBCodeReq message from the specified reader or buffer, length delimited.
* @param reader Reader or buffer to decode from
* @returns CSFBCodeReq
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): cs.CSFBCodeReq;
/**
* Verifies a CSFBCodeReq message.
* @param message Plain object to verify
* @returns `null` if valid, otherwise the reason why it is not
*/
static verify(message: { [k: string]: any }): (string|null);
/**
* Creates a CSFBCodeReq message from a plain object. Also converts values to their respective internal types.
* @param object Plain object
* @returns CSFBCodeReq
*/
static fromObject(object: { [k: string]: any }): cs.CSFBCodeReq;
/**
* Creates a plain object from a CSFBCodeReq message. Also converts values to other types if specified.
* @param message CSFBCodeReq
* @param [options] Conversion options
* @returns Plain object
*/
static toObject(message: cs.CSFBCodeReq, options?: $protobuf.IConversionOptions): { [k: string]: any };
/**
* Converts this CSFBCodeReq to JSON.
* @returns JSON object
*/
toJSON(): { [k: string]: any };
/**
* Gets the default type url for CSFBCodeReq
* @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns The default type url
*/
static getTypeUrl(typeUrlPrefix?: string): string;
}
/** Properties of a CSFBCodeRes. */
interface ICSFBCodeRes {
/** CSFBCodeRes fbCode */
fbCode?: (string|null);
}
/** Represents a CSFBCodeRes. */
class CSFBCodeRes implements ICSFBCodeRes {
/**
* Constructs a new CSFBCodeRes.
* @param [properties] Properties to set
*/
constructor(properties?: cs.ICSFBCodeRes);
/** CSFBCodeRes fbCode. */
fbCode: string;
/**
* Creates a new CSFBCodeRes instance using the specified properties.
* @param [properties] Properties to set
* @returns CSFBCodeRes instance
*/
static create(properties?: cs.ICSFBCodeRes): cs.CSFBCodeRes;
/**
* Encodes the specified CSFBCodeRes message. Does not implicitly {@link cs.CSFBCodeRes.verify|verify} messages.
* @param message CSFBCodeRes message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encode(message: cs.ICSFBCodeRes, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Encodes the specified CSFBCodeRes message, length delimited. Does not implicitly {@link cs.CSFBCodeRes.verify|verify} messages.
* @param message CSFBCodeRes message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encodeDelimited(message: cs.ICSFBCodeRes, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Decodes a CSFBCodeRes message from the specified reader or buffer.
* @param reader Reader or buffer to decode from
* @param [length] Message length if known beforehand
* @returns CSFBCodeRes
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): cs.CSFBCodeRes;
/**
* Decodes a CSFBCodeRes message from the specified reader or buffer, length delimited.
* @param reader Reader or buffer to decode from
* @returns CSFBCodeRes
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): cs.CSFBCodeRes;
/**
* Verifies a CSFBCodeRes message.
* @param message Plain object to verify
* @returns `null` if valid, otherwise the reason why it is not
*/
static verify(message: { [k: string]: any }): (string|null);
/**
* Creates a CSFBCodeRes message from a plain object. Also converts values to their respective internal types.
* @param object Plain object
* @returns CSFBCodeRes
*/
static fromObject(object: { [k: string]: any }): cs.CSFBCodeRes;
/**
* Creates a plain object from a CSFBCodeRes message. Also converts values to other types if specified.
* @param message CSFBCodeRes
* @param [options] Conversion options
* @returns Plain object
*/
static toObject(message: cs.CSFBCodeRes, options?: $protobuf.IConversionOptions): { [k: string]: any };
/**
* Converts this CSFBCodeRes to JSON.
* @returns JSON object
*/
toJSON(): { [k: string]: any };
/**
* Gets the default type url for CSFBCodeRes
* @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns The default type url
*/
static getTypeUrl(typeUrlPrefix?: string): string;
}
/** EnmPointEvent enum. */
enum EnmPointEvent {
EPE_FBCode = 0,
EPE_LoadA = 1,
EPE_LoadB = 2,
EPE_LoadGame = 3
}
/** Properties of a CSPointEventReq. */
interface ICSPointEventReq {
/** CSPointEventReq fbCode */
fbCode?: (string|null);
/** CSPointEventReq point */
point?: (number|null);
}
/** Represents a CSPointEventReq. */
class CSPointEventReq implements ICSPointEventReq {
/**
* Constructs a new CSPointEventReq.
* @param [properties] Properties to set
*/
constructor(properties?: cs.ICSPointEventReq);
/** CSPointEventReq fbCode. */
fbCode: string;
/** CSPointEventReq point. */
point: number;
/**
* Creates a new CSPointEventReq instance using the specified properties.
* @param [properties] Properties to set
* @returns CSPointEventReq instance
*/
static create(properties?: cs.ICSPointEventReq): cs.CSPointEventReq;
/**
* Encodes the specified CSPointEventReq message. Does not implicitly {@link cs.CSPointEventReq.verify|verify} messages.
* @param message CSPointEventReq message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encode(message: cs.ICSPointEventReq, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Encodes the specified CSPointEventReq message, length delimited. Does not implicitly {@link cs.CSPointEventReq.verify|verify} messages.
* @param message CSPointEventReq message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encodeDelimited(message: cs.ICSPointEventReq, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Decodes a CSPointEventReq message from the specified reader or buffer.
* @param reader Reader or buffer to decode from
* @param [length] Message length if known beforehand
* @returns CSPointEventReq
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): cs.CSPointEventReq;
/**
* Decodes a CSPointEventReq message from the specified reader or buffer, length delimited.
* @param reader Reader or buffer to decode from
* @returns CSPointEventReq
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): cs.CSPointEventReq;
/**
* Verifies a CSPointEventReq message.
* @param message Plain object to verify
* @returns `null` if valid, otherwise the reason why it is not
*/
static verify(message: { [k: string]: any }): (string|null);
/**
* Creates a CSPointEventReq message from a plain object. Also converts values to their respective internal types.
* @param object Plain object
* @returns CSPointEventReq
*/
static fromObject(object: { [k: string]: any }): cs.CSPointEventReq;
/**
* Creates a plain object from a CSPointEventReq message. Also converts values to other types if specified.
* @param message CSPointEventReq
* @param [options] Conversion options
* @returns Plain object
*/
static toObject(message: cs.CSPointEventReq, options?: $protobuf.IConversionOptions): { [k: string]: any };
/**
* Converts this CSPointEventReq to JSON.
* @returns JSON object
*/
toJSON(): { [k: string]: any };
/**
* Gets the default type url for CSPointEventReq
* @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns The default type url
*/
static getTypeUrl(typeUrlPrefix?: string): string;
}
/** Properties of a CSPointEventRes. */
interface ICSPointEventRes {
}
/** Represents a CSPointEventRes. */
class CSPointEventRes implements ICSPointEventRes {
/**
* Constructs a new CSPointEventRes.
* @param [properties] Properties to set
*/
constructor(properties?: cs.ICSPointEventRes);
/**
* Creates a new CSPointEventRes instance using the specified properties.
* @param [properties] Properties to set
* @returns CSPointEventRes instance
*/
static create(properties?: cs.ICSPointEventRes): cs.CSPointEventRes;
/**
* Encodes the specified CSPointEventRes message. Does not implicitly {@link cs.CSPointEventRes.verify|verify} messages.
* @param message CSPointEventRes message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encode(message: cs.ICSPointEventRes, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Encodes the specified CSPointEventRes message, length delimited. Does not implicitly {@link cs.CSPointEventRes.verify|verify} messages.
* @param message CSPointEventRes message or plain object to encode
* @param [writer] Writer to encode to
* @returns Writer
*/
static encodeDelimited(message: cs.ICSPointEventRes, writer?: $protobuf.Writer): $protobuf.Writer;
/**
* Decodes a CSPointEventRes message from the specified reader or buffer.
* @param reader Reader or buffer to decode from
* @param [length] Message length if known beforehand
* @returns CSPointEventRes
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): cs.CSPointEventRes;
/**
* Decodes a CSPointEventRes message from the specified reader or buffer, length delimited.
* @param reader Reader or buffer to decode from
* @returns CSPointEventRes
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): cs.CSPointEventRes;
/**
* Verifies a CSPointEventRes message.
* @param message Plain object to verify
* @returns `null` if valid, otherwise the reason why it is not
*/
static verify(message: { [k: string]: any }): (string|null);
/**
* Creates a CSPointEventRes message from a plain object. Also converts values to their respective internal types.
* @param object Plain object
* @returns CSPointEventRes
*/
static fromObject(object: { [k: string]: any }): cs.CSPointEventRes;
/**
* Creates a plain object from a CSPointEventRes message. Also converts values to other types if specified.
* @param message CSPointEventRes
* @param [options] Conversion options
* @returns Plain object
*/
static toObject(message: cs.CSPointEventRes, options?: $protobuf.IConversionOptions): { [k: string]: any };
/**
* Converts this CSPointEventRes to JSON.
* @returns JSON object
*/
toJSON(): { [k: string]: any };
/**
* Gets the default type url for CSPointEventRes
* @param [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns The default type url
*/
static getTypeUrl(typeUrlPrefix?: string): string;
}
/** Category enum. */
enum Category {
Category_mature = 0,
+904
View File
@@ -10715,6 +10715,910 @@ $root.cs = (function() {
return CSRecommendRes;
})();
cs.CSFBCodeReq = (function() {
/**
* Properties of a CSFBCodeReq.
* @memberof cs
* @interface ICSFBCodeReq
* @property {string|null} [pixelAppId] CSFBCodeReq pixelAppId
* @property {string|null} [fbc] CSFBCodeReq fbc
* @property {string|null} [fbp] CSFBCodeReq fbp
* @property {string|null} [userAgent] CSFBCodeReq userAgent
*/
/**
* Constructs a new CSFBCodeReq.
* @memberof cs
* @classdesc Represents a CSFBCodeReq.
* @implements ICSFBCodeReq
* @constructor
* @param {cs.ICSFBCodeReq=} [properties] Properties to set
*/
function CSFBCodeReq(properties) {
if (properties)
for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
if (properties[keys[i]] != null)
this[keys[i]] = properties[keys[i]];
}
/**
* CSFBCodeReq pixelAppId.
* @member {string} pixelAppId
* @memberof cs.CSFBCodeReq
* @instance
*/
CSFBCodeReq.prototype.pixelAppId = "";
/**
* CSFBCodeReq fbc.
* @member {string} fbc
* @memberof cs.CSFBCodeReq
* @instance
*/
CSFBCodeReq.prototype.fbc = "";
/**
* CSFBCodeReq fbp.
* @member {string} fbp
* @memberof cs.CSFBCodeReq
* @instance
*/
CSFBCodeReq.prototype.fbp = "";
/**
* CSFBCodeReq userAgent.
* @member {string} userAgent
* @memberof cs.CSFBCodeReq
* @instance
*/
CSFBCodeReq.prototype.userAgent = "";
/**
* Creates a new CSFBCodeReq instance using the specified properties.
* @function create
* @memberof cs.CSFBCodeReq
* @static
* @param {cs.ICSFBCodeReq=} [properties] Properties to set
* @returns {cs.CSFBCodeReq} CSFBCodeReq instance
*/
CSFBCodeReq.create = function create(properties) {
return new CSFBCodeReq(properties);
};
/**
* Encodes the specified CSFBCodeReq message. Does not implicitly {@link cs.CSFBCodeReq.verify|verify} messages.
* @function encode
* @memberof cs.CSFBCodeReq
* @static
* @param {cs.ICSFBCodeReq} message CSFBCodeReq message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
CSFBCodeReq.encode = function encode(message, writer) {
if (!writer)
writer = $Writer.create();
if (message.pixelAppId != null && Object.hasOwnProperty.call(message, "pixelAppId"))
writer.uint32(/* id 1, wireType 2 =*/10).string(message.pixelAppId);
if (message.fbc != null && Object.hasOwnProperty.call(message, "fbc"))
writer.uint32(/* id 2, wireType 2 =*/18).string(message.fbc);
if (message.fbp != null && Object.hasOwnProperty.call(message, "fbp"))
writer.uint32(/* id 3, wireType 2 =*/26).string(message.fbp);
if (message.userAgent != null && Object.hasOwnProperty.call(message, "userAgent"))
writer.uint32(/* id 4, wireType 2 =*/34).string(message.userAgent);
return writer;
};
/**
* Encodes the specified CSFBCodeReq message, length delimited. Does not implicitly {@link cs.CSFBCodeReq.verify|verify} messages.
* @function encodeDelimited
* @memberof cs.CSFBCodeReq
* @static
* @param {cs.ICSFBCodeReq} message CSFBCodeReq message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
CSFBCodeReq.encodeDelimited = function encodeDelimited(message, writer) {
return this.encode(message, writer).ldelim();
};
/**
* Decodes a CSFBCodeReq message from the specified reader or buffer.
* @function decode
* @memberof cs.CSFBCodeReq
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @param {number} [length] Message length if known beforehand
* @returns {cs.CSFBCodeReq} CSFBCodeReq
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
CSFBCodeReq.decode = function decode(reader, length, error) {
if (!(reader instanceof $Reader))
reader = $Reader.create(reader);
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.cs.CSFBCodeReq();
while (reader.pos < end) {
var tag = reader.uint32();
if (tag === error)
break;
switch (tag >>> 3) {
case 1: {
message.pixelAppId = reader.string();
break;
}
case 2: {
message.fbc = reader.string();
break;
}
case 3: {
message.fbp = reader.string();
break;
}
case 4: {
message.userAgent = reader.string();
break;
}
default:
reader.skipType(tag & 7);
break;
}
}
return message;
};
/**
* Decodes a CSFBCodeReq message from the specified reader or buffer, length delimited.
* @function decodeDelimited
* @memberof cs.CSFBCodeReq
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @returns {cs.CSFBCodeReq} CSFBCodeReq
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
CSFBCodeReq.decodeDelimited = function decodeDelimited(reader) {
if (!(reader instanceof $Reader))
reader = new $Reader(reader);
return this.decode(reader, reader.uint32());
};
/**
* Verifies a CSFBCodeReq message.
* @function verify
* @memberof cs.CSFBCodeReq
* @static
* @param {Object.<string,*>} message Plain object to verify
* @returns {string|null} `null` if valid, otherwise the reason why it is not
*/
CSFBCodeReq.verify = function verify(message) {
if (typeof message !== "object" || message === null)
return "object expected";
if (message.pixelAppId != null && message.hasOwnProperty("pixelAppId"))
if (!$util.isString(message.pixelAppId))
return "pixelAppId: string expected";
if (message.fbc != null && message.hasOwnProperty("fbc"))
if (!$util.isString(message.fbc))
return "fbc: string expected";
if (message.fbp != null && message.hasOwnProperty("fbp"))
if (!$util.isString(message.fbp))
return "fbp: string expected";
if (message.userAgent != null && message.hasOwnProperty("userAgent"))
if (!$util.isString(message.userAgent))
return "userAgent: string expected";
return null;
};
/**
* Creates a CSFBCodeReq message from a plain object. Also converts values to their respective internal types.
* @function fromObject
* @memberof cs.CSFBCodeReq
* @static
* @param {Object.<string,*>} object Plain object
* @returns {cs.CSFBCodeReq} CSFBCodeReq
*/
CSFBCodeReq.fromObject = function fromObject(object) {
if (object instanceof $root.cs.CSFBCodeReq)
return object;
var message = new $root.cs.CSFBCodeReq();
if (object.pixelAppId != null)
message.pixelAppId = String(object.pixelAppId);
if (object.fbc != null)
message.fbc = String(object.fbc);
if (object.fbp != null)
message.fbp = String(object.fbp);
if (object.userAgent != null)
message.userAgent = String(object.userAgent);
return message;
};
/**
* Creates a plain object from a CSFBCodeReq message. Also converts values to other types if specified.
* @function toObject
* @memberof cs.CSFBCodeReq
* @static
* @param {cs.CSFBCodeReq} message CSFBCodeReq
* @param {$protobuf.IConversionOptions} [options] Conversion options
* @returns {Object.<string,*>} Plain object
*/
CSFBCodeReq.toObject = function toObject(message, options) {
if (!options)
options = {};
var object = {};
if (options.defaults) {
object.pixelAppId = "";
object.fbc = "";
object.fbp = "";
object.userAgent = "";
}
if (message.pixelAppId != null && message.hasOwnProperty("pixelAppId"))
object.pixelAppId = message.pixelAppId;
if (message.fbc != null && message.hasOwnProperty("fbc"))
object.fbc = message.fbc;
if (message.fbp != null && message.hasOwnProperty("fbp"))
object.fbp = message.fbp;
if (message.userAgent != null && message.hasOwnProperty("userAgent"))
object.userAgent = message.userAgent;
return object;
};
/**
* Converts this CSFBCodeReq to JSON.
* @function toJSON
* @memberof cs.CSFBCodeReq
* @instance
* @returns {Object.<string,*>} JSON object
*/
CSFBCodeReq.prototype.toJSON = function toJSON() {
return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
};
/**
* Gets the default type url for CSFBCodeReq
* @function getTypeUrl
* @memberof cs.CSFBCodeReq
* @static
* @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns {string} The default type url
*/
CSFBCodeReq.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
if (typeUrlPrefix === undefined) {
typeUrlPrefix = "type.googleapis.com";
}
return typeUrlPrefix + "/cs.CSFBCodeReq";
};
return CSFBCodeReq;
})();
cs.CSFBCodeRes = (function() {
/**
* Properties of a CSFBCodeRes.
* @memberof cs
* @interface ICSFBCodeRes
* @property {string|null} [fbCode] CSFBCodeRes fbCode
*/
/**
* Constructs a new CSFBCodeRes.
* @memberof cs
* @classdesc Represents a CSFBCodeRes.
* @implements ICSFBCodeRes
* @constructor
* @param {cs.ICSFBCodeRes=} [properties] Properties to set
*/
function CSFBCodeRes(properties) {
if (properties)
for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
if (properties[keys[i]] != null)
this[keys[i]] = properties[keys[i]];
}
/**
* CSFBCodeRes fbCode.
* @member {string} fbCode
* @memberof cs.CSFBCodeRes
* @instance
*/
CSFBCodeRes.prototype.fbCode = "";
/**
* Creates a new CSFBCodeRes instance using the specified properties.
* @function create
* @memberof cs.CSFBCodeRes
* @static
* @param {cs.ICSFBCodeRes=} [properties] Properties to set
* @returns {cs.CSFBCodeRes} CSFBCodeRes instance
*/
CSFBCodeRes.create = function create(properties) {
return new CSFBCodeRes(properties);
};
/**
* Encodes the specified CSFBCodeRes message. Does not implicitly {@link cs.CSFBCodeRes.verify|verify} messages.
* @function encode
* @memberof cs.CSFBCodeRes
* @static
* @param {cs.ICSFBCodeRes} message CSFBCodeRes message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
CSFBCodeRes.encode = function encode(message, writer) {
if (!writer)
writer = $Writer.create();
if (message.fbCode != null && Object.hasOwnProperty.call(message, "fbCode"))
writer.uint32(/* id 1, wireType 2 =*/10).string(message.fbCode);
return writer;
};
/**
* Encodes the specified CSFBCodeRes message, length delimited. Does not implicitly {@link cs.CSFBCodeRes.verify|verify} messages.
* @function encodeDelimited
* @memberof cs.CSFBCodeRes
* @static
* @param {cs.ICSFBCodeRes} message CSFBCodeRes message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
CSFBCodeRes.encodeDelimited = function encodeDelimited(message, writer) {
return this.encode(message, writer).ldelim();
};
/**
* Decodes a CSFBCodeRes message from the specified reader or buffer.
* @function decode
* @memberof cs.CSFBCodeRes
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @param {number} [length] Message length if known beforehand
* @returns {cs.CSFBCodeRes} CSFBCodeRes
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
CSFBCodeRes.decode = function decode(reader, length, error) {
if (!(reader instanceof $Reader))
reader = $Reader.create(reader);
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.cs.CSFBCodeRes();
while (reader.pos < end) {
var tag = reader.uint32();
if (tag === error)
break;
switch (tag >>> 3) {
case 1: {
message.fbCode = reader.string();
break;
}
default:
reader.skipType(tag & 7);
break;
}
}
return message;
};
/**
* Decodes a CSFBCodeRes message from the specified reader or buffer, length delimited.
* @function decodeDelimited
* @memberof cs.CSFBCodeRes
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @returns {cs.CSFBCodeRes} CSFBCodeRes
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
CSFBCodeRes.decodeDelimited = function decodeDelimited(reader) {
if (!(reader instanceof $Reader))
reader = new $Reader(reader);
return this.decode(reader, reader.uint32());
};
/**
* Verifies a CSFBCodeRes message.
* @function verify
* @memberof cs.CSFBCodeRes
* @static
* @param {Object.<string,*>} message Plain object to verify
* @returns {string|null} `null` if valid, otherwise the reason why it is not
*/
CSFBCodeRes.verify = function verify(message) {
if (typeof message !== "object" || message === null)
return "object expected";
if (message.fbCode != null && message.hasOwnProperty("fbCode"))
if (!$util.isString(message.fbCode))
return "fbCode: string expected";
return null;
};
/**
* Creates a CSFBCodeRes message from a plain object. Also converts values to their respective internal types.
* @function fromObject
* @memberof cs.CSFBCodeRes
* @static
* @param {Object.<string,*>} object Plain object
* @returns {cs.CSFBCodeRes} CSFBCodeRes
*/
CSFBCodeRes.fromObject = function fromObject(object) {
if (object instanceof $root.cs.CSFBCodeRes)
return object;
var message = new $root.cs.CSFBCodeRes();
if (object.fbCode != null)
message.fbCode = String(object.fbCode);
return message;
};
/**
* Creates a plain object from a CSFBCodeRes message. Also converts values to other types if specified.
* @function toObject
* @memberof cs.CSFBCodeRes
* @static
* @param {cs.CSFBCodeRes} message CSFBCodeRes
* @param {$protobuf.IConversionOptions} [options] Conversion options
* @returns {Object.<string,*>} Plain object
*/
CSFBCodeRes.toObject = function toObject(message, options) {
if (!options)
options = {};
var object = {};
if (options.defaults)
object.fbCode = "";
if (message.fbCode != null && message.hasOwnProperty("fbCode"))
object.fbCode = message.fbCode;
return object;
};
/**
* Converts this CSFBCodeRes to JSON.
* @function toJSON
* @memberof cs.CSFBCodeRes
* @instance
* @returns {Object.<string,*>} JSON object
*/
CSFBCodeRes.prototype.toJSON = function toJSON() {
return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
};
/**
* Gets the default type url for CSFBCodeRes
* @function getTypeUrl
* @memberof cs.CSFBCodeRes
* @static
* @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns {string} The default type url
*/
CSFBCodeRes.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
if (typeUrlPrefix === undefined) {
typeUrlPrefix = "type.googleapis.com";
}
return typeUrlPrefix + "/cs.CSFBCodeRes";
};
return CSFBCodeRes;
})();
/**
* EnmPointEvent enum.
* @name cs.EnmPointEvent
* @enum {number}
* @property {number} EPE_FBCode=0 EPE_FBCode value
* @property {number} EPE_LoadA=1 EPE_LoadA value
* @property {number} EPE_LoadB=2 EPE_LoadB value
* @property {number} EPE_LoadGame=3 EPE_LoadGame value
*/
cs.EnmPointEvent = (function() {
var valuesById = {}, values = Object.create(valuesById);
values[valuesById[0] = "EPE_FBCode"] = 0;
values[valuesById[1] = "EPE_LoadA"] = 1;
values[valuesById[2] = "EPE_LoadB"] = 2;
values[valuesById[3] = "EPE_LoadGame"] = 3;
return values;
})();
cs.CSPointEventReq = (function() {
/**
* Properties of a CSPointEventReq.
* @memberof cs
* @interface ICSPointEventReq
* @property {string|null} [fbCode] CSPointEventReq fbCode
* @property {number|null} [point] CSPointEventReq point
*/
/**
* Constructs a new CSPointEventReq.
* @memberof cs
* @classdesc Represents a CSPointEventReq.
* @implements ICSPointEventReq
* @constructor
* @param {cs.ICSPointEventReq=} [properties] Properties to set
*/
function CSPointEventReq(properties) {
if (properties)
for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
if (properties[keys[i]] != null)
this[keys[i]] = properties[keys[i]];
}
/**
* CSPointEventReq fbCode.
* @member {string} fbCode
* @memberof cs.CSPointEventReq
* @instance
*/
CSPointEventReq.prototype.fbCode = "";
/**
* CSPointEventReq point.
* @member {number} point
* @memberof cs.CSPointEventReq
* @instance
*/
CSPointEventReq.prototype.point = 0;
/**
* Creates a new CSPointEventReq instance using the specified properties.
* @function create
* @memberof cs.CSPointEventReq
* @static
* @param {cs.ICSPointEventReq=} [properties] Properties to set
* @returns {cs.CSPointEventReq} CSPointEventReq instance
*/
CSPointEventReq.create = function create(properties) {
return new CSPointEventReq(properties);
};
/**
* Encodes the specified CSPointEventReq message. Does not implicitly {@link cs.CSPointEventReq.verify|verify} messages.
* @function encode
* @memberof cs.CSPointEventReq
* @static
* @param {cs.ICSPointEventReq} message CSPointEventReq message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
CSPointEventReq.encode = function encode(message, writer) {
if (!writer)
writer = $Writer.create();
if (message.fbCode != null && Object.hasOwnProperty.call(message, "fbCode"))
writer.uint32(/* id 1, wireType 2 =*/10).string(message.fbCode);
if (message.point != null && Object.hasOwnProperty.call(message, "point"))
writer.uint32(/* id 2, wireType 0 =*/16).int32(message.point);
return writer;
};
/**
* Encodes the specified CSPointEventReq message, length delimited. Does not implicitly {@link cs.CSPointEventReq.verify|verify} messages.
* @function encodeDelimited
* @memberof cs.CSPointEventReq
* @static
* @param {cs.ICSPointEventReq} message CSPointEventReq message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
CSPointEventReq.encodeDelimited = function encodeDelimited(message, writer) {
return this.encode(message, writer).ldelim();
};
/**
* Decodes a CSPointEventReq message from the specified reader or buffer.
* @function decode
* @memberof cs.CSPointEventReq
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @param {number} [length] Message length if known beforehand
* @returns {cs.CSPointEventReq} CSPointEventReq
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
CSPointEventReq.decode = function decode(reader, length, error) {
if (!(reader instanceof $Reader))
reader = $Reader.create(reader);
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.cs.CSPointEventReq();
while (reader.pos < end) {
var tag = reader.uint32();
if (tag === error)
break;
switch (tag >>> 3) {
case 1: {
message.fbCode = reader.string();
break;
}
case 2: {
message.point = reader.int32();
break;
}
default:
reader.skipType(tag & 7);
break;
}
}
return message;
};
/**
* Decodes a CSPointEventReq message from the specified reader or buffer, length delimited.
* @function decodeDelimited
* @memberof cs.CSPointEventReq
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @returns {cs.CSPointEventReq} CSPointEventReq
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
CSPointEventReq.decodeDelimited = function decodeDelimited(reader) {
if (!(reader instanceof $Reader))
reader = new $Reader(reader);
return this.decode(reader, reader.uint32());
};
/**
* Verifies a CSPointEventReq message.
* @function verify
* @memberof cs.CSPointEventReq
* @static
* @param {Object.<string,*>} message Plain object to verify
* @returns {string|null} `null` if valid, otherwise the reason why it is not
*/
CSPointEventReq.verify = function verify(message) {
if (typeof message !== "object" || message === null)
return "object expected";
if (message.fbCode != null && message.hasOwnProperty("fbCode"))
if (!$util.isString(message.fbCode))
return "fbCode: string expected";
if (message.point != null && message.hasOwnProperty("point"))
if (!$util.isInteger(message.point))
return "point: integer expected";
return null;
};
/**
* Creates a CSPointEventReq message from a plain object. Also converts values to their respective internal types.
* @function fromObject
* @memberof cs.CSPointEventReq
* @static
* @param {Object.<string,*>} object Plain object
* @returns {cs.CSPointEventReq} CSPointEventReq
*/
CSPointEventReq.fromObject = function fromObject(object) {
if (object instanceof $root.cs.CSPointEventReq)
return object;
var message = new $root.cs.CSPointEventReq();
if (object.fbCode != null)
message.fbCode = String(object.fbCode);
if (object.point != null)
message.point = object.point | 0;
return message;
};
/**
* Creates a plain object from a CSPointEventReq message. Also converts values to other types if specified.
* @function toObject
* @memberof cs.CSPointEventReq
* @static
* @param {cs.CSPointEventReq} message CSPointEventReq
* @param {$protobuf.IConversionOptions} [options] Conversion options
* @returns {Object.<string,*>} Plain object
*/
CSPointEventReq.toObject = function toObject(message, options) {
if (!options)
options = {};
var object = {};
if (options.defaults) {
object.fbCode = "";
object.point = 0;
}
if (message.fbCode != null && message.hasOwnProperty("fbCode"))
object.fbCode = message.fbCode;
if (message.point != null && message.hasOwnProperty("point"))
object.point = message.point;
return object;
};
/**
* Converts this CSPointEventReq to JSON.
* @function toJSON
* @memberof cs.CSPointEventReq
* @instance
* @returns {Object.<string,*>} JSON object
*/
CSPointEventReq.prototype.toJSON = function toJSON() {
return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
};
/**
* Gets the default type url for CSPointEventReq
* @function getTypeUrl
* @memberof cs.CSPointEventReq
* @static
* @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns {string} The default type url
*/
CSPointEventReq.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
if (typeUrlPrefix === undefined) {
typeUrlPrefix = "type.googleapis.com";
}
return typeUrlPrefix + "/cs.CSPointEventReq";
};
return CSPointEventReq;
})();
cs.CSPointEventRes = (function() {
/**
* Properties of a CSPointEventRes.
* @memberof cs
* @interface ICSPointEventRes
*/
/**
* Constructs a new CSPointEventRes.
* @memberof cs
* @classdesc Represents a CSPointEventRes.
* @implements ICSPointEventRes
* @constructor
* @param {cs.ICSPointEventRes=} [properties] Properties to set
*/
function CSPointEventRes(properties) {
if (properties)
for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
if (properties[keys[i]] != null)
this[keys[i]] = properties[keys[i]];
}
/**
* Creates a new CSPointEventRes instance using the specified properties.
* @function create
* @memberof cs.CSPointEventRes
* @static
* @param {cs.ICSPointEventRes=} [properties] Properties to set
* @returns {cs.CSPointEventRes} CSPointEventRes instance
*/
CSPointEventRes.create = function create(properties) {
return new CSPointEventRes(properties);
};
/**
* Encodes the specified CSPointEventRes message. Does not implicitly {@link cs.CSPointEventRes.verify|verify} messages.
* @function encode
* @memberof cs.CSPointEventRes
* @static
* @param {cs.ICSPointEventRes} message CSPointEventRes message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
CSPointEventRes.encode = function encode(message, writer) {
if (!writer)
writer = $Writer.create();
return writer;
};
/**
* Encodes the specified CSPointEventRes message, length delimited. Does not implicitly {@link cs.CSPointEventRes.verify|verify} messages.
* @function encodeDelimited
* @memberof cs.CSPointEventRes
* @static
* @param {cs.ICSPointEventRes} message CSPointEventRes message or plain object to encode
* @param {$protobuf.Writer} [writer] Writer to encode to
* @returns {$protobuf.Writer} Writer
*/
CSPointEventRes.encodeDelimited = function encodeDelimited(message, writer) {
return this.encode(message, writer).ldelim();
};
/**
* Decodes a CSPointEventRes message from the specified reader or buffer.
* @function decode
* @memberof cs.CSPointEventRes
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @param {number} [length] Message length if known beforehand
* @returns {cs.CSPointEventRes} CSPointEventRes
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
CSPointEventRes.decode = function decode(reader, length, error) {
if (!(reader instanceof $Reader))
reader = $Reader.create(reader);
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.cs.CSPointEventRes();
while (reader.pos < end) {
var tag = reader.uint32();
if (tag === error)
break;
switch (tag >>> 3) {
default:
reader.skipType(tag & 7);
break;
}
}
return message;
};
/**
* Decodes a CSPointEventRes message from the specified reader or buffer, length delimited.
* @function decodeDelimited
* @memberof cs.CSPointEventRes
* @static
* @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
* @returns {cs.CSPointEventRes} CSPointEventRes
* @throws {Error} If the payload is not a reader or valid buffer
* @throws {$protobuf.util.ProtocolError} If required fields are missing
*/
CSPointEventRes.decodeDelimited = function decodeDelimited(reader) {
if (!(reader instanceof $Reader))
reader = new $Reader(reader);
return this.decode(reader, reader.uint32());
};
/**
* Verifies a CSPointEventRes message.
* @function verify
* @memberof cs.CSPointEventRes
* @static
* @param {Object.<string,*>} message Plain object to verify
* @returns {string|null} `null` if valid, otherwise the reason why it is not
*/
CSPointEventRes.verify = function verify(message) {
if (typeof message !== "object" || message === null)
return "object expected";
return null;
};
/**
* Creates a CSPointEventRes message from a plain object. Also converts values to their respective internal types.
* @function fromObject
* @memberof cs.CSPointEventRes
* @static
* @param {Object.<string,*>} object Plain object
* @returns {cs.CSPointEventRes} CSPointEventRes
*/
CSPointEventRes.fromObject = function fromObject(object) {
if (object instanceof $root.cs.CSPointEventRes)
return object;
return new $root.cs.CSPointEventRes();
};
/**
* Creates a plain object from a CSPointEventRes message. Also converts values to other types if specified.
* @function toObject
* @memberof cs.CSPointEventRes
* @static
* @param {cs.CSPointEventRes} message CSPointEventRes
* @param {$protobuf.IConversionOptions} [options] Conversion options
* @returns {Object.<string,*>} Plain object
*/
CSPointEventRes.toObject = function toObject() {
return {};
};
/**
* Converts this CSPointEventRes to JSON.
* @function toJSON
* @memberof cs.CSPointEventRes
* @instance
* @returns {Object.<string,*>} JSON object
*/
CSPointEventRes.prototype.toJSON = function toJSON() {
return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
};
/**
* Gets the default type url for CSPointEventRes
* @function getTypeUrl
* @memberof cs.CSPointEventRes
* @static
* @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com")
* @returns {string} The default type url
*/
CSPointEventRes.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
if (typeUrlPrefix === undefined) {
typeUrlPrefix = "type.googleapis.com";
}
return typeUrlPrefix + "/cs.CSPointEventRes";
};
return CSPointEventRes;
})();
/**
* Category enum.
* @name cs.Category
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "a0f75a36-ea81-4363-844e-fa21a437b182",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "GirlCollectionPanel"
}
}
File diff suppressed because it is too large Load Diff
@@ -1847,7 +1847,7 @@
"__id__": 100
}
],
"_active": false,
"_active": true,
"_components": [
{
"__id__": 114
@@ -2922,7 +2922,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": -1.4499999999999886,
"x": 95.75,
"y": 79.546,
"z": 0
},
@@ -3881,7 +3881,7 @@
"_target": null,
"_left": 0,
"_right": 0,
"_top": 0.2039999999999793,
"_top": 0.20399999999999352,
"_bottom": 0,
"_horizontalCenter": 0,
"_verticalCenter": 0,
@@ -3974,7 +3974,7 @@
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 276.35,
"x": 283.25,
"y": 79.546,
"z": 0
},
@@ -4933,7 +4933,7 @@
"_target": null,
"_left": 0,
"_right": 0,
"_top": 0.2039999999999793,
"_top": 0.20399999999999352,
"_bottom": 0,
"_horizontalCenter": 0,
"_verticalCenter": 0,
@@ -5081,7 +5081,7 @@
"_paddingRight": 2,
"_paddingTop": 0,
"_paddingBottom": 0,
"_spacingX": 90.3,
"_spacingX": 0,
"_spacingY": 0,
"_verticalDirection": 1,
"_horizontalDirection": 0,
File diff suppressed because it is too large Load Diff
+4 -10
View File
@@ -1497,7 +1497,7 @@
},
"_type": 0,
"_fillType": 0,
"_sizeMode": 1,
"_sizeMode": 0,
"_fillCenter": {
"__type__": "cc.Vec2",
"x": 0,
@@ -2231,10 +2231,7 @@
"b": 255,
"a": 255
},
"_spriteFrame": {
"__uuid__": "db2b25f4-2d5c-49a7-82f4-6400a6656c08@f9941",
"__expectedType__": "cc.SpriteFrame"
},
"_spriteFrame": null,
"_type": 0,
"_fillType": 0,
"_sizeMode": 0,
@@ -3336,7 +3333,7 @@
},
"_type": 0,
"_fillType": 0,
"_sizeMode": 1,
"_sizeMode": 0,
"_fillCenter": {
"__type__": "cc.Vec2",
"x": 0,
@@ -4070,10 +4067,7 @@
"b": 255,
"a": 255
},
"_spriteFrame": {
"__uuid__": "db2b25f4-2d5c-49a7-82f4-6400a6656c08@f9941",
"__expectedType__": "cc.SpriteFrame"
},
"_spriteFrame": null,
"_type": 0,
"_fillType": 0,
"_sizeMode": 0,
+2 -2
View File
@@ -1,7 +1,7 @@
[
{
"__type__": "cc.Prefab",
"_name": "ReleasePanel",
"_name": "releasePanel",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
@@ -13,7 +13,7 @@
},
{
"__type__": "cc.Node",
"_name": "ReleasePanel",
"_name": "releasePanel",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
@@ -2,12 +2,12 @@
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "6972298a-8553-4fe8-8296-06f6d886d450",
"uuid": "aa097cc9-b234-4077-8b2e-e543767ca13f",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "ReleasePanel"
"syncNodeName": "releasePanel"
}
}
@@ -2,7 +2,7 @@
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "960a0da6-a01b-4707-a14b-a07527810a97",
"uuid": "0c235a5f-f9af-4f5f-958d-0b0da540f0d4",
"files": [],
"subMetas": {},
"userData": {}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "6aed1cfe-b7a3-4795-a52e-554ded5b742a",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "LoginPanel"
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "b0cec5e7-4109-468d-9859-d74c3cb7f184",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "NewPasswordPanel"
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "e95c307e-f028-4a48-a4b5-9b7ed6d701ff",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "RegisterPanel"
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "9e45f5f0-5e76-4015-b74f-e01cf64260df",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "SafeCheckPanel"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "3e1b82e5-c229-4cc3-b924-aadfd05c6015",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "3e1b82e5-c229-4cc3-b924-aadfd05c6015@6c48a",
"displayName": "多边形 1 拷贝 2",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "3e1b82e5-c229-4cc3-b924-aadfd05c6015",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "3e1b82e5-c229-4cc3-b924-aadfd05c6015@f9941",
"displayName": "多边形 1 拷贝 2",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 751,
"height": 153,
"rawWidth": 751,
"rawHeight": 153,
"borderTop": 66,
"borderBottom": 50,
"borderLeft": 55,
"borderRight": 55,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-375.5,
-76.5,
0,
375.5,
-76.5,
0,
-375.5,
76.5,
0,
375.5,
76.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
153,
751,
153,
0,
0,
751,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-375.5,
-76.5,
0
],
"maxPos": [
375.5,
76.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "3e1b82e5-c229-4cc3-b924-aadfd05c6015@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "3e1b82e5-c229-4cc3-b924-aadfd05c6015@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "55323d77-3d55-41f7-b26d-ca52dd1f424d",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "55323d77-3d55-41f7-b26d-ca52dd1f424d@6c48a",
"displayName": "多边形 1 拷贝 3",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "55323d77-3d55-41f7-b26d-ca52dd1f424d",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "55323d77-3d55-41f7-b26d-ca52dd1f424d@f9941",
"displayName": "多边形 1 拷贝 3",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 751,
"height": 157,
"rawWidth": 751,
"rawHeight": 157,
"borderTop": 66,
"borderBottom": 50,
"borderLeft": 55,
"borderRight": 55,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-375.5,
-78.5,
0,
375.5,
-78.5,
0,
-375.5,
78.5,
0,
375.5,
78.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
157,
751,
157,
0,
0,
751,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-375.5,
-78.5,
0
],
"maxPos": [
375.5,
78.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "55323d77-3d55-41f7-b26d-ca52dd1f424d@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "55323d77-3d55-41f7-b26d-ca52dd1f424d@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 714 B

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "760237d1-46b3-4c02-8e0b-849a95e36873",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "760237d1-46b3-4c02-8e0b-849a95e36873@6c48a",
"displayName": "矩形 11 拷贝",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "760237d1-46b3-4c02-8e0b-849a95e36873",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "760237d1-46b3-4c02-8e0b-849a95e36873@f9941",
"displayName": "矩形 11 拷贝",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 10,
"height": 307,
"rawWidth": 10,
"rawHeight": 307,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-5,
-153.5,
0,
5,
-153.5,
0,
-5,
153.5,
0,
5,
153.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
307,
10,
307,
0,
0,
10,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-5,
-153.5,
0
],
"maxPos": [
5,
153.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "760237d1-46b3-4c02-8e0b-849a95e36873@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "760237d1-46b3-4c02-8e0b-849a95e36873@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "9e8d6126-392d-4fd5-aaae-458b82aa363c",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "9e8d6126-392d-4fd5-aaae-458b82aa363c@6c48a",
"displayName": "矩形 13",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "9e8d6126-392d-4fd5-aaae-458b82aa363c",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "9e8d6126-392d-4fd5-aaae-458b82aa363c@f9941",
"displayName": "矩形 13",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 419,
"height": 130,
"rawWidth": 419,
"rawHeight": 130,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-209.5,
-65,
0,
209.5,
-65,
0,
-209.5,
65,
0,
209.5,
65,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
130,
419,
130,
0,
0,
419,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-209.5,
-65,
0
],
"maxPos": [
209.5,
65,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "9e8d6126-392d-4fd5-aaae-458b82aa363c@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "9e8d6126-392d-4fd5-aaae-458b82aa363c@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "656d9da9-1a0a-4bd9-949a-8562056efdc9",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "656d9da9-1a0a-4bd9-949a-8562056efdc9@6c48a",
"displayName": "矩形 8 拷贝 2",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "656d9da9-1a0a-4bd9-949a-8562056efdc9",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "656d9da9-1a0a-4bd9-949a-8562056efdc9@f9941",
"displayName": "矩形 8 拷贝 2",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 281,
"height": 125,
"rawWidth": 281,
"rawHeight": 125,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-140.5,
-62.5,
0,
140.5,
-62.5,
0,
-140.5,
62.5,
0,
140.5,
62.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
125,
281,
125,
0,
0,
281,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-140.5,
-62.5,
0
],
"maxPos": [
140.5,
62.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "656d9da9-1a0a-4bd9-949a-8562056efdc9@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "656d9da9-1a0a-4bd9-949a-8562056efdc9@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 987 B

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "4ff901ef-3f6d-4856-89f1-896ec11c8df8",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "4ff901ef-3f6d-4856-89f1-896ec11c8df8@6c48a",
"displayName": "矩形 8 拷贝 3",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "4ff901ef-3f6d-4856-89f1-896ec11c8df8",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "4ff901ef-3f6d-4856-89f1-896ec11c8df8@f9941",
"displayName": "矩形 8 拷贝 3",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 83,
"height": 83,
"rawWidth": 83,
"rawHeight": 83,
"borderTop": 26,
"borderBottom": 26,
"borderLeft": 26,
"borderRight": 26,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-41.5,
-41.5,
0,
41.5,
-41.5,
0,
-41.5,
41.5,
0,
41.5,
41.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
83,
83,
83,
0,
0,
83,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-41.5,
-41.5,
0
],
"maxPos": [
41.5,
41.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "4ff901ef-3f6d-4856-89f1-896ec11c8df8@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "4ff901ef-3f6d-4856-89f1-896ec11c8df8@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "cc5e58e3-3d6f-4ca7-b02f-8c47634b5b21",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "cc5e58e3-3d6f-4ca7-b02f-8c47634b5b21@6c48a",
"displayName": "矩形 8 拷贝 4",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "cc5e58e3-3d6f-4ca7-b02f-8c47634b5b21",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "cc5e58e3-3d6f-4ca7-b02f-8c47634b5b21@f9941",
"displayName": "矩形 8 拷贝 4",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 622,
"height": 125,
"rawWidth": 622,
"rawHeight": 125,
"borderTop": 33,
"borderBottom": 33,
"borderLeft": 33,
"borderRight": 33,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-311,
-62.5,
0,
311,
-62.5,
0,
-311,
62.5,
0,
311,
62.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
125,
622,
125,
0,
0,
622,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-311,
-62.5,
0
],
"maxPos": [
311,
62.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "cc5e58e3-3d6f-4ca7-b02f-8c47634b5b21@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "cc5e58e3-3d6f-4ca7-b02f-8c47634b5b21@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "07804017-427b-40ee-85a0-8f908fdda683",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "07804017-427b-40ee-85a0-8f908fdda683@6c48a",
"displayName": "矩形 8 拷贝 5",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "07804017-427b-40ee-85a0-8f908fdda683",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "07804017-427b-40ee-85a0-8f908fdda683@f9941",
"displayName": "矩形 8 拷贝 5",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 988,
"height": 189,
"rawWidth": 988,
"rawHeight": 189,
"borderTop": 34,
"borderBottom": 34,
"borderLeft": 34,
"borderRight": 34,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-494,
-94.5,
0,
494,
-94.5,
0,
-494,
94.5,
0,
494,
94.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
189,
988,
189,
0,
0,
988,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-494,
-94.5,
0
],
"maxPos": [
494,
94.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "07804017-427b-40ee-85a0-8f908fdda683@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "07804017-427b-40ee-85a0-8f908fdda683@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "689976b6-d1f4-49e9-b2d7-f1b6f7087f8c",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "689976b6-d1f4-49e9-b2d7-f1b6f7087f8c@6c48a",
"displayName": "组 3 拷贝",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "689976b6-d1f4-49e9-b2d7-f1b6f7087f8c",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "689976b6-d1f4-49e9-b2d7-f1b6f7087f8c@f9941",
"displayName": "组 3 拷贝",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 512,
"height": 71,
"rawWidth": 512,
"rawHeight": 71,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-256,
-35.5,
0,
256,
-35.5,
0,
-256,
35.5,
0,
256,
35.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
71,
512,
71,
0,
0,
512,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-256,
-35.5,
0
],
"maxPos": [
256,
35.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "689976b6-d1f4-49e9-b2d7-f1b6f7087f8c@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "689976b6-d1f4-49e9-b2d7-f1b6f7087f8c@6c48a"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

@@ -2,7 +2,7 @@
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "864139dc-174a-4005-848d-824583910814",
"uuid": "da34e8b7-59ca-4dc4-825d-d359b17be8c5",
"files": [
".json",
".png"
@@ -10,14 +10,14 @@
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "864139dc-174a-4005-848d-824583910814@6c48a",
"displayName": "矩形 13 拷贝",
"uuid": "da34e8b7-59ca-4dc4-825d-d359b17be8c5@6c48a",
"displayName": "LT_UI_SC1",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "864139dc-174a-4005-848d-824583910814",
"imageUuidOrDatabaseUri": "da34e8b7-59ca-4dc4-825d-d359b17be8c5",
"isUuid": true,
"visible": false,
"minfilter": "linear",
@@ -34,8 +34,8 @@
},
"f9941": {
"importer": "sprite-frame",
"uuid": "864139dc-174a-4005-848d-824583910814@f9941",
"displayName": "矩形 13 拷贝",
"uuid": "da34e8b7-59ca-4dc4-825d-d359b17be8c5@f9941",
"displayName": "LT_UI_SC1",
"id": "f9941",
"name": "spriteFrame",
"userData": {
@@ -46,14 +46,14 @@
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 87,
"height": 46,
"rawWidth": 87,
"rawHeight": 46,
"width": 46,
"height": 49,
"rawWidth": 46,
"rawHeight": 49,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 30,
"borderRight": 30,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
@@ -61,17 +61,17 @@
"meshType": 0,
"vertices": {
"rawPosition": [
-43.5,
-23,
-24.5,
0,
23,
-24.5,
0,
43.5,
-23,
24.5,
0,
-43.5,
23,
0,
43.5,
23,
24.5,
0
],
"indexes": [
@@ -84,12 +84,12 @@
],
"uv": [
0,
49,
46,
87,
46,
49,
0,
0,
87,
46,
0
],
"nuv": [
@@ -103,18 +103,18 @@
1
],
"minPos": [
-43.5,
-23,
-24.5,
0
],
"maxPos": [
43.5,
23,
24.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "864139dc-174a-4005-848d-824583910814@6c48a",
"imageUuidOrDatabaseUri": "da34e8b7-59ca-4dc4-825d-d359b17be8c5@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
@@ -129,6 +129,6 @@
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "864139dc-174a-4005-848d-824583910814@6c48a"
"redirect": "da34e8b7-59ca-4dc4-825d-d359b17be8c5@6c48a"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -2,7 +2,7 @@
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "90c8ad93-27b4-4617-8691-30ae8b0877c8",
"uuid": "7b9bf177-f5b8-4548-88d1-b0311ae5f387",
"files": [
".json",
".png"
@@ -10,14 +10,14 @@
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "90c8ad93-27b4-4617-8691-30ae8b0877c8@6c48a",
"displayName": "编辑",
"uuid": "7b9bf177-f5b8-4548-88d1-b0311ae5f387@6c48a",
"displayName": "LT_UI_SC2",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "90c8ad93-27b4-4617-8691-30ae8b0877c8",
"imageUuidOrDatabaseUri": "7b9bf177-f5b8-4548-88d1-b0311ae5f387",
"isUuid": true,
"visible": false,
"minfilter": "linear",
@@ -34,8 +34,8 @@
},
"f9941": {
"importer": "sprite-frame",
"uuid": "90c8ad93-27b4-4617-8691-30ae8b0877c8@f9941",
"displayName": "编辑",
"uuid": "7b9bf177-f5b8-4548-88d1-b0311ae5f387@f9941",
"displayName": "LT_UI_SC2",
"id": "f9941",
"name": "spriteFrame",
"userData": {
@@ -114,7 +114,7 @@
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "90c8ad93-27b4-4617-8691-30ae8b0877c8@6c48a",
"imageUuidOrDatabaseUri": "7b9bf177-f5b8-4548-88d1-b0311ae5f387@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
@@ -129,6 +129,6 @@
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "90c8ad93-27b4-4617-8691-30ae8b0877c8@6c48a"
"redirect": "7b9bf177-f5b8-4548-88d1-b0311ae5f387@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 980 B

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "8a2389df-4012-4239-b7f8-a69d21f586db",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "8a2389df-4012-4239-b7f8-a69d21f586db@6c48a",
"displayName": "w_录像 拷贝",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "8a2389df-4012-4239-b7f8-a69d21f586db",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "8a2389df-4012-4239-b7f8-a69d21f586db@f9941",
"displayName": "w_录像 拷贝",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 88,
"height": 55,
"rawWidth": 88,
"rawHeight": 55,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-44,
-27.5,
0,
44,
-27.5,
0,
-44,
27.5,
0,
44,
27.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
55,
88,
55,
0,
0,
88,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-44,
-27.5,
0
],
"maxPos": [
44,
27.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "8a2389df-4012-4239-b7f8-a69d21f586db@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "8a2389df-4012-4239-b7f8-a69d21f586db@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 988 B

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "0195d912-9f4d-44b3-9712-d95f0668e4af",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "0195d912-9f4d-44b3-9712-d95f0668e4af@6c48a",
"displayName": "图片3 拷贝 2",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "0195d912-9f4d-44b3-9712-d95f0668e4af",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "0195d912-9f4d-44b3-9712-d95f0668e4af@f9941",
"displayName": "图片3 拷贝 2",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 62,
"height": 56,
"rawWidth": 62,
"rawHeight": 56,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-31,
-28,
0,
31,
-28,
0,
-31,
28,
0,
31,
28,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
56,
62,
56,
0,
0,
62,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-31,
-28,
0
],
"maxPos": [
31,
28,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0195d912-9f4d-44b3-9712-d95f0668e4af@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "0195d912-9f4d-44b3-9712-d95f0668e4af@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 998 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "ae1676fd-9d9b-47ef-abc9-a56da69425e9",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "ae1676fd-9d9b-47ef-abc9-a56da69425e9@6c48a",
"displayName": "播放 拷贝 2",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "ae1676fd-9d9b-47ef-abc9-a56da69425e9",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "ae1676fd-9d9b-47ef-abc9-a56da69425e9@f9941",
"displayName": "播放 拷贝 2",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 83,
"height": 83,
"rawWidth": 83,
"rawHeight": 83,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-41.5,
-41.5,
0,
41.5,
-41.5,
0,
-41.5,
41.5,
0,
41.5,
41.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
83,
83,
83,
0,
0,
83,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-41.5,
-41.5,
0
],
"maxPos": [
41.5,
41.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "ae1676fd-9d9b-47ef-abc9-a56da69425e9@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "ae1676fd-9d9b-47ef-abc9-a56da69425e9@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "231a4bd0-d031-459a-bc94-d25a5d2a478f",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "231a4bd0-d031-459a-bc94-d25a5d2a478f@6c48a",
"displayName": "电话 拷贝",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "231a4bd0-d031-459a-bc94-d25a5d2a478f",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "231a4bd0-d031-459a-bc94-d25a5d2a478f@f9941",
"displayName": "电话 拷贝",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 103,
"height": 102,
"rawWidth": 103,
"rawHeight": 102,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-51.5,
-51,
0,
51.5,
-51,
0,
-51.5,
51,
0,
51.5,
51,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
102,
103,
102,
0,
0,
103,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-51.5,
-51,
0
],
"maxPos": [
51.5,
51,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "231a4bd0-d031-459a-bc94-d25a5d2a478f@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "231a4bd0-d031-459a-bc94-d25a5d2a478f@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "989deb0d-8788-42de-81ee-5e1dfdbe6901",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "989deb0d-8788-42de-81ee-5e1dfdbe6901@6c48a",
"displayName": "矩形 10 拷贝",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "989deb0d-8788-42de-81ee-5e1dfdbe6901",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "989deb0d-8788-42de-81ee-5e1dfdbe6901@f9941",
"displayName": "矩形 10 拷贝",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 268,
"height": 80,
"rawWidth": 268,
"rawHeight": 80,
"borderTop": 2,
"borderBottom": 20,
"borderLeft": 2,
"borderRight": 20,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-134,
-40,
0,
134,
-40,
0,
-134,
40,
0,
134,
40,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
80,
268,
80,
0,
0,
268,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-134,
-40,
0
],
"maxPos": [
134,
40,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "989deb0d-8788-42de-81ee-5e1dfdbe6901@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "989deb0d-8788-42de-81ee-5e1dfdbe6901@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 714 B

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "1f2275dc-ceb1-4b48-a4ae-f63f7abb1095",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "1f2275dc-ceb1-4b48-a4ae-f63f7abb1095@6c48a",
"displayName": "矩形 11 拷贝",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "1f2275dc-ceb1-4b48-a4ae-f63f7abb1095",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "1f2275dc-ceb1-4b48-a4ae-f63f7abb1095@f9941",
"displayName": "矩形 11 拷贝",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 10,
"height": 307,
"rawWidth": 10,
"rawHeight": 307,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-5,
-153.5,
0,
5,
-153.5,
0,
-5,
153.5,
0,
5,
153.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
307,
10,
307,
0,
0,
10,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-5,
-153.5,
0
],
"maxPos": [
5,
153.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "1f2275dc-ceb1-4b48-a4ae-f63f7abb1095@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "1f2275dc-ceb1-4b48-a4ae-f63f7abb1095@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "42906726-76e0-4225-9dbf-13c622bfc834",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "42906726-76e0-4225-9dbf-13c622bfc834@6c48a",
"displayName": "矩形 3 拷贝 4",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "42906726-76e0-4225-9dbf-13c622bfc834",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "42906726-76e0-4225-9dbf-13c622bfc834@f9941",
"displayName": "矩形 3 拷贝 4",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 800,
"height": 88,
"rawWidth": 800,
"rawHeight": 88,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-400,
-44,
0,
400,
-44,
0,
-400,
44,
0,
400,
44,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
88,
800,
88,
0,
0,
800,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-400,
-44,
0
],
"maxPos": [
400,
44,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "42906726-76e0-4225-9dbf-13c622bfc834@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "42906726-76e0-4225-9dbf-13c622bfc834@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "55a02beb-4d16-4456-96b3-fdcddb21b9f4",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "55a02beb-4d16-4456-96b3-fdcddb21b9f4@6c48a",
"displayName": "矩形 3 拷贝5",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "55a02beb-4d16-4456-96b3-fdcddb21b9f4",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "55a02beb-4d16-4456-96b3-fdcddb21b9f4@f9941",
"displayName": "矩形 3 拷贝5",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 120,
"height": 120,
"rawWidth": 120,
"rawHeight": 120,
"borderTop": 56,
"borderBottom": 56,
"borderLeft": 56,
"borderRight": 56,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-60,
-60,
0,
60,
-60,
0,
-60,
60,
0,
60,
60,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
120,
120,
120,
0,
0,
120,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-60,
-60,
0
],
"maxPos": [
60,
60,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "55a02beb-4d16-4456-96b3-fdcddb21b9f4@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "55a02beb-4d16-4456-96b3-fdcddb21b9f4@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "df5397c4-a429-4b6e-bc48-2ae0dbdb844b",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "df5397c4-a429-4b6e-bc48-2ae0dbdb844b@6c48a",
"displayName": "矩形 6",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "df5397c4-a429-4b6e-bc48-2ae0dbdb844b",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "df5397c4-a429-4b6e-bc48-2ae0dbdb844b@f9941",
"displayName": "矩形 6",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 541,
"height": 146,
"rawWidth": 541,
"rawHeight": 146,
"borderTop": 27,
"borderBottom": 27,
"borderLeft": 27,
"borderRight": 27,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-270.5,
-73,
0,
270.5,
-73,
0,
-270.5,
73,
0,
270.5,
73,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
146,
541,
146,
0,
0,
541,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-270.5,
-73,
0
],
"maxPos": [
270.5,
73,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "df5397c4-a429-4b6e-bc48-2ae0dbdb844b@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "df5397c4-a429-4b6e-bc48-2ae0dbdb844b@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "1876a540-2606-4dee-ab76-5db661e5f559",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "1876a540-2606-4dee-ab76-5db661e5f559@6c48a",
"displayName": "矩形 8 拷贝",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "1876a540-2606-4dee-ab76-5db661e5f559",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "1876a540-2606-4dee-ab76-5db661e5f559@f9941",
"displayName": "矩形 8 拷贝",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 503,
"height": 7,
"rawWidth": 503,
"rawHeight": 7,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-251.5,
-3.5,
0,
251.5,
-3.5,
0,
-251.5,
3.5,
0,
251.5,
3.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
7,
503,
7,
0,
0,
503,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-251.5,
-3.5,
0
],
"maxPos": [
251.5,
3.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "1876a540-2606-4dee-ab76-5db661e5f559@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "1876a540-2606-4dee-ab76-5db661e5f559@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "e40904ac-0cdb-45a5-9c51-bf2092c8a776",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "e40904ac-0cdb-45a5-9c51-bf2092c8a776@6c48a",
"displayName": "矩形 8",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "e40904ac-0cdb-45a5-9c51-bf2092c8a776",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "e40904ac-0cdb-45a5-9c51-bf2092c8a776@f9941",
"displayName": "矩形 8",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 503,
"height": 7,
"rawWidth": 503,
"rawHeight": 7,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-251.5,
-3.5,
0,
251.5,
-3.5,
0,
-251.5,
3.5,
0,
251.5,
3.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
7,
503,
7,
0,
0,
503,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-251.5,
-3.5,
0
],
"maxPos": [
251.5,
3.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "e40904ac-0cdb-45a5-9c51-bf2092c8a776@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "e40904ac-0cdb-45a5-9c51-bf2092c8a776@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

@@ -1,134 +0,0 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "60a79bd4-2dec-41f2-97a6-1611af8f04d8",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "60a79bd4-2dec-41f2-97a6-1611af8f04d8@6c48a",
"displayName": "组 1 拷贝",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "60a79bd4-2dec-41f2-97a6-1611af8f04d8",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "60a79bd4-2dec-41f2-97a6-1611af8f04d8@f9941",
"displayName": "组 1 拷贝",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 72,
"height": 61,
"rawWidth": 72,
"rawHeight": 61,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-36,
-30.5,
0,
36,
-30.5,
0,
-36,
30.5,
0,
36,
30.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
61,
72,
61,
0,
0,
72,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-36,
-30.5,
0
],
"maxPos": [
36,
30.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "60a79bd4-2dec-41f2-97a6-1611af8f04d8@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "60a79bd4-2dec-41f2-97a6-1611af8f04d8@6c48a"
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Some files were not shown because too many files have changed in this diff Show More