Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Qui 21 Nov 2024, 13:33
» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
[Isométrico] Parte 1 - Movimentação Básica
+4
fonetico
Biemorth
andreh
JV Justino
8 participantes
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
[Isométrico] Parte 1 - Movimentação Básica
Nome: [Isométrico] Parte 1 - Movimentação Básica
Descrição: Como fazer movimentos, gravidade e pulos em jogos isométricos.
Nível: Intermediário
Requerimentos: Lite/Pro
Olá!
Estarei fazendo alguns tutoriais sobre jogos isométricos. Como serão muito compridos, irei dividi-los em partes. Na primeira parte, será ensinado como fazer movimentos em jogos isométricos, pulos e gravidade, e colisão com blocos.
Vamos Começar!
Muitos têm dificuldade ao fazer pulos em jogos isométricos. Se x representa o comprimento e y a largura, o que representa a altura? Assim como no 3D, o ponto z representa a altura.
Os pulos e a gravidade serão coordenados pelo ponto z, enquanto x e y coordenam os movimentos do player.
Os tutoriais explicarão somente como movimentar um objeto, então não há necessidade de usar muitas sprites.
Crie uma sprite e chame-a de spr_player. E nela carregue esta imagem:
Crie outra sprite e chame-a de mask_player. Carregue esta imagem: . Depois, altere sua Origin para X=0 e Y=-16.
Crie um objeto chamado obj_player. Coloque nele a sprite spr_player e a mask mask_player.
No evento Create coloque:
z=0;
Esta variável definirá a altura do player.
zland=0;
Esta variável definirá a altura mínima, evitando que o player atravesse o "chão".
zspeed=0;
Esta variável definirá a altura do pulo.
zgravity=0;
Define a gravidade do player.
Agora no evento Step coloque:
Este código é muito grande para explicar um por um os itens. Eles só farão o player andar. Repare que vspeed é menor do que hspeed, pois se não fosse, daria impressão de que o player está correndo para cima e para baixo, e não andando
Ainda no evento Step coloque:
if(keyboard_check_pressed(vk_space) && z=zland) zspeed=7;
Se for pressionada a tecla Space e o player estiver no chão, ele pulará.
z+=zspeed;
A altura irá aumentando conforme a velocidade do pulo.
zspeed-=zgravity;
A velocidade irá diminuir aos poucos, conforme a gravidade.
if(z>zland) zgravity=0.5;
Se o objeto não estiver no chão, a gravidade será de 0.5
if(z {
z=zland;
zgravity=0;
}
Se a altura for menor que a altura mínima, ele ficará na altura mínima e a gravidade será 0.
depth=-y-z/2;
Calcula a profundidade do objeto, conforme a posição y e a altura.
Agora vem o truque de tudo. No evento Draw coloque:
Ele desenha o player nos pontos x e y, diminuindo a altura do ponto y.
Agora estão prontos os movimentos do player!
Agora faremos obstáculos, que são blocos onde o player só pode atravessar se passar por cima deles. Como fazer isso? Lembram-se do que eu disse no começo?
Crie uma nova sprite e chame-a de spr_block. Carregue a imgem:
Crie outra sprite e chame-a de mask_block e carregue a imagem:
Crie um objeto chamado obj_block. Coloque nele a sprite spr_block e a mask mask_block.
No evento create coloque:
z=16;
Esta variável define altura do bloco.
depth=-y-z/3;
Define a profundidade do objeto, relacionando a posição y com a altura. Como o objeto é imóvel, não há necessidade de recalcular a profundidade a cada step
No evento Step coloque:
if(obj_player.z>=z) solid=false;
Se o player estiver sobre o bloco, ele não será solido, permitindo que o player caminhe sobre ele.
else solid=true;
Se o player estiver abaixo da altura do bloco, ele será sólido, fazendo com que o player não possa atravessá-lo.
Agora que o objeto já foi configurado, vamos voltar para o player. Adicione um evento de colisão com o obj_block e coloque:
if(z>=other.z) zland=other.z;
Se o player estiver acima bloco, a altura mínima será a altura do bloco, fazendo com que o player pare sobre ele.
Durante a colisão com o objeto, o player terá dificuldade para se locomover. Se quiser, poderá adicionar o seguinte código para que o player passe escorregando pelo bloco.
No evento Step, adicione o código:
Se o bloco não estiver embaixo do player, a altura mínima será 0, que é a altura do "chão".
Você pode fazer blocos de diferentes tamanhos. Para isso, adicione um novo objeto, e coloque como parent o obj_block e mudar a altura (a altura deve ser divisível a 16).
Para posicionar os objeto na room, ela deve ter a grade em 32x16.
E acaba a primeira parte do tutorial. Espero que tenham gostado. Qualquer dúvida é só perguntar!
さようなら!
Parte 2 - Blocos Flutuantes e Plataformas Móveis. Aguardem!
Descrição: Como fazer movimentos, gravidade e pulos em jogos isométricos.
Nível: Intermediário
Requerimentos: Lite/Pro
Olá!
Estarei fazendo alguns tutoriais sobre jogos isométricos. Como serão muito compridos, irei dividi-los em partes. Na primeira parte, será ensinado como fazer movimentos em jogos isométricos, pulos e gravidade, e colisão com blocos.
Vamos Começar!
1- Uma breve explicação
Muitos têm dificuldade ao fazer pulos em jogos isométricos. Se x representa o comprimento e y a largura, o que representa a altura? Assim como no 3D, o ponto z representa a altura.
Os pulos e a gravidade serão coordenados pelo ponto z, enquanto x e y coordenam os movimentos do player.
2- Movimentação do Player
Os tutoriais explicarão somente como movimentar um objeto, então não há necessidade de usar muitas sprites.
Crie uma sprite e chame-a de spr_player. E nela carregue esta imagem:
Crie outra sprite e chame-a de mask_player. Carregue esta imagem: . Depois, altere sua Origin para X=0 e Y=-16.
Crie um objeto chamado obj_player. Coloque nele a sprite spr_player e a mask mask_player.
No evento Create coloque:
- Código:
z=0;
zland=0;
zspeed=0;
zgravity=0;
z=0;
Esta variável definirá a altura do player.
zland=0;
Esta variável definirá a altura mínima, evitando que o player atravesse o "chão".
zspeed=0;
Esta variável definirá a altura do pulo.
zgravity=0;
Define a gravidade do player.
Agora no evento Step coloque:
- Código:
if(keyboard_check(vk_up) && keyboard_check(vk_left))
{
vspeed=-2;
hspeed=-4;
}
else if(keyboard_check(vk_up) && keyboard_check(vk_right))
{
vspeed=-2;
hspeed=4;
}
else if(keyboard_check(vk_down) && keyboard_check(vk_left))
{
vspeed=2;
hspeed=-4;
}
else if(keyboard_check(vk_down) && keyboard_check(vk_right))
{
vspeed=2;
hspeed=4;
}
else if(keyboard_check(vk_up))
{
vspeed=-2;
hspeed=0;
}
else if(keyboard_check(vk_down))
{
vspeed=2;
hspeed=0;
}
else if(keyboard_check(vk_left))
{
hspeed=-4;
vspeed=0;
}
else if(keyboard_check(vk_right))
{
hspeed=4;
vspeed=0;
}
else
{
vspeed=0;
hspeed=0;
}
Este código é muito grande para explicar um por um os itens. Eles só farão o player andar. Repare que vspeed é menor do que hspeed, pois se não fosse, daria impressão de que o player está correndo para cima e para baixo, e não andando
Ainda no evento Step coloque:
- Código:
if(keyboard_check_pressed(vk_space) && z=zland) zspeed=7;
z+=zspeed;
zspeed-=zgravity;
if(z>zland) zgravity=0.5;
if(z<zland)
{
z=zland;
zgravity=0;
}
depth=-y-z/2;
if(keyboard_check_pressed(vk_space) && z=zland) zspeed=7;
Se for pressionada a tecla Space e o player estiver no chão, ele pulará.
z+=zspeed;
A altura irá aumentando conforme a velocidade do pulo.
zspeed-=zgravity;
A velocidade irá diminuir aos poucos, conforme a gravidade.
if(z>zland) zgravity=0.5;
Se o objeto não estiver no chão, a gravidade será de 0.5
if(z
z=zland;
zgravity=0;
}
Se a altura for menor que a altura mínima, ele ficará na altura mínima e a gravidade será 0.
depth=-y-z/2;
Calcula a profundidade do objeto, conforme a posição y e a altura.
Agora vem o truque de tudo. No evento Draw coloque:
- Código:
draw_sprite(sprite_index,image_index,x,y-z);
Ele desenha o player nos pontos x e y, diminuindo a altura do ponto y.
Agora estão prontos os movimentos do player!
2- Colisão com Blocos
Agora faremos obstáculos, que são blocos onde o player só pode atravessar se passar por cima deles. Como fazer isso? Lembram-se do que eu disse no começo?
Nesse caso, é só fazer a altura mínima ser a altura do bloco.zland=0;
Esta variável definirá a altura mínima, evitando que o player atravesse o "chão".
Crie uma nova sprite e chame-a de spr_block. Carregue a imgem:
Crie outra sprite e chame-a de mask_block e carregue a imagem:
Crie um objeto chamado obj_block. Coloque nele a sprite spr_block e a mask mask_block.
No evento create coloque:
- Código:
z=16;
depth=-y-z/3;
z=16;
Esta variável define altura do bloco.
depth=-y-z/3;
Define a profundidade do objeto, relacionando a posição y com a altura. Como o objeto é imóvel, não há necessidade de recalcular a profundidade a cada step
No evento Step coloque:
- Código:
if(obj_player.z>=z) solid=false;
else solid=true;
if(obj_player.z>=z) solid=false;
Se o player estiver sobre o bloco, ele não será solido, permitindo que o player caminhe sobre ele.
else solid=true;
Se o player estiver abaixo da altura do bloco, ele será sólido, fazendo com que o player não possa atravessá-lo.
Agora que o objeto já foi configurado, vamos voltar para o player. Adicione um evento de colisão com o obj_block e coloque:
- Código:
if(z>=other.z) zland=other.z;
if(z>=other.z) zland=other.z;
Se o player estiver acima bloco, a altura mínima será a altura do bloco, fazendo com que o player pare sobre ele.
Durante a colisão com o objeto, o player terá dificuldade para se locomover. Se quiser, poderá adicionar o seguinte código para que o player passe escorregando pelo bloco.
- Código:
if(keyboard_check(vk_left) && z=zland)
{
if(place_free(x-4,y+2))
{
hspeed=-4;
vspeed=2;
}
if(place_free(x-4,y-2))
{
hspeed=-4;
vspeed=-2;
}
}
if(keyboard_check(vk_up) && z=zland)
{
if(place_free(x-4,y-2))
{
hspeed=-4;
vspeed=-2;
}
if(place_free(x+4,y-2))
{
hspeed=4;
vspeed=-2;
}
}
if(keyboard_check(vk_right) && z=zland)
{
if(place_free(x+4,y+2))
{
hspeed=4;
vspeed=2;
}
if(place_free(x+4,y-2))
{
hspeed=4;
vspeed=-2;
}
}
if(keyboard_check(vk_down) && z=zland)
{
if place_free(x-4,y+2)
{
hspeed=-4;
vspeed=2;
}
if(place_free(x+4,y+2))
{
hspeed=4;
vspeed=2;
}
}
No evento Step, adicione o código:
- Código:
if !place_meeting(x,y,obj_block) zland=0;
Se o bloco não estiver embaixo do player, a altura mínima será 0, que é a altura do "chão".
Você pode fazer blocos de diferentes tamanhos. Para isso, adicione um novo objeto, e coloque como parent o obj_block e mudar a altura (a altura deve ser divisível a 16).
Para posicionar os objeto na room, ela deve ter a grade em 32x16.
E acaba a primeira parte do tutorial. Espero que tenham gostado. Qualquer dúvida é só perguntar!
さようなら!
Parte 2 - Blocos Flutuantes e Plataformas Móveis. Aguardem!
Última edição por JV Justino em Qua 17 Dez 2014, 15:37, editado 8 vez(es)
JV Justino- Games Ranking :
Notas recebidas : A+A
Data de inscrição : 07/12/2010
Reputação : 20
Número de Mensagens : 619
Prêmios :
x 0 x 13 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Isométrico] Parte 1 - Movimentação Básica
Nossa! Ótimo tuto, ele deve ser aprovado, parabéns. Por favor, não desista desse tema, eu quero aprender a fazer jogos isométricos, e vc explica bem!
andreh- Games Ranking :
Notas recebidas : C
Data de inscrição : 09/03/2011
Reputação : 3
Número de Mensagens : 183
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Isométrico] Parte 1 - Movimentação Básica
Muito obrigado!andreh escreveu:Nossa! Ótimo tuto, ele deve ser aprovado, parabéns. Por favor, não desista desse tema, eu quero aprender a fazer jogos isométricos, e vc explica bem!
E não se preocupe, agora só tenho apenas idéias para fazer duas partes, mas estarei sempre fazendo mais. Jogos isométricos são muito complicados, principalmente com pulo e gravidade.
Talvez hoje mesmo eu faça a parte 2, que ensinará a usar blocos flutuantes e plataformas móveis.
JV Justino- Games Ranking :
Notas recebidas : A+A
Data de inscrição : 07/12/2010
Reputação : 20
Número de Mensagens : 619
Prêmios :
x 0 x 13 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Isométrico] Parte 1 - Movimentação Básica
Nossa seu tutorial tá ótimo nota 1000/10 sem dúvida um dos melhores tutos que eu ja vi parabéns e se for fazer a segunda parte, me envia uma MP depois de pronto com o link!!!
Re: [Isométrico] Parte 1 - Movimentação Básica
Pode deixar, assim que eu terminar eu envio a MP.!GO┴E! escreveu:Nossa seu tutorial tá ótimo nota 1000/10 sem dúvida um dos melhores tutos que eu ja vi parabéns e se for fazer a segunda parte, me envia uma MP depois de pronto com o link!!!
Muito obrigado!
JV Justino- Games Ranking :
Notas recebidas : A+A
Data de inscrição : 07/12/2010
Reputação : 20
Número de Mensagens : 619
Prêmios :
x 0 x 13 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Isométrico] Parte 1 - Movimentação Básica
Dica:no próximo tuto ponha os códigos em código ex.:
- Código:
assim
Resp:Disponhajoao vitor jv escreceu:
Muito obrigado!
Re: [Isométrico] Parte 1 - Movimentação Básica
É verdade. Eu não gosto muito da auto-formatação. Prefiro o code mesmo.!GO┴E! escreveu:Dica:no próximo tuto ponha os códigos em código ex.:Fica mais rápido pois vc copia e cola depois vc vem e tenta entender o código fica mais simples também
- Código:
assim
Resp:Disponhajoao vitor jv escreceu:
Muito obrigado!
Muito obrigado de novo!
JV Justino- Games Ranking :
Notas recebidas : A+A
Data de inscrição : 07/12/2010
Reputação : 20
Número de Mensagens : 619
Prêmios :
x 0 x 13 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Isométrico] Parte 1 - Movimentação Básica
Parabéns! Gostei do tutorial muito bom! Ainda mais porque é sobre um assunto muitas vezes nem lembrado.
- Tutorial aprovado
- Movido para Tutoriais aprovados
- Tutorial aprovado
- Movido para Tutoriais aprovados
fonetico- Data de inscrição : 05/10/2009
Reputação : 7
Número de Mensagens : 1830
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Isométrico] Parte 1 - Movimentação Básica
Parabéns você mereceu ainda mais por que o tema é difícil e você explica-o muito bem e com naturalidade você consegue tornar um tema normalmente chato em um tema até agradável, parabéns !!!
Re: [Isométrico] Parte 1 - Movimentação Básica
É outro bom tutorial.
Está bem formatado e explicado, dando gosto de ler.
Dica: Se você deixar auto-formatado vai evitar que venham e façam cópia do seu tutorial para o game maker, sem ao menos ler. Isso dificulta mais o trabalho dessas pessoas.
Até mais!
Está bem formatado e explicado, dando gosto de ler.
Dica: Se você deixar auto-formatado vai evitar que venham e façam cópia do seu tutorial para o game maker, sem ao menos ler. Isso dificulta mais o trabalho dessas pessoas.
Até mais!
Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.
Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.
Aprenda a calcular a velocidade de suas animações
Entre para o Clube do Inglês:
Re: [Isométrico] Parte 1 - Movimentação Básica
Então nesse caso, eu vou usar a auto-formatação mesmo.Pedro Henrique escreveu:É outro bom tutorial.
Está bem formatado e explicado, dando gosto de ler.
Dica: Se você deixar auto-formatado vai evitar que venham e façam cópia do seu tutorial para o game maker, sem ao menos ler. Isso dificulta mais o trabalho dessas pessoas.
Até mais!
Muito obrigado!
JV Justino- Games Ranking :
Notas recebidas : A+A
Data de inscrição : 07/12/2010
Reputação : 20
Número de Mensagens : 619
Prêmios :
x 0 x 13 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Isométrico] Parte 1 - Movimentação Básica
da esse erro
- Código:
___________________________________________
FATAL ERROR in
action number 4
of Step Event
for object obj_player:
COMPILATION ERROR in code action
Error in code at line 10:
depth=-y-z/2;</zland)
^
at position 16: Unexpected symbol in expression.
Re: [Isométrico] Parte 1 - Movimentação Básica
Isso é um problema que ocorreu por causa da auto-formatação.
O correto é depth=-y-z/2;
Depois eu tento corrigir os problemas
O correto é depth=-y-z/2;
Depois eu tento corrigir os problemas
JV Justino- Games Ranking :
Notas recebidas : A+A
Data de inscrição : 07/12/2010
Reputação : 20
Número de Mensagens : 619
Prêmios :
x 0 x 13 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Isométrico] Parte 1 - Movimentação Básica
Sonic Luan:
Para resolver esse problema, é simples:
Posicione o mouse na parte de cima e na direita da caixa de códigos, aparecerá três botões, clique no primeiro e pronto, seu código vai estar limpo, copie o código e cole no game maker.
Até mais!
Para resolver esse problema, é simples:
Posicione o mouse na parte de cima e na direita da caixa de códigos, aparecerá três botões, clique no primeiro e pronto, seu código vai estar limpo, copie o código e cole no game maker.
Até mais!
Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.
Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.
Aprenda a calcular a velocidade de suas animações
Entre para o Clube do Inglês:
Re: [Isométrico] Parte 1 - Movimentação Básica
Cara eu ia fazer uma engine assim =/ Mas já que você já fez esse tutorial, parabéns... Está muito bem feito.
Licht- Games Ranking :
Data de inscrição : 26/04/2010
Reputação : 34
Número de Mensagens : 1217
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [Isométrico] Parte 1 - Movimentação Básica
Realmente um tutorial maravilhoso, estou amando os tutoriais, realmente o tutorial está ótimo, executei o tutorial e deu certinho aqui, mas uma dúvida, como enfileirar cada bloco na room?Pois aqui eu só consigo colocar um longe no outro, é algum problema na mascará ou no tamanho do objeto?
Super Games- Games Ranking :
Notas recebidas : C
Data de inscrição : 10/06/2010
Reputação : 36
Número de Mensagens : 2800
Prêmios :
x 0 x 0 x 0
x 0 x 1 x 0
x 0 x 0 x 0
Plataformas :- Game Maker 8.0 ou 8.1
- Game Maker Studio 1.4
- Game Maker Studio 2.0
- Java
- Godot
- Javascript
- C ou C++
Re: [Isométrico] Parte 1 - Movimentação Básica
Eu me esqueci de citar isto no tutorial, me desculpe.Super Games escreveu:Realmente um tutorial maravilhoso, estou amando os tutoriais, realmente o tutorial está ótimo, executei o tutorial e deu certinho aqui, mas uma dúvida, como enfileirar cada bloco na room?Pois aqui eu só consigo colocar um longe no outro, é algum problema na mascará ou no tamanho do objeto?
A grade da room deve ser de 32x16.
JV Justino- Games Ranking :
Notas recebidas : A+A
Data de inscrição : 07/12/2010
Reputação : 20
Número de Mensagens : 619
Prêmios :
x 0 x 13 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Tópicos semelhantes
» [Isométrico] Parte 3 - Movimentação de NPCs
» [Isométrico] Parte 4 - Fazendo o Player Nadar
» Movimentação básica estilo plataforma
» movimentacao basica com aceleracao e frenagem
» Movimentação básica para jogos RPG / Top-Down
» [Isométrico] Parte 4 - Fazendo o Player Nadar
» Movimentação básica estilo plataforma
» movimentacao basica com aceleracao e frenagem
» Movimentação básica para jogos RPG / Top-Down
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos