O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Eli_PlayTime

Iniciado por Eliaquim, 01/01/2020 às 06:30

01/01/2020 às 06:30 Última edição: 02/01/2020 às 02:15 por Eliaquim

Autor Eliaquim
Introdução
Por algum motivo você pode querer pausar o tempo de jogo. Por exemplo, se fizer uma tela de título por eventos(em um mapa), poderá querer que o tempo não conte neste mapa.
Com esse plugin você pode fazer isso usando um comando de plugin ou uma switch.

Funcionalidades
Pausar, resumir e resetar o tempo de jogo(não o cronômetro).

Como usar
Você pode escolher começar o jogo já com o tempo pausado através dos parâmetros de plugin.
Você poderá escolher dentro do jogo quando quer que a contagem comece ou pause e até resete através dos comandos de plugin:
resume_playtime
pause_playtime
reset_playtime

Ou pode usar uma switch para pausar ou resumir a contagem.

Tenha em mente que o comando de plugin tem prioridade sobre a switch.

Download
Eli_PlayTime.js

Termos de uso
1. Dê os créditos para Eliaquim ou Rakuen Zero na seção de créditos do seu jogo.
2. Pode ser usado em jogos gratuitos e comerciais.
3. Não venda e nem diga que foi você que fez esse plugin.
4. Não redistribua esse plugin. Ao invés disso, dê este link para o download:
https://rakuenzero.itch.io/eli-playtime

Update log
Spoiler

Versão 1.2 - 01/01/2020
- Adicionado comando de plugin para resetar o tempo de jogo.
- Conserto de bugs.

Versão 1.1 - 30/12/2019
- Adicionado compatibilidade com a versão do rpg_core community 1.3b

Versão 1.0 - 29/10/2019
- Plugin lançado!
[close]

01/01/2020 às 13:28 #1 Última edição: 01/01/2020 às 13:46 por Brandt
Legal a proposta, parabéns!

Mas o link está quebrado, eu recomendo copiar e colar da barra de url do navegador mesmo ao invés de digitar na mão xd (e não precisa das aspas)




Sobre o script em si, algumas sugestões:

  • Você sobrescreveu o método render da classe Graphics. É um método bem central do RPG Maker, que roda todo frame e tal, e a chance de você introduzir uma incompatibilidade com outros plugins ou mesmo versões novas é alta mexendo nele.

    Claro, em alguns casos, talvez isso fosse inevitável; não é o seu caso, e isso fica bem evidente porque o seu método render é praticamente idêntico ao original, exceto pela última linha :B

    Minha sugestão é fazer um alias pro comando original e chamar ele, e depois lidar com a frameCount separadamente. Algo assim:
Eli.Playtime.Graphics_render = Graphics.render;
Graphics.render = function() {
    var originalFrameCount = this.frameCount;
    Eli.PlayTime.Graphics_render.apply(this, arguments);
    if ($gameSwitches.value(Eli.Param.PlayTime.PauseTimeSw) || Eli.Param.PlayTime.PauseTime)
        this.frameCount = originalFrameCount;
}


  • Em alguns momentos, você faz condições do tipo if (algumacoisa === true).

    Isso é redundante, se a sua variável era true você podia ter deixado só ela na condição pra começo de conversa: if (algumacoisa).
  • Evite clausas condicionais vazias. Se você só quer tomar alguma ação no "else" da condição, inverta ela no if:

// NÃO!!
if (a || b) {
    // Do nothing
} else {
    ...
}
// Faça isso no lugar
if (!a && !b) {
    ...
}


  • No seu pluginCommand do Game_Interpreter você usa command.ToLowerCase() três vezes.

    Claro, toLowerCase não é lá a operação mais custosa, e o código está relativamente legível, mas é sempre boa prática colocar coisas calculadas que você usa mais de uma vez em variáveis:

var commandLower = command.toLowerCase();
if (commandLower === "a")
    ...
if (commandLower === b)
    ...


Melhor ainda, já que suas condições são todas igualdades, você pode usar um switch ... case:

switch (command.toLowerCase()) {
    case "a":
        ...
        break;
    case "b":
        ...
        break;
}


Em algumas linguagens isso não funciona, porque strings costumam não ser tipos primitivos, mas em javascript deve dar certo.

Edit: Add: nesse trecho:

Eli.Param.PlayTime = {
    PauseTimeSw: Number(Eli.Parameters['Switch to pause time' || 'Switch para pausar o tempo']),
    PauseTime: JSON.parse(Eli.Parameters['Start game without counting the PlayTime' || 'Começar o jogo sem a contagem de tempo?'])
};


O operador || não faz o que você está pensando. 'Switch to pause time' || 'Switch para pausar o tempo' vai sempre retornar 'Switch to pause time'.

O operador || é um operador lógico, que retorna o primeiro valor se ele for "verdadeiro" (não nulo, não "false" e não 0, acho) e o segundo se não, seja ele verdadeiro ou falso. Uma implementação dele seria:
function or(a, b) {
  if (a)
    return a;
  return b;
}


O que você quer aí é:
PauseTimeSw: Number(Eli.Parameters['Switch to pause time'] || Eli.Parameters['Switch para pausar o tempo']),


Ou, melhor ainda: na definição do parâmetro, dê o mesmo nome em todas as línguas, e mude o texto com @text.

Aí você pode pegar o parâmetro da lista sem medo.
~ Masked

02/01/2020 às 02:38 #2 Última edição: 02/01/2020 às 02:42 por Eliaquim
Opa!
CitarMas o link está quebrado, eu recomendo copiar e colar da barra de url do navegador mesmo ao invés de digitar na mão xd (e não precisa das aspas)
Ham... é porque copiei direto do outro fórum, formatando o posto para BBCODE, aí acho que ele colocou essas aspas. Mas já consertei aqui! Vlw!

CitarVocê sobrescreveu o método render da classe Graphics.
Pois é cara! Eu não sei porque fiz isso. E eu já sabia que dava pra fazer alias... acho q foi falta de atenção mesmo.
Dei uma corrigida, mas o seu método não funcionou. De alguma forma o frameCount++ continuava a aumentar a contagem quando não era para funcionar. Fiz de outra maneira e acabou funcionando ^^

CitarEm alguns momentos, você faz condições do tipo if (algumacoisa === true).
Pois é mais uma vez, dessa eu já sabia. E realmente eu prefiro o código sem o "=== true/false" acho mais legível.
Valeu!

CitarEvite clausas condicionais vazias. Se você só quer tomar alguma ação no "else" da condição, inverta ela no if:
Nesse caso eu acabei deixando assim, porque facilita a leitura do código para mim ^^''

CitarNo seu pluginCommand do Game_Interpreter você usa command.ToLowerCase() três vezes.
Em outro plugin que fiz, eu fiz essa recomendação que você falou, mas era porque eram muitos comandos de plugin. Nesse caso são bem poucos e eu preferi deixar assim para facilitar minha leitura também ^^

CitarOu, melhor ainda: na definição do parâmetro, dê o mesmo nome em todas as línguas, e mude o texto com @text.
Putz! Com certeza! Deveria ter feito isso. Ajeitei agora :)

Valeu mesmo Brandt! Muito obrigado pelas suas dicas! :*-*:

[edit]
CitarMelhor ainda, já que suas condições são todas igualdades, você pode usar um switch ... case:
Nesse caso eu acho melhor não. Eu andei fazendo algumas leituras e perguntando por aí tabmém. Quando são poucos if statements, vi muitas recomendações de usar o if mesmo ao invés de switch.
Em questão de leitura, o switch realmente facilita. Então vou deixar assim mesmo ^^

Obrigadão @Brandt! :ok:






02/01/2020 às 03:22 #3 Última edição: 02/01/2020 às 03:27 por Syureri
Pra ser honesto prefiro código de fácil leitura e fácil de se manter, especialmente quando se está reestruturando uma unidade de compilação com mais de 12000 linhas em um projeto gigante (posso xingar meu chefe agora, né :feelsbatman:)
E javascript nem me fale, ô linguagem da peste. Não sou bom em dar dicas sobre código alheio, mar se servir \o)

Spoiler

Em javascript prefira usar let ao invés de var para variáveis locais, ou const se você não for alterar o valor dela (embora não lembro se isso traz algum benefício). Isso evita variáveis globais acidentais por aí.

Você também pode querer encapsular o escopo de execução do seu script da seguinte maneira:
(function() {
let blah = 12;
function hello() {
    console.warn('The quick brown fox jumps over the lazy dog.');
}
})();

Isso faz com que o que quer que esteja dentro dessa função anônima seja encapsulada e evita mais ainda variáveis globais acidentais. Coisas de javascript >.> Se o Ojima tivesse usado ES6 e Módulos, isso não teria acontecido.

Como já dito pelo masked, command.toLowerCase sendo chamado três vezes ali pode ser evitado. Experimente converter para toLowerCase apenas uma vez e reuse a variável. Isso também vale para cálculos matemáticos, se uma vez tiver que usar o cosseno de um número várias vezes, calcule apenas uma vez e reutilize.

Fora isso, o resto das dicas que me vêm à cabeça é: use o return o mais cedo possível nos métodos para evitar {{{{}}}} desnecessários e, pelo amor de Deus, não use switch a menos que tenha uma cambada de condições pra fazer.

E gostei de como estruturou o código, usando nomes suficientemente descritivos para as variáveis, não usando português no código (ANSI agradece) e não poluindo de comentários quando o código fala por si.

A propósito:
Spoiler
[close]
[close]

Curti o plugin, espero ver mais trampos seus por aí no futuro (o/

Opa! E ai Syureri! ^^
Sim, eu também prefiro usar o let e const. Acabei copiando e colando essa parte do mv e o "var" foi repetido. Mais tarde vou trocar :)

Eu não gosto muito de IIFE, acompanhei umas discussões no fórum gringo sobre isso, e acabei optando por não usar. Além do mais, fica mais fácil pra debugar o plugin no console pra mim(e acho w o código fica feio tb xD hahauahau)
Muito obrigado pelas dicas!!! São sempre bem vindas!


Obs: Agora que me liguei que o Brandt é o Masked!!! =O
haahauhauaha