25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180.Объекты.js 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. function Объекты(события, состояние)
  2. {
  3. this.создать = function()
  4. {
  5. this.умолчание = {
  6. пр: [0, 0, 40, 20],
  7. };
  8. this.задано = {};
  9. события.подписать(this);
  10. };
  11. this.обновитьИзображение = function(имя)
  12. {
  13. let имяИзо = `объекты-${имя}`;
  14. let за = this.задано[имя];
  15. let пр = this.пр(имя);
  16. var описание = {
  17. ширина: пр[2],
  18. высота: пр[3],
  19. вид: {},
  20. };
  21. for (var ключ in за)
  22. {
  23. if (ключ.startsWith("вид."))
  24. {
  25. var к = ключ.substring(4);
  26. var значение = за[ключ];
  27. описание.вид[к] = значение;
  28. }
  29. }
  30. состояние.разобрать({
  31. изображения: {
  32. [имяИзо]: описание,
  33. },
  34. });
  35. };
  36. this.обновитьСлежение = function(имя)
  37. {
  38. let имяС = `объекты-${имя}`;
  39. let пр = this.пр(имя);
  40. состояние.разобрать({
  41. слежение: {
  42. [имяС]: {
  43. изображение: имяС,
  44. тело: имяС,
  45. смещение: [-пр[2] / 2, -пр[3] / 2],
  46. },
  47. },
  48. });
  49. };
  50. this.обработатьКлюч = function(ключ, путь, значение)
  51. {
  52. if (путь[0] != "объекты")
  53. {
  54. return;
  55. }
  56. let имя = путь[1];
  57. let свойство = путь.slice(2).join(".");
  58. if (!this.задано[имя])
  59. {
  60. this.задано[имя] = {};
  61. }
  62. this.задано[имя][свойство] = значение;
  63. let пр = свойство.startsWith("пр.");
  64. if (пр)
  65. {
  66. this.пересоздатьТело(имя);
  67. this.обновитьСлежение(имя);
  68. }
  69. this.обновитьИзображение(имя);
  70. };
  71. this.пересоздатьТело = function(имя)
  72. {
  73. let имяТела = `объекты-${имя}`;
  74. let пр = this.пр(имя);
  75. состояние.разобрать({
  76. тела: {
  77. [имяТела]: {
  78. x: пр[0],
  79. y: пр[1],
  80. ширина: пр[2],
  81. высота: пр[3],
  82. физика: {
  83. isStatic: false,
  84. },
  85. },
  86. },
  87. });
  88. };
  89. this.пр = function(имя)
  90. {
  91. let за = this.задано[имя];
  92. let пр = this.умолчание.пр;
  93. return [
  94. за["пр.0"] ? за["пр.0"] : пр[0],
  95. за["пр.1"] ? за["пр.1"] : пр[1],
  96. за["пр.2"] ? за["пр.2"] : пр[2],
  97. за["пр.3"] ? за["пр.3"] : пр[3],
  98. ];
  99. };
  100. // Конструктор.
  101. this.создать();
  102. };