[Engine] Efeitos de texto

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Engine] Efeitos de texto

Mensagem por saim em Seg 13 Fev 2012, 10:44

Nome: Alguns efeitos com texto
Descrição: Um truque que faz os caracteres de um texto se comportar como várias instâncias independentes.
Nível de dificuldade: Iniciante
Requerimentos: Pro, pra alguns efeitos. Outros rodam em lite.
Pré-requisitos: Nenhum.
Download: primeira versão, segunda versão.
Controles: scroll (a rodinha do mouse) troca o efeito a ser usado, espaço inicia.

Cansado de ter aqueles textos estáticos na tela, quando você poderia ter letras pulando alegremente pela tela ou coloridas de forma dinâmica ou ter suas palavras explodindo como se tivessem sido vítimas de personagem do jogo?
Bom, eu vi uma engine muito parecida com essa do link a um tempo atrás e não lembro de tudo o que havia na engine, mas lembro o suficiente pra postar essa engine.

Basicamente, vamos dividir uma string em várias sub-strings de um caractere e armazenar a posição de cada substring de forma que desenhar todas essas substrings em suas posições corretas tenha o mesmo efeito visual que desenhar a string original.
Depois, mudamos essas posições, criando os efeitos.

Pra fazer essas substrings, copiamos o primeiro caractere da string na substring e, depois, eliminamos esse caractere da string original. Eu preferi fazer uma cópia e manter a string original, mas na prática, a única informação a ser mantida é o tamanho (em número de caracteres) dessa string original (a ser corrigido na próxima revisão).
Uma vez definida cada substring, a posição fixa de cada uma delas será igual à posição da substring anterior + o tamanho (a largura) da string anterior.
Tudo isso será feito num único loop, logo no create event do objeto que irá administrar todos os caracteres.
Nesse loop, o caractere e a posição de cada substring serão armazenados em arrays, bem como outras variáveis que serão usadas no momento do efeito (velocidade, gravidade, cor, o diabo).

Durante os efeitos, essas variáveis individuais serão alteradas, fazendo com que as letras pareçam brincar pela tela.

Chega de papo, o lance agora é código. Vou mostrar o create event aqui, o resto você vê baixando a engine (ainda preciso criar uns prints, quando criar eu edito e posto aqui).
Código:
draw_set_font(font0); //define a fonte a ser usada (importante pro string_width)

texto = "Aperte espaço para ver o efeito" //um texto de uma linha qualquer
xt = 20; yt = room_height / 2; //uma posição pro texto original, na tela

var copia, i;
copia = texto; //uma cópia do texto origianal, pra ser editada
for(i = 0; i <= string_length(texto); i += 1){ //pra cada letra do texto
   substring[i] = string_copy(copia, 0, 1); //cria uma substring da primeira letra da cópia
   pyP[i] = yt + 20; py[i] = pyP[i]; // define uma posição (final e temporária) em y pra cada letra
   if (i == 0){ //se é a primeira letra
      pxP[i] = xt; //define a posição final (em x)
      px[i] = pxP[i]; //define a posição temporária (em x)
      }
      else { //pras demais letras
         pxP[i] = px[i - 1] + string_width(substring[i - 1]); //a posição final é igual à temporaria da letra anterior + o tamanho da letra anterior
         px[i] = pxP[i]; //a posição temporária começa igual à final
         }
   spdX[i] = 0; //a velocidade (em x) individual começa como zero
   spdY[i] = 0; //a velocidade (em y) individual começa como zero
   cor[i] = 0; //a cor individual começa como preto
   grav[i] = 0; //a gravidade individual começa como zero

   copia = string_delete(copia, 1, 1); //Elimina a primeira letra da cópia, de modo que o loop pegue todas as letras
   }

Na engine, o create se extende um pouco mais, porque eu preciso mostrar diferentes efeitos, mas o importante, agora, é entender como o loop armazena as variáveis que serão usadas nas arrays. O resto é brincar.

Limitações conhecidas:
- A engine não aceita textos maiores que uma linha. Simplesmente não foi prevista essa possibilidade.

Alterações na aplicação em jogos
- Na engine, os efeitos têm um limite de tempo pra acontecer (o que pode cortar o barato, algumas vezes), mas isso não é necessário na implementação dela nos jogos.
- O que está sendo mostrado são só alguns exemplos do que pode ser feito com essa técnica. Há muito mais possibilidades, basta soltar a imaginação. Vou implementando essa engine no meu tempo livre, vocês podem enviar mais idéias.
- Eu usei triggers pra iniciar os efeitos e um switch, no step event, pra dar continuidade a eles. Pode-se usar scripts, event_user, alarms, ou qualquer outro evento pra iniciar os efeitos. Pra dar continuidade, o step é essencial, mas não há necessidade do switch, já que, normalmente, usa-se apenas um efeito.

Autorização: Qualquer um fica autorizado, desde já, a usar essa engine, sem obrigatoriedade de citar meu nome nos créditos.
Entretanto, eu ficaria agradecido se me mostrassem os jogos com uso dela, por mera curiosidade.

Edit: Fiz uma atualização que deixou o create event muito mais complexo de se entender, mas a engine ficou muito mais útil, então vale a pena queimar as pestanas. Vou manter a versão anterior a fim de possibilitar o entendimento, mesmo pra iniciantes, mas recomendo fortemente baixar a segunda versão.
Basicamente, incluí a opção de usar vários textos diferentes. Daí, cada caractere fica numa array 2D, em que o primeiro índice significa o texto (a string) daquele caractere e o segundo índice significa a posição dele no texto.
Como eu não sabia (e ainda não sei) se o string_copy funciona pra caracteres de além do tamanho do texto e precisava que o valor máximo do segundo índice fosse constante, criei uma rotina que inclui espaços em branco no final de cada texto, até todos terem a mesma quantidade de caracteres.

Se por um lado a inicialização ficou mais complicada, a utilização ficou bem mais simples. Coloquei o início e o step de cada efeito em scripts, joguei o índice desses scripts em arrays e pronto, pra usar é só saber qual efeito você quer e chamar o índice do script (hm... bem que eu podia usar argumentos ao invés de variáveis... fica pra próxima revisão!).

Mas porque isso ficou mais util? Porque agora, com número ilimitado de textos (que podem mudar em ciclos, como na engine, ou ir só do primeiro ao último), pode-se mostrar um texto longo que conte uma história, sem precisar criar um objeto pra cada texto diferente. Pode-se até usar alguma rotina de importação de texto, sei lá. Mesmo só pra leitura, sem aplicação em jogos, esses efeitos são bonitinhos e interessantes.

Não testei nem pretendo testar qual o tamanho da array que começa a dar lag no create event (tem uns laços bem longos, lá), mas pra qualquer tamanho, o step deve ser bem rápido.


Última edição por saim em Qui 23 Fev 2012, 15:30, editado 1 vez(es)

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por Doritos555 em Seg 13 Fev 2012, 14:39

Bem louco isso!! Eu baixei e estava vendo como funciona, estava alterando uns valores para ver o que dá. Na verdade eu estava tentando mudar os textos durante o jogo, mas deu um desastre e agora a engine não funciona mais Haha;

Depois eu baixo novamente e tento outra vez estudar esse engine, agora estou meio sem tempo. flw

Doritos555

Ranking : Nota A
Número de Mensagens : 78
Idade : 20
Data de inscrição : 19/01/2012
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por saim em Ter 14 Fev 2012, 09:16

Doritos555 escreveu:Na verdade eu estava tentando mudar os textos durante o jogo
Mudar o texto com animação?
Não pensei nisso... mas pode ser possível, sim! Bem mais complexo, mas pode criar efeitos sensacionais! Tipo, você faz uma array 2D de substrings, num índice da array você coloca a qual substring o índice se refere, como antes, e no outro índice, a qual texto a substring se refere.
Daí, usa um efeito pro texto que sai e outro efeito diferente pro texto que entra. Talvez até evita animar as substrings que sejam iguais, como se o computador estivesse com preguiça de tirar uma letra pra colocar outra igual (o que, na verdade, vai dar é um pouco mais de trabalho).

Vou ver o que dá pra fazer, aqui...

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por Doritos555 em Ter 14 Fev 2012, 14:36

Não seria bem mudar o texto com animação, o que ia ser bem complicado. Isso ia ficar bem mais bonito na verdade. Até mudar o texto após a animação serve.

Eu coloquei um texto_number =0 no create event, e no alarm[0] coloquei texto_number +=1 (pra passar pro proximo texto toda vez que um efeito acaba) e no step, eu coloquei

if texto_number =1{texto = "Primeiro texto"}
if texto_number =2{texto = "Segundo texto"}
if texto_number =3{texto = "Terceiro texto"}
if tex...........


Mas eu percebi que a frase que recebe a animação não muda. Pelo jeito não é a variável texto que controla a frase da animação, por que eu fazendo o que fiz acima, o texto estatico muda toda vez que a animação acaba, mas o animado volta assim:

Digite sua f
Digite sua fra
Digite su

Essas coisas do gênero (a mesma frase que você coloca no começo inacabada). Acho que isso dai ainda não é pra mim, é bem complicado D:

Doritos555

Ranking : Nota A
Número de Mensagens : 78
Idade : 20
Data de inscrição : 19/01/2012
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por saim em Qui 23 Fev 2012, 15:33

Modifiquei a engine. Como ficou um tanto complexo, o create event, mantive a engine anterior, que é mais simples e serve pra mostrar a idéia básica. Mas está tudo muito comentado, acho que com um pouco de esforço dá pra entender a segunda versão numa boa.
A atualização está no edit do primeiro post. A segunda versão está com o download logo ao lado da primeira versão.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por jharik em Qua 21 Mar 2012, 07:14

aki deu erro ta dando

___________________________________________
ERROR in
action number 1
of Draw Event
for object objEfeito:

Error in code at line 7:
draw_text_color(px[textoSai, j], py[textoSai, j], substring[textoSai, j], cor[textoSai, j], cor[textoSai, j], cor[textoSai, j], cor[textoSai, j], alpha[textoSai, j]); //desenha a letra na posi��o tempor�ria (que pode ser igual � final)
^
at position 6: This function is not available in the Lite Edition.

jharik

Número de Mensagens : 25
Data de inscrição : 19/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por saim em Qua 21 Mar 2012, 08:33

Esse é um dos efeitos que requerem a versão pro. É que ele usa a função draw_text_color.
Infelizmente, você vai ter que se virar sem ele ou conseguir uma versão pro.

...
Esse de cores ainda dá pra ficar variando a cor do draw_set_color, e, se bobear, até do draw_set_alpha, mas tenho a impressão que o preço em processamento não é barato.
Seja como for, essa linha está dentro de um loop, certo? Você coloca, antes dela, "draw_set_color(cor[textoSai, j]); draw_set_alpha(alpha[textoSai, j]);" e substitui a linha por "draw_text(px[textoSai, j], py[textoSai, j], substring[textoSai, j])". NESSE CASO, pode ser que funcione.

Ainda que não funcione, não é um dos meus preferidos. Elimine os efeitos que gerarem esses erros, pra ver o resto. Os mais legais, na minha opinião, usam apenas funções lite.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por mcjharikmc em Qua 21 Mar 2012, 08:56

show mais aki n pego

mcjharikmc

Número de Mensagens : 1
Data de inscrição : 21/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por Zero. em Qui 22 Mar 2012, 22:13

Foi vc q fez isso ?
Se foi vc é um monstro vei. que isso incrivel adorei.
Vc é muito bom, vou pagar pra vc me da aula vc mora aonde Happy ?
Mto massa !

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por Super Maker em Qui 22 Mar 2012, 22:28

Perfeitamente perfeito!
Saim, você é um gênio, ficou muito bem esses efeitos.
Valeu!

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por saim em Qui 22 Mar 2012, 23:27

FlyAway escreveu:Foi vc q fez isso ?
Mais ou menos... FAZER, fui eu quem fez, mas a idéia original não é minha.
Eu já tinha visto uma engine parecida e lembrava da base: dividir o texto em sub-strings de um caractere. Na época, só ficou isso na minha cabeça, o resto eu não consegui entender.
Aí, o Doritos555 precisou de algo do tipo e eu pensei: agora eu já dou conta de refazer aquela engine! Fiz. Tenho a impressão que a engine original dava suporte pra textos em múltiplas linhas, mas isso eu não consegui fazer.

Que bom que a engine agradou! Eu me diverti, fazendo ela. Adoro esses usos de geometria em games. Se alguém tiver mais alguma idéia pro texto entrando ou saindo, por favor, sugira!

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Engine] Efeitos de texto

Mensagem por Conteúdo patrocinado Hoje à(s) 09:32


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum