BannerLoop.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { _decorator, Component, Node } from 'cc';
  2. const { ccclass, property } = _decorator;
  3. @ccclass('BannerLoop')
  4. export class BannerLoop{
  5. /**
  6. * banner创建函数
  7. */
  8. private __bannerCreateHandler:Function;
  9. /**
  10. * banner销毁函数
  11. */
  12. private __bannerDestroyHandler:Function;
  13. /**
  14. * bannerID列表
  15. */
  16. private __bannerIDs:string[];
  17. /**
  18. * banner实例
  19. */
  20. private __bannerMap:any;
  21. /**
  22. * 当前显示的Banner
  23. */
  24. private __currentBanner:string;
  25. /**
  26. * 最大显示次数
  27. */
  28. private __maxShowCount:number;
  29. constructor(){
  30. }
  31. init(maxShowCount:number,bannerIDs:string[],bannerCreateHandler:Function,bannerDestroyHanler:Function):void{
  32. this.__maxShowCount=maxShowCount;
  33. this.__bannerIDs=bannerIDs;
  34. this.__bannerCreateHandler=bannerCreateHandler;
  35. this.__bannerDestroyHandler=bannerDestroyHanler;
  36. this.__bannerMap={};
  37. if(this.__bannerIDs.length==0){
  38. return;
  39. }
  40. this.__bannerIDs.forEach(id => {
  41. let banner:any=this.__bannerCreateHandler(id);
  42. let bannerProxy:BannerProxy=new BannerProxy(id,banner);
  43. this.__bannerMap[id]=bannerProxy;
  44. });
  45. }
  46. showBanner():void{
  47. if(this.__currentBanner!=undefined){
  48. this.hideBanner();
  49. }
  50. if(this.__currentBanner==undefined){
  51. this.__currentBanner=this.__bannerIDs[0];
  52. }else{
  53. let index:number=this.__bannerIDs.indexOf(this.__currentBanner);
  54. if(index<this.__bannerIDs.length-1){
  55. this.__currentBanner=this.__bannerIDs[index+1];
  56. }else{
  57. this.__currentBanner=this.__bannerIDs[0];
  58. }
  59. }
  60. let proxy:BannerProxy=this.__bannerMap[this.__currentBanner];
  61. if(!proxy){
  62. let banner:any=this.__bannerCreateHandler(this.__currentBanner);
  63. proxy=new BannerProxy(this.__currentBanner,banner);
  64. this.__bannerMap[this.__currentBanner]=proxy;
  65. }
  66. proxy.show();
  67. }
  68. hideBanner():void{
  69. let proxy:BannerProxy=this.__bannerMap[this.__currentBanner];
  70. if(!proxy){
  71. return;
  72. }
  73. proxy.hide();
  74. if(proxy.showIndex>this.__maxShowCount){
  75. delete this.__bannerMap[proxy.id];
  76. this.__bannerDestroyHandler(proxy.banner);
  77. proxy.destroy();
  78. }
  79. }
  80. }
  81. class BannerProxy
  82. {
  83. banner:any;
  84. id:string;
  85. showIndex:number;
  86. maxCount:number;
  87. private __isShowing:boolean;
  88. private __loaded:boolean;
  89. constructor(id:string,banner:any){
  90. this.id=id;
  91. this.banner=banner;
  92. this.showIndex=0;
  93. //加载回调
  94. this.banner.onLoad(()=>{
  95. console.log("banner加载完成:");
  96. this.__loaded=true;
  97. if(this.__isShowing){
  98. this.banner.show();
  99. }
  100. })
  101. }
  102. show():void{
  103. this.__isShowing=true;
  104. this.showIndex++;
  105. if(this.__loaded){
  106. this.banner.show();
  107. }
  108. }
  109. hide():void{
  110. this.__isShowing=false;
  111. if(this.__loaded){
  112. this.banner.hide();
  113. }
  114. }
  115. destroy():void{
  116. this.banner=null;
  117. this.id=null;
  118. this.showIndex=0;
  119. }
  120. }