UIGameMask.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import { _decorator, screen, find, Camera, RenderTexture, SpriteFrame, director, Material, renderer, Vec2, UITransform, Vec4 } from 'cc';
  2. import { ModuleDef } from '../../scripts/ModuleDef';
  3. import { GameUILayers } from '../../scripts/GameUILayers';
  4. import { Layout_UIGameMask } from './Layout_UIGameMask';
  5. import { GameEvent, GameMgr } from '../../module_basic/scripts/GameMgr';
  6. import { IGamePlayer } from '../../module_basic/shared/protocols/public/game/GameTypeDef';
  7. const { ccclass, property } = _decorator;
  8. const tempV4 = new Vec4();
  9. /**
  10. * @en game mask, used for war fog and death effect
  11. * @zh 游戏蒙板,用来处理死亡效果和战争迷雾
  12. */
  13. @tgx_class(ModuleDef.GAME)
  14. export class UIGameMask extends tgx.UIController {
  15. /**
  16. * @en used for storing scene render camera
  17. * @zh 保存用于场景渲染的摄像机
  18. */
  19. private _camera: Camera;
  20. /**
  21. * @en render scene content to this texture, used for death effect
  22. * @zh 渲染场景到此纹理,用于处理死亡时的变灰效果
  23. */
  24. private _rt: RenderTexture;
  25. /**
  26. * @en used for setting shader parameters with low performance cost
  27. * @zh 用于在 update 函数中,高效设置 shader 参数
  28. */
  29. private _handle: number;
  30. private _fogOfWarTrans: UITransform;
  31. private _pass: renderer.Pass;
  32. /**
  33. * @en the radius of war fog, this radius is transparent, and fade out after this radius
  34. * @zh 战争迷雾的中心半径,此半径内为透明,超出此半径后渐变
  35. */
  36. private _fogOfWarCenterRadius = 200.0;
  37. /**
  38. * @en the range of war fog fade out
  39. * @zh 战雾渐变范围
  40. */
  41. private _fogOfWarFadeOutRange = 400.0;
  42. constructor() {
  43. super('ui_game_mask/ui_game_mask', GameUILayers.GAME, Layout_UIGameMask);
  44. director.on(GameEvent.PLAYER_DIE, this.onPlayerDie, this);
  45. director.on(GameEvent.PLAYER_REVIVE, this.onPlayerRevive, this);
  46. }
  47. protected onCreated(): void {
  48. this._camera = find('SceneRoot2D/Camera').getComponent(Camera);
  49. let layout = this._layout as Layout_UIGameMask;
  50. this._fogOfWarTrans = layout.sprFogOfWar.getComponent(UITransform);
  51. layout.sprGrayScreen.node.active = false;
  52. this._pass = layout.sprFogOfWar.customMaterial.passes[0];
  53. this._handle = this._pass.getHandle('fogOfWarParams');
  54. }
  55. protected onUpdate(dt: number): void {
  56. tempV4.set(this._fogOfWarTrans.width, this._fogOfWarTrans.height, this._fogOfWarCenterRadius, this._fogOfWarFadeOutRange);
  57. this._pass.setUniform(this._handle, tempV4);
  58. }
  59. protected onDispose(): void {
  60. director.off(GameEvent.PLAYER_DIE, this.onPlayerDie, this);
  61. director.off(GameEvent.PLAYER_REVIVE, this.onPlayerRevive, this);
  62. this.normalScreen();
  63. this._rt?.destroy();
  64. }
  65. grayScreen() {
  66. let layout = this._layout as Layout_UIGameMask;
  67. layout.sprGrayScreen.node.active = true;
  68. if (!this._rt) {
  69. let size = screen.windowSize;
  70. let dpr = screen.devicePixelRatio;
  71. if (dpr > 1.5) {
  72. dpr = 1.5;
  73. }
  74. let width = Math.floor(size.width * dpr);
  75. let height = Math.floor(size.height * dpr);
  76. let w2h = width / height;
  77. if (width > 2048) {
  78. width = 2048;
  79. height = Math.floor(width / w2h);
  80. }
  81. if (height > 2048) {
  82. height = 2048;
  83. width = Math.floor(height * w2h);
  84. }
  85. this._rt = new RenderTexture();
  86. this._rt.initialize({ width: width, height: height });
  87. let spriteFrame = new SpriteFrame();
  88. spriteFrame.texture = this._rt;
  89. layout.sprGrayScreen.spriteFrame = spriteFrame;
  90. layout.sprGrayScreen.grayscale = true;
  91. }
  92. this._camera.targetTexture = this._rt;
  93. }
  94. normalScreen() {
  95. let layout = this._layout as Layout_UIGameMask;
  96. layout.sprGrayScreen.node.active = false;
  97. this._camera.targetTexture = null;
  98. }
  99. onPlayerDie(player: IGamePlayer) {
  100. if (player.playerId == GameMgr.inst.selfPlayer.playerId) {
  101. this.grayScreen();
  102. }
  103. }
  104. onPlayerRevive(player: IGamePlayer) {
  105. if (player.playerId == GameMgr.inst.selfPlayer.playerId) {
  106. this.normalScreen();
  107. }
  108. }
  109. }