Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

Convertendo de 30 fps para 60 fps

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
AdrianoPpaula
Membro
Membro
Reações: 0
Mensagens: 59
Localização: Quissamã RJ

Contato:

Convertendo de 30 fps para 60 fps

Mensagem por AdrianoPpaula » Sex Fev 02, 2018 5:02 pm

Fala pessoal tudo blz com vocês?
Então, estamos trabalhando em um projeto já faz um tempo e toda a parte de programação dele foi pensado para 30 fps (room_speed 30), então depois de um tempo estamos cogitando em transformar o gameplay do jogo em 60 fps ( room_speed=60) para que as animações e até mesmo as resposta do controle fique melhor, por se tratar de um hack and slash percebemos que era necessário essa mudança.

Mas então vem uma dúvida, qual a melhor maneira de começar a converter o jogo de 30 para 60?
Teriamos que mudar varias coisas como image_speed, alarms e muitas outras coisas em todos os objetos pois colocando a room em 60 de speed a velocidade de tudo mudou.

Qual é o calculo que o game maker faz em questão de speed?
por exemplo....um objeto que se move a 4 hspeed em uma room de 30
como que faço para que esse objeto se mexa na mesma velocidade de 4 em uma room de 60?
tipo 1 em hspeed em 30 seria quando em 60?

O mesmo para alarm.... um alarm=10 em uma room de 30....como que ficaria para dar o mesmo tempo em uma room de 60?
Imagem

Avatar do usuário
theguitarmester
Membro
Membro
Reações: 0
Mensagens: 23

Contato:

Re: Convertendo de 30 fps para 60 fps

Mensagem por theguitarmester » Sáb Fev 03, 2018 12:47 am

Olá @AdrianoPpaula,

Caso queira ir direto para solução, sem altas explicações, vá direto para a conclusão.

60 é o dobro de 30 (peguei a calculadora para ver se era mesmo hueheuheuhe zoa)
Calculo do room_speed:
Tu criou todos valores constantes que estão relacionados a tempo, visto que o GM já tem um controle de tempo, em padrão não teria porque muito se preocupar para cuidar dele mesmo...

Mas basicamente, o GM calcula a velocidade assim(ou calculava...):
Tempo definido para ser a velocidade da room é o FPS é o limite de quadros que teu jogo terá de atualização/step em 1 segundo.
Se é 30, logo, ele divide 1000milisegundos por 30, o que vai dar 33,333333...ms(agora peguei a calculadora, depois me senti um pouco burro por isso) isso quer dizer, que a cada vez que passar 33,333...ms de uma atualização do GM, e tiver atingido esse tempo, ele irá atualizar um step no seu jogo.

Caso tu aumentar de 30fps para 60fps, será então 1000/66 que é(calculadora again) 16,666ms
Então, sabemos que o GM controla o room_speed por dois cálculos, um para saber o tempo de cada atualização no jogo, e outro para calcular a diferença entre cada vez que ele, o programa/executável, é atualizado, o que pode ter um contador que ao atingir o número mágico de 1000/room_speed, é atualizado. (essa diferença é chamada geralmente de delta_time)

Como mudar o room_speed e continuar com o "mesmo andamento do jogo", "mesma velocidade do jogo":
Bom, então o GM faz o controle já da velocidade de quantos steps terá por segundo, através do room_speed.
Se eu tenho um hspeed de 5, quer dizer que a cada step, esse objeto está adicionando 5 x do objeto, porque basicamente o GM utiliza essas funções built-in assim:
objeto have: x, y, speed, hspeed, vspeed...
step padrão: (scripts do programador do jogo) y+=vspeed; x+=hspeed;
(Logicamente existe muito mais coisas feitas aí dentro, mas pro exemplo é essa que precisa, e essa uma das que sei hjuehueheuheu)

Então, vamos ser mais práticos agora com a questão sua:
- minha room_speed é 30.
- meu objeto tem velocidade 10, o que eu quero dizer com isso, é que ele vai se mover 300 pixeis em 1 segundo.
- tem um alarme de 1800 que conta o tempo que ele tem para coletar as fezes de seu cachorro, esse 1800 eu coloquei porque quero que após 1 minutos, acabe o tempo dele coletar.
- Tem uma variável que a cada 'feze' que ele coleta, aumenta 1 unidade de tempo, além de dar 100 de score.
    - a unidade de tempo é 5 segundos, por isso coloquei pra adicionar +150 ao alarme de tempo.

Mas agora eu quero colocar o room_speed pra 60, esse jogo ao executar ficou muito rápido o herói, e, ficou pouco tempo... o que eu faço pra continuar como antes? terei que mudar as variáveis? mas quais?

Bom, a resposta é bem simples: as relacionadas a tempo real.

No exemplo, quais são?
velocidade, alarme, unidade de tempo, e tempo da unidade de tempo.
Certo?
No!

porque unidade de tempo não tá relacionada com o tempo real(será, mas parece..) ela representa uma unidade de um tempo pré determinado em outra variável, que é o tempo da unidade de tempo. o correto fica:
velocidade, alarme, e tempo da unidade de tempo.
Score logicamente não está ligado ao tempo real, ele está sendo atualizado toda vez que um coco é coletado, porém, deve se tomar o cuidado com váriaveis soltas em step, draw, collision, keycheck(sem ser o press, release)..., porque a taxa de atualização desses objetos está diretamente ligada a velocidade da room.

velocidade, alarme, unidade de tempo, e tempo da unidade de tempo.

Olá @AdrianoPpaula,

60 é o dobro de 30 (peguei a calculadora para ver se era mesmo hueheuheuhe zoa)

Calculo do room_speed:
Tu criou todos valores constantes que estão relacionados a tempo, visto que o GM já tem um controle de tempo, em padrão não teria porque muito se preocupar para cuidar dele mesmo...

Mas basicamente, o GM calcula a velocidade assim(ou calculava...):
Tempo definido para ser a velocidade da room é o FPS é o limite de quadros que teu jogo terá de atualização/step em 1 segundo.
Se é 30, logo, ele divide 1000milisegundos por 30, o que vai dar 33,333333...ms(agora peguei a calculadora, depois me senti um pouco burro por isso) isso quer dizer, que a cada vez que passar 33,333...ms de uma atualização do GM, e tiver atingido esse tempo, ele irá atualizar um step no seu jogo.

Caso tu aumentar de 30fps para 60fps, será então 1000/66 que é(calculadora again) 16,666ms
Então, sabemos que o GM controla o room_speed por dois cálculos, um para saber o tempo de cada atualização no jogo, e outro para calcular a diferença entre cada vez que ele, o programa/executável, é atualizado, o que pode ter um contador que ao atingir o número mágico de 1000/room_speed, é atualizado. (essa diferença é chamada geralmente de delta_time)

Como mudar o room_speed e continuar com o "mesmo andamento do jogo", "mesma velocidade do jogo":
Bom, então o GM faz o controle já da velocidade de quantos steps terá por segundo, através do room_speed.
Se eu tenho um hspeed de 5, quer dizer que a cada step, esse objeto está adicionando 5 x do objeto, porque basicamente o GM utiliza essas funções built-in assim:
objeto have: x, y, speed, hspeed, vspeed...
step padrão: (scripts do programador do jogo) y+=vspeed; x+=hspeed;
(Logicamente existe muito mais coisas feitas aí dentro, mas pro exemplo é essa que precisa, e essa uma das que sei hjuehueheuheu)

Então, vamos ser mais práticos agora com a questão sua:
- minha room_speed é 30.
- meu objeto tem velocidade 10, o que eu quero dizer com isso, é que ele vai se mover 300 pixeis em 1 segundo.
- tem um alarme de 1800 que conta o tempo que ele tem para coletar as fezes de seu cachorro, esse 1800 eu coloquei porque quero que após 1 minutos, acabe o tempo dele coletar.
- Tem uma variável que a cada 'feze' que ele coleta, aumenta 1 unidade de tempo, além de dar 100 de score.
    - a unidade de tempo é 5 segundos, por isso coloquei pra adicionar +150 ao alarme de tempo.

Mas agora eu quero colocar o room_speed pra 60, esse jogo ao executar ficou muito rápido o herói, e, ficou pouco tempo... o que eu faço pra continuar como antes? terei que mudar as variáveis? mas quais?

Bom, a resposta é bem simples: as relacionadas a tempo real.

No exemplo, quais são?
velocidade, alarme, unidade de tempo, e tempo da unidade de tempo.
Certo?
No!

porque unidade de tempo não tá relacionada com o tempo real(será, mas parece..) ela representa uma unidade de um tempo pré determinado em outra variável, que é o tempo da unidade de tempo. o correto fica:
velocidade, alarme, e tempo da unidade de tempo.
Score logicamente não está ligado ao tempo real, ele está sendo atualizado toda vez que um coco é coletado, porém, deve se tomar o cuidado com váriaveis soltas em step, draw, collision, keycheck(sem ser o press, release)..., porque a taxa de atualização desses objetos está diretamente ligada a velocidade da room.

velocidade, alarme, unidade de tempo, e tempo da unidade de tempo.

Conclusão:
Como percebeu(ignore caso tenha pulado para a conclusão), tu terá que controlar o tempo dessas variáveis ligada ao tempo "real", e maneira mais simples de fazer isso, pra evitar a cada mudança de room_speed, ter que mudar, é fazer algo assim:

Código: Selecionar todos

globalvar rsp = room_speed / 30;
//Escolhi que 30 é o valor base para o calculo de rsp(room_speed). tu pode colocar isso num create "master", ou colocar em algum lugar para ser atualizado direto, caso você queira fazer mudanças no valor de room_speed no jogo e continuar com a mesma velocidade do jogo.
Caso queira deixar esse valor que só muda enquanto está criando o jogo, pode até criar uma constante ao invés de variável.

Agora, vem a mágica:
para variáveis como velocidade do jogador, tu irá colocar:

Código: Selecionar todos

speed = velocidadeMinha / rsp;
alarmDeTempoParaCatarCoco = tempoParaCatarCoco * rsp;
então, se velocidadeMinha for 5, e o room_speed for 30, speed vai ser 5, se room_speed for 60, a velocidade vai ser 2.5



Só tomaria um pouco de cuidado ao usar o alarm padrão do GM, porque caso tu definir tempos muito curto, e depois ocorrer divisões(caso tu tava em um room_speed mais alto e foi pra menor), porque pode ser que esse valor ocorra atrasos, devido a não utilizar ponto flutuante(não utilizava antes, pelo menos).

- Esse conceito pode ser usado também para o FPS, para independente de quantos frames está tendo por segundo, um objeto vá se movimentar uma quantidade "exata" de pixeis em por segundo.

Código: Selecionar todos

delta_time = (tempoAtual-tempoAnterior); //Aqui varia o tempo de pc para pc, acho que o nome da variável é current_time
rsp = delta_time / 100; //100 foi um valor base escolhido aleatoriamente, escolha com segurança...

Era isso.

Ficou um pouco grande, mas com a conclusão já serve como operacional hehe


Se coloquei algum conceito errado, como o delta_time, favor me corrigirem.

Avatar do usuário
Foxy Of Jungle
Programador
Programador
Reações: 0
Mensagens: 153
Localização: Brasil
Contato:

Re: Convertendo de 30 fps para 60 fps

Mensagem por Foxy Of Jungle » Dom Fev 04, 2018 10:02 pm

Já que antes era 30 FPS, agora 60 FPS, é só você dividir por 2 os valores.

EX: 
30 FPS
image_speed = 0.4

60 FPS
image_speed = 0.2

Vai permanecer na mesma velocidade.

Responder

Quem está online

Usuários navegando neste fórum: Google [Bot] e 2 visitantes