ADHelper.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { _decorator, Component, Enum, Vec2 } from 'cc';
  2. import { DataSystem } from '../core/data/DataSystem';
  3. import { Http } from '../core/net/Http';
  4. import { ADData } from '../data/jsb/ADData';
  5. import { platform } from '../data/jsb/platform';
  6. const { ccclass, property } = _decorator;
  7. export enum ADType {
  8. None,
  9. Interstutal,
  10. FullScreen,
  11. Banner,
  12. Native
  13. }
  14. export enum ADShowType {
  15. Single,
  16. Both
  17. }
  18. export enum ADDeleyType {
  19. Const,
  20. Random
  21. }
  22. @ccclass("ADHelperDeleyData")
  23. export class ADHelperDeleyData {
  24. @property({
  25. type: Enum(ADDeleyType),
  26. tooltip: "延迟类型:\nConst:固定时间\nRandom:随机时间"
  27. })
  28. type: ADDeleyType = ADDeleyType.Const;
  29. @property({
  30. tooltip: "延迟时间(常量)", visible() {
  31. return this.type == ADDeleyType.Const;
  32. }
  33. })
  34. public deley_const: number = 0;
  35. @property({
  36. tooltip: "延迟时间(随机值)", visible() {
  37. return this.type == ADDeleyType.Random;
  38. }
  39. })
  40. public deley_random: Vec2 = new Vec2();
  41. }
  42. @ccclass("ADHelperData")
  43. export class ADHelperData {
  44. @property({
  45. type: Enum(ADType),
  46. tooltip: "广告类型:\nNone:不弹广告\nInterstutal:插屏广告\nFullScreen:全屏广告\nBanner:banner广告\nNative:原生信息流广告"
  47. })
  48. type: ADType = ADType.None;
  49. @property({ tooltip: "广告权重" }) weight: number = 0;
  50. @property({ type: ADHelperDeleyData, tooltip: "广告延迟显示时间(秒)" }) deley: ADHelperDeleyData = new ADHelperDeleyData();
  51. }
  52. @ccclass('ADHelper')
  53. export class ADHelper extends Component {
  54. @property({
  55. type: Enum(ADShowType),
  56. tooltip: "广告显示方式:\nsingle:只显示单个广告\nboth:可同时显示多个广告"
  57. })
  58. showType: ADShowType = ADShowType.Single;
  59. @property({ type: [ADHelperData], tooltip: "广告数据集合" }) ads: Array<ADHelperData> = [];
  60. @property({ tooltip: "是否立即显示广告" }) showOnLoad: boolean = true;
  61. private totleWeight = 0;
  62. start() {
  63. this.getComponent(Http) || this.addComponent(Http);
  64. for (let i = 0; i < this.ads.length; i++) {
  65. this.totleWeight += this.ads[i].weight;
  66. }
  67. if (this.showOnLoad) {
  68. this.show();
  69. }
  70. }
  71. public show(): void {
  72. this.doRandom();
  73. }
  74. private doRandom(): void {
  75. if (this.showType == ADShowType.Single) {
  76. let random = this.random(0, this.totleWeight);
  77. let curWight = 0;
  78. for (let i = 0; i < this.ads.length; i++) {
  79. curWight += this.ads[i].weight;
  80. if (random <= curWight) {
  81. this.showAD(this.ads[i]);
  82. return;
  83. }
  84. }
  85. } else {
  86. for (let i = 0; i < this.ads.length; i++) {
  87. if (this.random(0, this.totleWeight) <= this.ads[i].weight) {
  88. this.showAD(this.ads[i]);
  89. }
  90. }
  91. }
  92. }
  93. private nativeADIsShow = false;
  94. private BannerADIsShow = false;
  95. private showAD(data: ADHelperData): void {
  96. let deley = 0;
  97. if (data.deley.type == ADDeleyType.Const) {
  98. deley = data.deley.deley_const;
  99. } else if (data.deley.type == ADDeleyType.Random) {
  100. deley = this.random(data.deley.deley_random.x, data.deley.deley_random.y);
  101. }
  102. let self = this;
  103. if (deley) {
  104. this.scheduleOnce(() => {
  105. self._showAD(data);
  106. }, deley);
  107. }
  108. else {
  109. self._showAD(data);
  110. }
  111. }
  112. private _showAD(data) {
  113. switch (data.type) {
  114. case ADType.None:
  115. break;
  116. case ADType.Native:
  117. this.nativeADIsShow = true;
  118. platform.showNativeAD();
  119. break;
  120. case ADType.Interstutal:
  121. platform.showInterstutalAD();
  122. break;
  123. case ADType.FullScreen:
  124. platform.showFullScreenAD();
  125. break;
  126. case ADType.Banner:
  127. this.BannerADIsShow = true;
  128. platform.showBannerAD();
  129. break;
  130. }
  131. }
  132. private random(min: number, max: number): number {
  133. return min + Math.random() * (max - min);
  134. }
  135. onDisable() {
  136. if (this.nativeADIsShow) {
  137. platform.removeNativeAD();
  138. }
  139. if (this.BannerADIsShow) {
  140. platform.removeBannerAD();
  141. }
  142. }
  143. onDestroy() {
  144. if (this.nativeADIsShow) {
  145. platform.removeNativeAD();
  146. }
  147. if (this.BannerADIsShow) {
  148. platform.removeBannerAD();
  149. }
  150. }
  151. }