Advertisement
nPhoenix

MV.js - Movement

Oct 26th, 2019
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // movimento -> principal
  2. Game.Overworld.doMovement = function (object, callback) {
  3.  
  4.     new Movement().start(
  5.         this,
  6.         object,
  7.         callback
  8.     );
  9. };
  10.  
  11. Game.Overworld.doFacing = function (object) {
  12.  
  13.     this.lol = true;
  14.  
  15.     new Movement().switchFacing(
  16.         this,
  17.         {
  18.             info: this.player.data,
  19.             sprite: this.player
  20.         },
  21.         object.direction
  22.     );
  23.     // setInterval(() => {
  24.     //     this.key.time = 0;
  25.     //     clearInterval(this.key.count);
  26.     // }, 200);
  27.  
  28.     this.lol = false;
  29. };
  30.  
  31. var Movement = function () {};
  32.  
  33. Movement.prototype.start = function (self, object, callback) {
  34.     /*
  35.     object ~
  36.     type:
  37.         0 = jogador
  38.         1 = outro jogador (online)
  39.         2 = npc
  40.         3 = follower
  41.     direction:
  42.         0,1,2,3
  43.     name:
  44.         nome do objeto
  45.     */
  46.  
  47.     var data = {};
  48.  
  49.     // verificando tipo
  50.  
  51.     switch(object.type) {
  52.  
  53.         // player
  54.         case 0: {
  55.             // se walk estiver em progresso: sai
  56.             if (self.player._data.walkInProgress)
  57.                 return;
  58.  
  59.             // se jogador estiver parado: sai
  60.             if (self.player._data.stop)
  61.                 return;
  62.  
  63.             var older = _.clone(self.player._data.position);
  64.  
  65.             // configurando sprite e flag do pé
  66.             object.target = self.player;
  67.  
  68.             break;
  69.         };
  70.  
  71.         // jogador online
  72.         case 1: {
  73.             // configurando
  74.             object.target = self.online_player_data[object.uid];
  75.             object.direction = object.dir;
  76.             // limpando objeto
  77.             delete object.dir;
  78.             break;
  79.         };
  80.  
  81.         // objetos, npcs e etc
  82.         case 2:
  83.         case 4:
  84.         {
  85.             object.target = self.object_data[object.name];
  86.             break;
  87.         };
  88.         // followes
  89.         case 3: {
  90.             object.target = self.follower_data[object.name];
  91.             //console.log("VSF", self.follower_data);
  92.             break;
  93.         };
  94.         default:
  95.             return;
  96.         break;
  97.     };
  98.  
  99.     // verificando qual o próximo tile e executando colisão
  100.     var internal_callback,
  101.         collisionType = this.execCollision(self, object, internal_callback);
  102.  
  103.     // verificando tipo novamente e vendo colisão
  104.     switch (object.type) {
  105.  
  106.         // se for o jogador
  107.         case 0: {
  108.  
  109.             // verificando tipo da colisão e execuntando o que deve ser feito
  110.  
  111.             switch (collisionType) {
  112.  
  113.                 // não pode andar
  114.                 case 0: {
  115.                     //** publicando no canal do mapa que andou para tal direção
  116.                     if (self.subscribe.map.is)
  117.                         if (self.player._data.position.facing !== object.direction)
  118.                             self.subscribe.map.conn.publish({
  119.                                 dir: object.direction,
  120.                                 dataType: 2
  121.                             });
  122.                     // mudando facing na memória
  123.                     self.player._data.position.facing = object.direction;
  124.                     // executando animação idle para o lado
  125.                     self.player.play(self.database.characters[object.target._data.sprite].name + "_idle_" + self.database.overworld.directions[object.direction]);
  126.  
  127.                     self.player.triggerCantMove({
  128.                         facing: object.direction,
  129.                         x: self.player._data.position.x,
  130.                         y: self.player._data.position.x
  131.                     });
  132.                     // saindo pois não ira se mexer
  133.                     return;
  134.                 };
  135.  
  136.                 // solicitar mudança de mapa
  137.                 case 3: {
  138.                     // pegando eventos, buscando map id e teleport id
  139.                     var id = _.findWhere(self.cache.json.get("events_" + self.database.maps[self.Data.CurrentMap].name).map.teleport, {
  140.                         x: self.player._data.position.x,
  141.                         y: self.player._data.position.y
  142.                     });
  143.  
  144.                     // adicionar callback e enviar request para o servidor
  145.                     internal_callback = function () {
  146.                         this[0].requestMapChange(this[1].mid, this[1].tid);
  147.                     }.bind([self, id]);
  148.                    
  149.                     break;
  150.                 };
  151.  
  152.                 // solicitar batalha selvagem | criar overlay do matinho
  153.                 case 4: {
  154.                     var pos = {
  155.                         x: self.player._data.position.x,
  156.                         y: self.player._data.position.y
  157.                     };
  158.                     // remove grass antigo
  159.                     self.player.removeGrassOverlay();
  160.  
  161.                     // appenda particulas de grama
  162.                     internal_callback = function () {
  163.                         // adiciona overlay
  164.                         self.player.addGrassOverlay(self.appendGrassOverlay(pos.x, pos.y));
  165.                         // add particles
  166.                         self.appendGrassParticles(pos.x, pos.y);
  167.                     }.bind(self);
  168.  
  169.                     self.requestWildBattle();
  170.                     break;
  171.                 };
  172.             };
  173.  
  174.             //** pode andar
  175.  
  176.             // setando walk em progresso
  177.             self.player._data.walkInProgress = true;
  178.             // mudando facing
  179.             self.player._data.position.facing = object.direction;
  180.             // parando animação do idle para iniciar animação 'procedural'
  181.             self.player.anims.stop();
  182.             //** publicando no canal do mapa que andou para tal direção
  183.             if (self.subscribe.map.is)
  184.                 self.subscribe.map.conn.publish({
  185.                     dir: object.direction,
  186.                     dataType: 1
  187.                 });
  188.                 //this.subscribe.map.conn.publish([object.direction]);
  189.             if (self.player._data.follower.has)
  190.                 self.follow(older.facing, self.player._data.follower.id);
  191.  
  192.             break;
  193.         };
  194.  
  195.         // se for um jogador online ou um npc, ou um follower, ou npc domador
  196.         case 1:
  197.         case 2:
  198.         case 3:
  199.         case 4:
  200.         {
  201.  
  202.             // verificando tipo da colisão e execuntando o que deve ser feito
  203.             switch (collisionType) {
  204.                 // não pode andar
  205.                 case 0: {
  206.                     // mudando facing
  207.                     object.target._data.position.facing = object.direction;
  208.                     // executando animação idle para o lado
  209.                     object.target.play(self.database.characters[object.target._data.sprite].name + "_idle_" + self.database.overworld.directions[object.direction]);
  210.                     // saindo
  211.                     return;
  212.  
  213.                     break;
  214.                 };
  215.  
  216.                 // criar overlay do matinho
  217.                 case 4: {
  218.                     var pos = {
  219.                         x: object.target._data.position.x,
  220.                         y: object.target._data.position.y
  221.                     };
  222.                     // remove grass antigo
  223.                     object.target.removeGrassOverlay();
  224.                     // appenda particulas de grama
  225.                     internal_callback = function () {
  226.                         // adiciona overlay
  227.                         object.target.addGrassOverlay(self.appendGrassOverlay(pos.x, pos.y));
  228.                         self.appendGrassParticles(pos.x, pos.y);
  229.                     }.bind(self);
  230.                     break;
  231.                 };
  232.             };
  233.  
  234.             // mudando facing
  235.             object.target._data.position.facing = object.direction;
  236.             // parando animação do idle para iniciar animação 'procedural'
  237.             object.target.anims.stop();
  238.  
  239.             break;
  240.         };
  241.     };
  242.  
  243.     //console.time("Andar");
  244.  
  245.     //console.time("walk");
  246.  
  247.     this.object = object;
  248.     this.self = self;
  249.     this.callback = callback;
  250.     this.internal_callback = internal_callback;
  251.  
  252.     // executa animação de andar
  253.     async.series([
  254.         this.syncWalk[0].bind(this),
  255.         this.syncWalk[1].bind(this),
  256.         this.syncWalk[2].bind(this),
  257.         this.syncWalk[3].bind(this),
  258.         // no último método invoca o callback
  259.         this.syncWalk[4].bind(this)
  260.     ]);
  261. };
  262.  
  263. // movimento síncrono (render)
  264. Movement.prototype.syncWalk = [
  265.     function (cb) {
  266.         this.switchSpriteStep(this.self, this.object, this.object.target._data.stepFlag, "walk");
  267.         this.changePosition(this.self, this.object, cb);
  268.         //this.self.time.addEvent({delay: this.self.database.overworld.time.step, callback: cb});
  269.         //setTimeout(this.self.database.overworld.time.step, cb);
  270.     },
  271.     function (cb) {
  272.         this.changePosition(this.self, this.object, cb);
  273.         //this.self.time.addEvent({delay: this.self.database.overworld.time.step, callback: cb});
  274.     },
  275.     function (cb) {
  276.         this.switchSpriteStep(this.self, this.object, 0, "idle");
  277.         this.changePosition(this.self, this.object, cb);
  278.         //this.self.time.addEvent({delay: this.self.database.overworld.time.step, callback: cb});
  279.     },
  280.     function (cb) {
  281.         // muda posição
  282.         this.changePosition(this.self, this.object, cb);
  283.     },
  284.     function () {
  285.         // se for o jogador
  286.         if (this.object.type == 0) {
  287.             // walk não está mais em progresso
  288.             this.self.player._data.walkInProgress = false;
  289.             // inicia animação idle
  290.             this.self.player.play(this.self.database.characters[this.object.target._data.sprite].name + "_idle_" + this.self.database.overworld.directions[this.object.direction]);
  291.             // mostra posição atual
  292.             // console.log(
  293.             //     "x", this.self.player._data.position.x,
  294.             //     "\ny", this.self.player._data.position.y,
  295.             //     "\nfacing", this.self.player._data.position.facing
  296.             // );
  297.         } else {
  298.             // inicia animação idle
  299.             //this.object.target.startAnim();
  300.             this.object.target.play(this.self.database.characters[this.object.target._data.sprite].name + "_idle_" + this.self.database.overworld.directions[this.object.direction]);
  301.        
  302.             //console.log(this[1].currentObject, this[0].mapObjectPosition);
  303.         };
  304.  
  305.         // atualizando profundidade dos objetos do grupo main
  306.         //this.self.groups.main.sort("y", Phaser.Group.SORT_ASCENDING);
  307.         this.self.depthSort();
  308.         // chama callback interno
  309.         if (typeof(this.callback) === "function")
  310.             this.callback();
  311.  
  312.         // chama callback externo
  313.         if (typeof(this.internal_callback) === "function")
  314.             this.internal_callback();
  315.  
  316.         //console.timeEnd("walk");
  317.     }
  318. ];
  319.  
  320. // executar colisão
  321. Movement.prototype.execCollision = function (self, object, internal_callback) {
  322.     object = object || {};
  323.  
  324.     if (
  325.         !("type" in object) ||
  326.         !("direction" in object)
  327.     )
  328.         return;
  329.  
  330.     // pega informações necessárias
  331.     var isPlayer = object.type == 0,
  332.         playerPosition = {
  333.             x: self.player._data.position.x,
  334.             y: self.player._data.position.y
  335.         };
  336.         //console.log("AKI CRL!", object);
  337.         position = isPlayer ? playerPosition : {
  338.             x: object.target._data.position.x,
  339.             y: object.target._data.position.y
  340.         };
  341.  
  342.     // incrementa nova posição
  343.     switch(object.direction) {
  344.         case 0: {
  345.             position.y --;
  346.             break;
  347.         };
  348.        
  349.         case 1: {
  350.             position.x ++;
  351.             break;
  352.         };
  353.        
  354.         case 2: {
  355.             position.y ++;
  356.             break;
  357.         };
  358.        
  359.         case 3: {
  360.             position.x --;
  361.             break;
  362.         };
  363.        
  364.     };
  365.  
  366.     // se não for o jogador
  367.     if (!isPlayer) {
  368.  
  369.     let tileY = self.collisionLayer.data[position.y] ? self.collisionLayer.data[position.y] : 0,
  370.         tileX = tileY[position.x] ? tileY[position.x] : 0,
  371.         tilesXY = tileY ? self.database.overworld.tile.properties[tileX.index] : 0;
  372.  
  373.         // checa se colide com posição atual do jogador
  374.         var collision = (position.x == playerPosition.x && position.y == playerPosition.y);
  375.        
  376.         // se não colidir, muda posição
  377.         if (!collision && object.type !== 3) {
  378.  
  379.             // apaga posição atual no mapa
  380.             delete self.mapObjectPosition[object.target._data.position.x + "|" + object.target._data.position.y];
  381.            
  382.             // cria nova posição
  383.             self.mapObjectPosition[position.x + "|" + position.y] = object.name;
  384.  
  385.             // edita posição do objeto
  386.             object.target._data.position.x = position.x;
  387.             object.target._data.position.y = position.y;
  388.             object.target._data.position.facing = object.direction;
  389.         };
  390.  
  391.         console.log(tilesXY);
  392.  
  393.         if (tilesXY.wild)
  394.             return 4;
  395.  
  396.         if (object.type == 1) // outro jogador
  397.             return 1;
  398.  
  399.         // informa se colidiu ou não
  400.         return collision ? 0 : 1;
  401.     };
  402.  
  403.     //console.log(this.collisionLayer.data[position.y][position.x].index);
  404.  
  405.     // pega informação dos tiles para executar colisão
  406.     var tileY = self.collisionLayer.data[position.y] ? self.collisionLayer.data[position.y] : 0,
  407.         tileX = tileY[position.x] ? tileY[position.x] : 0,
  408.         tilesXY = tileY ? self.database.overworld.tile.properties[tileX.index] : 0;
  409.  
  410.     // se for tile limite, bloqueio, ou existir algum objeto no lugar
  411.     if (!tileY || !tileX || !tilesXY || tilesXY.block || self.mapObjectPosition[position.x + "|" + position.y])
  412.         return 0;
  413.  
  414.     // muda posição do jogador
  415.     self.player._data.position.x = position.x;
  416.     self.player._data.position.y = position.y;
  417.  
  418.     // ** daqui pra baixo pode executar em assincronia
  419.  
  420.     // solicita mudar de mapa
  421.     if (tilesXY.door)
  422.         return 3;
  423.  
  424.     // solicita luta selvagem
  425.     if (tilesXY.wild)
  426.         return 4;
  427.  
  428.     self.checkPlayerPositionTamer(self.cache.json.get(self.getCurrentMapName("events")));
  429.  
  430.     // ok, pode andar
  431.     return 1;
  432. };
  433.  
  434. // mudar posição (no render)
  435. Movement.prototype.changePosition = function (self, object, next) {
  436.  
  437.     switch(object.direction) {
  438.  
  439.         case 0: {
  440.             self.tweens.add({
  441.                 targets: [object.target],
  442.                 ease: "Linear",
  443.                 duration: self.database.overworld.time.step,
  444.                 y: "-=" + (self.database.overworld.tile.size / 4),
  445.                 onComplete: () => next()
  446.             });
  447.             break;
  448.         };
  449.  
  450.         case 1: {
  451.             self.tweens.add({
  452.                 targets: [object.target],
  453.                 ease: "Linear",
  454.                 duration: self.database.overworld.time.step,
  455.                 x: "+=" + (self.database.overworld.tile.size / 4),
  456.                 onComplete: () => next()
  457.             });
  458.             break;
  459.             //object.target.x += self.database.overworld.tile.size / 4;
  460.         }
  461.         break;
  462.  
  463.         case 2: {
  464.             self.tweens.add({
  465.                 targets: [object.target],
  466.                 ease: "Linear",
  467.                 duration: self.database.overworld.time.step,
  468.                 y: "+=" + (self.database.overworld.tile.size / 4),
  469.                 onComplete: () => next()
  470.             });
  471.             //object.target.y += self.database.overworld.tile.size / 4;
  472.             break;
  473.         }
  474.         break;
  475.  
  476.         case 3: {
  477.             self.tweens.add({
  478.                 targets: [object.target],
  479.                 ease: "Linear",
  480.                 duration: self.database.overworld.time.step,
  481.                 x: "-=" + (self.database.overworld.tile.size / 4),
  482.                 onComplete: () => next()
  483.             });
  484.             //object.target.x -= self.database.overworld.tile.size / 4;
  485.             break;
  486.         };
  487.        
  488.     };
  489. };
  490.  
  491. // mudar sprite de "passo". durante animação de andar
  492. Movement.prototype.switchSpriteStep = function (self, object, flag, type) {
  493.  
  494.     // declarando sprite
  495.     var sprite;
  496.  
  497.     // vendo se sprite é de step
  498.     if (typeof(flag) == "number" && type == "walk") {
  499.  
  500.         flag = flag ? 0 : 1;
  501.  
  502.         switch (object.type) {
  503.             case 0: {
  504.                 self.player._data.stepFlag = flag;
  505.                 break;
  506.             };
  507.  
  508.             case 1:
  509.             case 2:
  510.             case 3:
  511.             case 4:
  512.             {
  513.                 object.target._data.stepFlag = flag;
  514.                 break;
  515.             };
  516.  
  517.         };
  518.     };
  519.  
  520.     // pegando sprite
  521.     switch (object.type) {
  522.         case 0: {
  523.             sprite = self.database.characters[self.player._data.sprite].name;
  524.             break;
  525.         };
  526.         case 1:
  527.         case 2:
  528.         case 3:
  529.         case 4:
  530.         {
  531.             sprite = self.database.characters[object.target._data.sprite].name;
  532.             break;
  533.         };
  534.     };
  535.  
  536.     // mudando frame
  537.  
  538.     object.target.setFrame(sprite + "_" + self.database.overworld.directions[object.direction] + "_" + type + flag);
  539. };
  540.  
  541. // mudar facing
  542. Movement.prototype.switchFacing = function (self, object, direction, callback, fps) {
  543.  
  544.     // frames por segundo default é 2
  545.  
  546.     fps = fps || 2;
  547.  
  548.     // se a direção for se virar ao jogador
  549.  
  550.     if (direction == "toplayer") {
  551.         // pega qual lado jogar está posicionado
  552.         switch(self.player._data.position.facing) {
  553.             case 0: // cima
  554.                 direction = 2;
  555.             break;
  556.             case 2:  // baixo
  557.                 direction = 0;
  558.             break;
  559.             case 3: // esquerda
  560.                 direction = 1;
  561.             break;
  562.             case 1: // direita
  563.                 direction = 3;
  564.             break;
  565.         };
  566.     };
  567.  
  568.     // mudando facing na memória
  569.     object._data.position.facing = direction;
  570.     // para animação (hack para caso esteja no mesmo lado)
  571.     object.anims.stop();
  572.     // executando animação idle para o lado escolhido
  573.     object.play(self.database.characters[object._data.sprite].name + "_idle_" + self.database.overworld.directions[direction]);
  574.     // callback
  575.     if (typeof(callback) === "function")
  576.         callback();
  577. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement