ElementAction.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import { _decorator, BoxCollider2D, CircleCollider2D, Color, Component, ERigidBody2DType, instantiate, PolygonCollider2D, RigidBody2D, Sprite, tween, UIOpacity, view, Node, isValid } from 'cc';
  2. import { EventDispatcher } from '../../core_tgx/easy_ui_framework/EventDispatcher';
  3. import { CarColorHex, CarColors } from './CarColorsGlobalTypes';
  4. import { HoleComponent } from './Components/HoleComponent';
  5. import { PinComponent } from './Components/PinComponent';
  6. import { GameEvent } from './Enum/GameEvent';
  7. import { ResourcePool } from './ResourcePool';
  8. const { ccclass, property } = _decorator;
  9. @ccclass('ElementAction')
  10. export class ElementAction extends Component {
  11. ele_color: CarColors
  12. start() {
  13. EventDispatcher.instance.on(GameEvent.EVENT_CHECK_ELEMENT_CHILDREN, this.checkElementChildren, this);
  14. }
  15. update(deltaTime: number) {
  16. let currentPosition = this.node.getPosition().clone();
  17. if (currentPosition.y < - view.getVisibleSize().height) {
  18. this.removeElement();
  19. }
  20. }
  21. removeElement() {
  22. if (isValid(this.node)) {
  23. this.node.removeFromParent();
  24. this.node.destroy();
  25. EventDispatcher.instance.emit(GameEvent.EVENT_UPDATE_LAYER);
  26. }
  27. }
  28. //检测没有钉子 就变成传感器
  29. public checkElementChildren() {
  30. if (!this.node) return;
  31. const pins = this.node.getComponentsInChildren(PinComponent)!;
  32. // console.log('检测是否还有钉子:', pins.length)
  33. if (pins.length == 0) {
  34. console.log("没有钉子 Element刚体变成动力学");
  35. this.node.getComponent(RigidBody2D).type = ERigidBody2DType.Dynamic;
  36. }
  37. }
  38. public get_hole_num(): number {
  39. let hole_num: number = 0;
  40. this.node.children.forEach(element => {
  41. if (element.getComponent(HoleComponent)) {
  42. hole_num++;
  43. }
  44. });
  45. return hole_num;
  46. }
  47. public init_element(group_id: number, ele_color: CarColors) {
  48. this.ele_color = ele_color;
  49. this.node.getComponent(RigidBody2D).group = group_id;
  50. this.node.getComponents(BoxCollider2D).forEach(element => {
  51. element.group = group_id;
  52. });
  53. this.node.getComponents(CircleCollider2D).forEach(element => {
  54. element.group = group_id;
  55. });
  56. this.node.getComponents(PolygonCollider2D).forEach(element => {
  57. element.group = group_id;
  58. });
  59. //set img color
  60. }
  61. public init_pin(group_id: number, color_pin_arr: CarColors[]) {
  62. //获取 hole
  63. this.node.children.forEach(element => {
  64. if (element.getComponent(HoleComponent)) {
  65. // let new_pin = instantiate(ResourcePool.instance.get_prefab("pin"));
  66. // this.node.addChild(new_pin);
  67. // new_pin.setPosition(element.position);
  68. // new_pin.getComponent(PinComponent).init_date(group_id, color_pin_arr.shift(), element.getComponent(HoleComponent));
  69. const pin = element.getComponentInChildren(PinComponent)!;
  70. if (pin) {
  71. pin.init_date(group_id, color_pin_arr.shift(), element.getComponent(HoleComponent));
  72. }
  73. }
  74. });
  75. }
  76. get_pin_color(arr: PinComponent[]) {
  77. this.node.children.forEach(pin_node => {
  78. // pin_node.getComponent(PinComponent)?.get_pin_color(arr);
  79. let pin_action = pin_node.getComponent(PinComponent)
  80. if (pin_action && pin_action.pin_color) {
  81. arr.push(pin_node.getComponent(PinComponent));
  82. }
  83. });
  84. }
  85. public flash_img(t: number = 0.3) {
  86. this.node.children.forEach(element => {
  87. if (element.name == "img") {
  88. if (element.getComponent(UIOpacity)) {
  89. let t: number = 0.3
  90. let opc_1 = 100;
  91. let opc_2 = 200;
  92. element.getComponent(UIOpacity).opacity = 255;
  93. tween(element.getComponent(UIOpacity))
  94. .to(t, { opacity: opc_2 }, { easing: 'quadInOut' })
  95. .to(t, { opacity: opc_1 }, { easing: 'quadInOut' })
  96. .to(t, { opacity: opc_2 }, { easing: 'quadInOut' })
  97. .to(t, { opacity: opc_1 }, { easing: 'quadInOut' })
  98. .to(t, { opacity: 255 }, { easing: 'quadInOut' })
  99. .call(() => {
  100. element.getComponent(UIOpacity).opacity = 255;
  101. })
  102. // .start();
  103. }
  104. }
  105. });
  106. }
  107. private set_img_color(_color: CarColors, a: number) {
  108. this.node.children.forEach(element => {
  109. if (element.name == "img" && _color) {
  110. let img = element.getComponent(Sprite);
  111. img.color = new Color().fromHEX(CarColorHex[_color]);
  112. }
  113. });
  114. }
  115. // this this layer is black color,but don't show pin for shows
  116. public set_layer_bg_or_orgin(is_bg: boolean) {
  117. if (is_bg) {
  118. this.node.getComponent(RigidBody2D).type = ERigidBody2DType.Static;
  119. this.node.children.forEach(element => {
  120. //默认都不显示
  121. element.active = false;
  122. if (element.name == "img") {
  123. element.active = true;
  124. //只设置图片颜色
  125. this.set_img_color(CarColors.Black, 180);
  126. }
  127. });
  128. } else {
  129. this.node.children.forEach(element => {
  130. //默认都不显示
  131. element.active = true;
  132. });
  133. this.set_img_color(CarColors.SpriteWhite, 190);
  134. this.node.getComponent(RigidBody2D).type = ERigidBody2DType.Dynamic;
  135. }
  136. }
  137. protected onDestroy(): void {
  138. EventDispatcher.instance.off(GameEvent.EVENT_CHECK_ELEMENT_CHILDREN, this.checkElementChildren);
  139. }
  140. }