Avatar do usuário
tiaoferreira
Membro
Membro
Autor
Mensagens: 30
Registrado em: Sex Jul 29, 2016 6:32 pm
Karma: 40

[Tutorial] PAUSA NO GM STUDIO: ESQUECERAM DELA?

Qua Fev 15, 2017 11:19 am

Olá a todos! Ao que parece, o Game Maker Studio não tem uma função, comando ou variável nativa de pausa, para você implementar em seus jogos. 

Resolvi migrar do GM8 (que tem tal função) para o Studio, e logo de cara, veio essa   decepção: GM Studio não tem pausa.

Procurei tutoriais na net, vi video aulas do próprio Shawn Spalding e outros feras, mas nada, todos os métodos eram complicados e firulentos. A maioria deles se utiliza da função "deactivate_object", que tem resultado estético muito ruim, pois simplesmente apaga todos os objetos da tela, em vez de simplesmente congelar o jogo. Outros métodos igualmente complicados utilizam-se da tática de tirar screenshots do jogo e jogá-los por cima da imagem original, após o famigerado "deactivate", e pra fazer isso, a manobra é gigantesca, tem que digitar códigos imensos e em vários objetos.

Bem, amigos, depois de 24h quebrando a cabeça e vendo tutoriais complicadíssimos e com códigos maiores que os da NASA para digitar, consegui uma solução parcial, na qual não será necessário desativar nenhum objeto, nem tirar screenshot, nem desperdiçar memória RAM e outros recursos:

1 - Crie um objeto que será responsável pelo controle da pausa. No meu exemplo, chamei-o de "obj_pause";
Imagem
2 - No evento de criação do obj_pause, entre com o seguinte código:


global.pause = false;



3 - Crie um evento do tipo "keypress" e selecione uma tecla (ou botão do joystick) para acionar a pausa. Nas ações da tecla ou botão escolhido, entre com esse código:


if (global.pause == 0)
{
global.pause = 1;
}
else
{
global.pause = 0;
}



4 - adicione um evento do tipo "draw". Em suas ações, insira o código a seguir:


if (global.pause)
{
draw_sprite(nome_do_sprite,0,X,Y);
}


Explicando o código: o comando "draw_sprite" manda desenhar um sprite na tela. Está setado para exibir a partir do frame nº 0, nas posições X e Y.

Terminado o controlador da pausa vem a parte pesada: inserir a condicional verificadora em cada objeto existente no jogo. Infelizmente isso é necessário, pois, como já dito, o GM Studio não tem uma função ou variável pré-definida para tal fim, ao contrário do GM8.

O que é importante fazer, em cada objeto:

1 - No evento "create", setar a velocidade, que será a principal característica afetada pela pausa. Utilize um código semelhante ao seguinte:


speed = (valor desejado);
oldspeed = speed;



Obs: a variável "oldspeed" pode ter qualquer nome, seu objetivo é apenas enganar o sistema para fazê-lo voltar à velocidade original, após o jogo ser despausado. Sua adoção se faz necessária caso queira utilizar velocidades randômicas para os objetos, como eu. Caso use velocidades fixas, dispense esta linha de comando.
A pausa nãoafetará as outras características do evento "create", como a posição de nascimento dos objetos, o sprite a ser exibido e tal. É só fazer como explicado acima.
Imagem
2 - No evento "Step" dos objetos, entre com o seguinte código:


if (global.pause == 1)
{
speed=0;
sprite_get_texture(nome_do_sprite, 0);
}

else{
speed=oldspeed;
}



Explicando o código: ao ser acionada a tecla de pausa, a velocidade dos objetos será zerada, e eles vão parar imediatamente de se mover na tela. O comando "sprite_get_texture" deveria ordenar ao sprite que paralizasse a animação no sprite exibido no momento do acionamento da pausa. Por algum erro meu, esta parte do código não funcionou, mas não atrapalha o restante. Caso o sprite do objeto não tenha animação, elimine essa linha. 
Finalmente, a condicional "else" manda que o jogo ao ser despausado, faça os objetos terem suas velocidades originais restauradas. Por alguma razão que a própria razão desconhece, o GM Studio não faz isso automaticamente, tão logo o "booleano" seja desfeito, a velocidade dos objetos é misteriosamente setada apenas para um valor qualquer diferente de zero, (geralmente 1, nos testes que fiz). Daí vem a necessidade da variável "odspeed", o programa resgata o valor atribuído a ela lá no início da criação do objeto e restaura o valor da velocidade original.
Novamente, caso você use velocidades fixas, não haverá necessidade de usar o auxílio de "oldspeed".

Se você fez tudo direitinho, apenas esta parte do código será afetada pela pausa e funcionará redondinho.

Infelizmente, não consegui fazer o cenário parar, caso o fundo tenha scroll/parallax e NÃO SEJA um objeto. Se for esse o caso, é só fazer o cenário de fundo com um objeto, e aplicar o mesmo sistema. Quanto a paralisar as animações, sigo tentando.

Tão fácil praquele povo da YOYO simplesmente manter como era no GM8... Nem tinha pra que inventar de remover a função, nos jogos atuais, a pausa é indispensável.

divirtam-se!
Imagem

Tião Ferreira
cabrumzine@hotmail.com
www.tiaoferreira.deviantart.com
www.gamearte.blogspot.com
www.filosofiashmup.blogspot.com
http://gamejolt.com/@TiaoFerreira
https://tiaoferreira.itch.io

Eis o link para baixar o arquivo de testes: http://www.mediafire.com/file/u9mpjdbqjm933up/pausetest.gmx.rar

=================================================================================================================================
Edit:
Um amigo de SP, JJ Chung, conseguiu paralisar as animações. No código verificador da pausa (evento "step" dos objetos), o mesmo que faz a velocidade zerar, adicione o seguinte linha:


image_speed = 0;



Isso fará o sprite parar a animação no exato momento da pausa.

No código de despausar, é só restaurar a veocidade original da animação:


image_speed = 1;




Super simples, funcionou liso!

Nem de longe lembra os métodos complicados que vi até agora!


Imagem
3

Tags:
 
Avatar do usuário
junior.rod2
Membro
Membro
Mensagens: 95
Registrado em: Sáb Ago 22, 2015 6:04 pm
Karma: 205

Re: [Tutorial] PAUSA NO GM STUDIO: ESQUECERAM DELA?

Qua Fev 15, 2017 1:23 pm

Parabéns pelo tutorial, é uma função simples que o GMS deixou para trás, mas que sem duvidas era bem útil em alguns projetos. 
Com certeza esse tópico vai ajudar os programadores mais novos que precisarem de algo parecido com a antiga função do GM.

PS: Dei uma formatada no tópico, para deixar mais organizado. :flw:
 
Avatar do usuário
tiaoferreira
Membro
Membro
Autor
Mensagens: 30
Registrado em: Sex Jul 29, 2016 6:32 pm
Karma: 40

Re: [Tutorial] PAUSA NO GM STUDIO: ESQUECERAM DELA?

Qua Fev 15, 2017 2:01 pm

Blz, TKS!

Era muito melhor no GM8, simplesmente você criava um script com esses comandos e resolvia toda a parada:

{
  draw_set_halign(fa_center);
  draw_sprite(nome_do_sprite_de_pausa,0,X,Y);
  screen_refresh();
  keyboard_wait()
  io_clear();
}

Quando você aperta o botão de pause, o script é chamado e ele age sobre todos os objetos do jogo, até mesmo os fundos automáticos da "room". Não precisa digitar mais nada em lugar algum, apenas isso resolve. Não consigo imaginar como a YOYO retirou isso do ar, sendo um recurso tão prático.
 
Avatar do usuário
chicoweb
Membro
Membro
Mensagens: 140
Registrado em: Sáb Ago 22, 2015 5:41 pm
Karma: 260

Re: [Tutorial] PAUSA NO GM STUDIO: ESQUECERAM DELA?

Qua Fev 15, 2017 3:29 pm

Tão fácil praquele povo da YOYO simplesmente manter como era no GM8... Nem tinha pra que inventar de remover a função, nos jogos atuais, a pausa é indispensável.


Eu concordo com vc que muitas coisas boas foram "retiradas" em relação ao gm8 sim.
Só que na verdade não é tão simples, lembre-se que o gms exporta para várias outras plataformas agora tipo android, iphone, consoles, windows, mac, etc...
Então é normal que nessas outras plataformas não existam algumas funções que só o pc suportava.
A pesar de no final das contas serem todas linguagem C (Me corrijam se eu tive errado) existem limitações de hardware.

Agora voltando ao seu tutorial, eu fiz parecido com o global.pause, só no meu caso deu muito mais trabalho proque eu tive que colocar isso aqui em todos os eventos de códigos de cada objeto:

if (global.pause == 1){
    exit;
}


Por exemplo coloquei até nos eventos de colisões.
No seu jeito eu não precisava colocar nos eventos de colisões, já que com o speed = 0 ele não colidir com niguem neh!
Valeu ai tiao vou aproveitar essa dica.
Meus games:
Jump James - Aventura/Estratégia/Robô
Freedom of Pala Pala - Aventura/Estratégia
Prisioneira - RPG/Bloco/Ação
 
Avatar do usuário
tiaoferreira
Membro
Membro
Autor
Mensagens: 30
Registrado em: Sex Jul 29, 2016 6:32 pm
Karma: 40

Re: [Tutorial] PAUSA NO GM STUDIO: ESQUECERAM DELA?

Qui Fev 16, 2017 5:45 am

[ltr]Resolvido definitivamente o problema da pausa: um amigo chamado Mateus Malvessi simplesmente modificou o código do "obj_pause", e retirou todo e qualquer rastro de comandos de pausa nos objetos. Todo o controle da função ficou restrito e centralizado no "obj_pause". Isso facilitou muito, pois se você importar objetos de outros projetos, não será necessário alterar o código interno dos mesmos.[/ltr]

[ltr]Dessa forma, a pausa ficou tão simples quanto no GM8.[/ltr]

[ltr]Não precisa alterar mais nada, em lugar algum do jogo, só isso mesmo, só e somente só :)![/ltr]

[ltr]Imagem[/ltr]

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes