widget_base.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. import { _decorator, assetManager, Color, Component, ImageAsset, Node, Size, Sprite, SpriteFrame, Texture2D, tween, Tween, UIOpacity, UITransform, Vec3 } from 'cc';
  2. import { ani_frame, att_ani_data, event_item, widget_item_data } from '../../../data/data';
  3. import { gameManager } from '../gameManager';
  4. import { ClientEvent } from '../../clientEvent';
  5. import { config } from '../../config';
  6. import { tools } from '../../tools';
  7. const { ccclass, property } = _decorator;
  8. class BindTarget{
  9. color : Color;
  10. opacity:number;
  11. size:Size;
  12. pos:Vec3;
  13. rotation:number;
  14. anchorPointX:number;
  15. anchorPointY:number;
  16. }
  17. @ccclass('widget_base')
  18. export class widget_base extends Component {
  19. @property(Node) icon:Node = null;
  20. protected mData:widget_item_data = null;
  21. protected mAnimationList:att_ani_data[] = []; //动画组
  22. protected mCurRunAnimation:ani_frame[] = [];
  23. protected mCurAnimation:att_ani_data = null;
  24. protected mPlayStatus:boolean = false;
  25. protected mIsFinish:boolean = false;
  26. protected mIsActive:boolean = false;
  27. protected mIsShow:boolean = false;
  28. private bindTarget:BindTarget = null;
  29. protected isInit:boolean = true;
  30. protected initWidget(data:widget_item_data){
  31. this.mData = data;
  32. this.icon.getComponent(UITransform).contentSize = new Size(this.mData.att.width,this.mData.att.height)
  33. this.icon.position = new Vec3(this.mData.att.x,this.mData.att.y)
  34. if(this.mData.att.rotation==undefined||this.mData.att.rotation==null) {
  35. this.icon.angle = 0
  36. } else {
  37. this.icon.angle = this.mData.att.rotation
  38. }
  39. if(this.icon.getComponent(UIOpacity)===null){
  40. this.icon.addComponent(UIOpacity)
  41. }
  42. if(this.mData.att.src.length>0){
  43. this.icon.getComponent(Sprite).spriteFrame = gameManager.getCacheSpriteFrameByName(this.mData.att.src)
  44. }
  45. this.updateDir()
  46. this.mIsShow = this.mData.att.is_show;
  47. this.mIsActive = this.mData.att.is_interaction;
  48. this.mAnimationList = this.mData.att.animation_list;
  49. if(this.mIsShow){
  50. this.node.active = true;
  51. this.onWidgetShow()
  52. }else{
  53. this.node.active = false;
  54. }
  55. if(this.isInit){
  56. this.init()
  57. }else{
  58. this.node.position = Vec3.ZERO;
  59. this.icon.position = Vec3.ZERO;
  60. this.node.active = true;
  61. this.onWidgetShow()
  62. }
  63. // ClientEvent.on(config.EventRun.NOTICE_EVENT,this.beActive.bind(this),this)
  64. // ClientEvent.on(config.EventRun.WIDGET_HIDE,this.hide.bind(this),this)
  65. };
  66. updateDir(){
  67. switch (this.mData.att.img_dir) {
  68. case config.widget_scale_dir.left:
  69. this.node.scale = new Vec3(-1,1,1)
  70. break;
  71. case config.widget_scale_dir.up:
  72. this.node.scale = new Vec3(1,-1,1)
  73. break;
  74. case config.widget_scale_dir.normal:
  75. this.node.scale = new Vec3(1,1,1)
  76. break;
  77. }
  78. }
  79. protected onDestroy(): void {
  80. // ClientEvent.off(config.EventRun.NOTICE_EVENT,this.beActive.bind(this),this)
  81. }
  82. private getAniById(id:number){
  83. if(this.mAnimationList.length>0){
  84. for (let index = 0; index < this.mAnimationList.length; index++) {
  85. const element = this.mAnimationList[index];
  86. if(id==element.ani_id){
  87. return element;
  88. }
  89. }
  90. }
  91. return null;
  92. }
  93. onWidgetShow(){
  94. this.node.active = true;
  95. this.mIsShow = true;
  96. if(this.mData.att.animation_list.length>0){
  97. if(this.mData.att.animation_list[0].ani_frame_list.length<=0){
  98. }else{
  99. this.mCurAnimation = this.getAniById(this.mData.att.animation_list[0].ani_id)
  100. if(this.mCurAnimation){
  101. this.mCurRunAnimation = this.mCurAnimation.ani_frame_list;
  102. if(this.mCurRunAnimation.length<2){
  103. }else{
  104. this.runAnimation()
  105. }
  106. }else{
  107. return tools.showToast(`错误的动画配置!id:${this.mData.att.id}-请检查`)
  108. }
  109. }
  110. }
  111. }
  112. public hide(widgetId:number,event:event_item){
  113. if(widgetId===this.mData.att.id){
  114. this.mIsShow = false;
  115. this.node.active = false;
  116. }
  117. }
  118. public beActive(widgetId:number,event:event_item){
  119. if(widgetId===this.mData.att.id){
  120. if(event.type===config.event_type.hide){
  121. this.hide(widgetId,event)
  122. return
  123. }
  124. if(!this.mIsShow){
  125. this.onWidgetShow()
  126. }
  127. if(!this.mIsActive){
  128. this.registeredEvent()
  129. }
  130. this.mIsActive = true;
  131. switch (event.type) {
  132. case config.event_type.play_ani: //播放一个动画
  133. let event_data_nai = event.event_item_play_ani_data
  134. if(event_data_nai!=null){
  135. this.mCurAnimation = this.getAniById(event_data_nai.ani_id)
  136. if(this.mCurAnimation){
  137. this.mCurRunAnimation = this.mCurAnimation.ani_frame_list;
  138. this.runAnimation()
  139. }else{
  140. return tools.showToast("错误的动画配置!请检查")
  141. }
  142. }
  143. break;
  144. case config.event_type.change_one_item_status: //改变自己的突变资源属性
  145. let event_data_change_one_item_status = event.event_item_change_one_item_status_data
  146. if(event_data_change_one_item_status!=null){
  147. // gameManager.initUiBaseAtt(this.icon,event_data_change_one_item_status.att)
  148. let att_res = event_data_change_one_item_status.att.res
  149. if(att_res.length > 0) {
  150. tools.loadUrl(att_res,this.icon.getComponent(Sprite))
  151. }
  152. }
  153. break;
  154. case config.event_type.show_new_item: //显示自己同时被激活
  155. break;
  156. case config.event_type.stop_active_event: //停止激活
  157. console.log('停止激活 停止激活')
  158. this.mIsActive = false;
  159. break;
  160. // case config.event_type.collect_event: //自己被触发后,被收集类给收集
  161. // break;
  162. // case config.event_type.active_event: //立刻被激活
  163. // break;
  164. case config.event_type.be_event: //被动激活,等待被玩家交互
  165. console.log("this.be_event",this.mIsShow)
  166. break;
  167. }
  168. }
  169. }
  170. runAnimation(){
  171. if(this.bindTarget!=null){
  172. Tween.stopAllByTarget(this.bindTarget)
  173. this.bindTarget = null;
  174. }
  175. if(this.mCurAnimation.isMove==undefined||this.mCurAnimation.isMove==null){
  176. this.mCurAnimation.isMove = true;
  177. }
  178. // Tween.stopAll()
  179. let getFrameData = (index)=>{
  180. let cur_frame:ani_frame =this.mCurRunAnimation[index];
  181. let up_frame:ani_frame = index>0?this.mCurRunAnimation[index-1]:this.mCurRunAnimation[0];
  182. return {"cur_frame":cur_frame,"up_frame":up_frame}
  183. }
  184. let cur_index = 0;
  185. let data = getFrameData(cur_index);
  186. let call_back = ()=>{
  187. cur_index++;
  188. if(cur_index>=this.mCurRunAnimation.length){
  189. if(this.mCurAnimation.isLoop){
  190. cur_index = 0;
  191. }else{
  192. this.mPlayStatus = false;
  193. this.onFinishAnimation()
  194. return;
  195. }
  196. }
  197. let data = getFrameData(cur_index);
  198. this.runFrame(data.cur_frame,data.up_frame,call_back)
  199. }
  200. this.runFrame(data.cur_frame,data.up_frame,call_back)
  201. }
  202. runFrame(frame:ani_frame,up_frame:ani_frame,call){
  203. let self = this;
  204. let tweenDuration: number = frame.next_time;
  205. // let origin_x = self.mCurRunAnimation[0].pos_x;
  206. // let origin_y = self.mCurRunAnimation[0].pos_y
  207. this.icon.getComponent(Sprite).spriteFrame = gameManager.getCacheSpriteFrameByName(frame.url)
  208. let n_pos:Vec3 = new Vec3(frame.pos_x,frame.pos_y)
  209. let _color = new Color()
  210. _color = _color.fromHEX(frame.color)
  211. this.bindTarget = new BindTarget();
  212. let rotation = up_frame.rotation == undefined?0:up_frame.rotation
  213. this.bindTarget.rotation = rotation
  214. this.bindTarget.color = new Color().fromHEX(up_frame.color)
  215. this.bindTarget.opacity = up_frame.transparent;
  216. this.bindTarget.size = new Size(up_frame.size_width,up_frame.size_height)
  217. this.bindTarget.pos = new Vec3(up_frame.pos_x,up_frame.pos_y)
  218. this.bindTarget.anchorPointX = up_frame.anchor_point_x==undefined?0.5:up_frame.anchor_point_x
  219. this.bindTarget.anchorPointY = up_frame.anchor_point_y==undefined?0.5:up_frame.anchor_point_y
  220. let color_opactiy_tw_size = tween(this.bindTarget)
  221. .to( tweenDuration, { pos:n_pos,color: _color,opacity:frame.transparent,size:new Size(frame.size_width,frame.size_height),rotation:frame.rotation, anchorPointX:frame.anchor_point_x, anchorPointY:frame.anchor_point_y}, {
  222. onUpdate(tar:BindTarget){
  223. self.icon.getComponent(Sprite).color = tar.color;
  224. self.icon.getComponent(UIOpacity).opacity = tar.opacity;
  225. self.icon.getComponent(UITransform).setContentSize(tar.size)
  226. // console.log('tar.anchorPointX_Y=',tar.anchorPointX,'-',tar.anchorPointY)
  227. self.icon.getComponent(UITransform).setAnchorPoint(tar.anchorPointX, tar.anchorPointY)
  228. if(self.mCurAnimation.isMove){
  229. self.node.position = tar.pos
  230. }
  231. self.node.angle = tar.rotation;
  232. }
  233. }).call(()=>{
  234. call()
  235. });
  236. color_opactiy_tw_size.start();
  237. }
  238. public getIsFinish():boolean{
  239. return this.mIsFinish
  240. }
  241. public getIsShow():boolean{
  242. if(this.icon.getComponent(UIOpacity).opacity==0||this.mIsFinish){
  243. return false;
  244. }
  245. return this.mIsShow;
  246. }
  247. protected registeredEvent(){
  248. }
  249. public offEvent(){
  250. this.node.off(Node.EventType.TOUCH_START)
  251. this.node.off(Node.EventType.TOUCH_END)
  252. this.node.off(Node.EventType.TOUCH_CANCEL)
  253. this.node.off(Node.EventType.TOUCH_MOVE)
  254. this.mIsFinish = true;
  255. }
  256. protected onFinishAnimation(){
  257. }; //动画播放完成
  258. protected onFinishEvent(){
  259. this.offEvent()
  260. ClientEvent.dispatchEvent(config.EventRun.WIDGET_FINISH,this.mData.att.id)
  261. }; //完成自身
  262. protected onFialEvent(){}; // 失败完成
  263. protected init(){};
  264. public initView(data:widget_item_data,is_init:boolean = true){
  265. this.isInit = is_init;
  266. this.initWidget(data)
  267. };
  268. public showZhaoButongFinishStatus(){}
  269. public hideZhaoButongFinishStatus(){}
  270. }