SelectMapPanel.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { _decorator, Button, Component, EditBox, instantiate, Node, ScrollView, UITransform, Vec2, Vec3 } from 'cc';
  2. import { LayerMgr } from '../../script/Manager/LayerMgr';
  3. import { allMapList, getAllMapKeys, MapData, SuperFind, UserMap } from '../../script/Manager/LocalDataMgr';
  4. import { MapItem } from './MapItem';
  5. const { ccclass, property } = _decorator;
  6. @ccclass('SelectMapPanel')
  7. export class SelectMapPanel extends Component {
  8. @property(Node)
  9. itemRoot: Node = null;
  10. @property(Node)
  11. itemPrefab: Node = null;
  12. @property(Button)
  13. btnClose: Button = null;
  14. @property(ScrollView)
  15. scrollView:ScrollView = null;
  16. @property(EditBox)
  17. editBox:EditBox = null;
  18. @property(Button)
  19. btnTurn:Button = null;
  20. _mapData:MapData = null
  21. _allMapList:{ [key: number]: string };
  22. _items: Node[] = [];
  23. _hasCreatedItems:boolean = false;
  24. protected start(): void {
  25. this.btnClose.node.on(Node.EventType.TOUCH_END,this.onBtnCloseClick,this)
  26. this.btnTurn.node.on(Node.EventType.TOUCH_END,this.scrollToItem,this)
  27. }
  28. init() {
  29. if(this._hasCreatedItems) return;
  30. this._hasCreatedItems = true;
  31. this._allMapList = allMapList
  32. this._mapData = UserMap.getMapData()
  33. let allMapKeys = getAllMapKeys()
  34. let count = allMapKeys.length;
  35. for (let i = 0; i < count; i++) {
  36. this.createItem(allMapKeys[i]);
  37. }
  38. }
  39. onBtnCloseClick()
  40. {
  41. this.node.active = false
  42. }
  43. createItem(key: number) {
  44. let itemNode = instantiate(this.itemPrefab);
  45. itemNode.parent = this.itemRoot;
  46. this._items.push(itemNode);
  47. itemNode.active = true
  48. let mapItem = itemNode.getComponent(MapItem)
  49. mapItem.init(key,this.judgeSelect(key))
  50. }
  51. judgeSelect(key)
  52. {
  53. let selMaps = this._mapData.selectedMaps
  54. let index = selMaps.indexOf(key)
  55. return index !== -1
  56. }
  57. clearSelectAllMaps()
  58. {
  59. UserMap.removeAllSelectMap()
  60. this.refreshMapSelectioin()
  61. }
  62. refreshMapSelectioin()
  63. {
  64. let allMapKeys = getAllMapKeys()
  65. let count = allMapKeys.length;
  66. for(let i = 0; i < count; i++){
  67. let item = this._items[i]
  68. item.getComponent(MapItem).setSelectMap(false)
  69. }
  70. }
  71. slideToBottom()
  72. {
  73. this.scrollView.scrollToBottom()
  74. }
  75. selectAllMap()
  76. {
  77. UserMap.addAllSelectMap()
  78. this._items.forEach((item)=>{
  79. item.getComponent(MapItem).setSelectMap(true)
  80. })
  81. }
  82. scrollToItem() {
  83. let page = parseInt(this.editBox.string);
  84. if (isNaN(page)) return;
  85. let itemNode = this.itemRoot.children[page];
  86. if (!itemNode) return;
  87. const viewHeight = this.scrollView.node.getComponent(UITransform).height;
  88. const itemHeight = itemNode.getComponent(UITransform).height;
  89. // 获取itemNode在content中的位置(局部坐标)
  90. const itemPos = itemNode.position;
  91. const itemTop = -itemPos.y;
  92. // 使item在视图中居中需要滚动的偏移量(从content顶部到视图顶部的距离)
  93. let offset = itemTop - (viewHeight - itemHeight) / 2;
  94. // 获取内容总高度(content节点的高度)
  95. const contentHeight = this.itemRoot.getComponent(UITransform).height;
  96. // 最大可滚动的偏移量
  97. const maxScrollOffset = Math.max(0, contentHeight - viewHeight);
  98. // 限制offset在[0, maxScrollOffset]之间
  99. offset = Math.max(0, Math.min(maxScrollOffset, offset));
  100. // 滚动到该偏移量
  101. this.scrollView.scrollToOffset(new Vec2(0, offset), 0.5);
  102. }
  103. }