sábado, 11 de fevereiro de 2012

[Tutorial] Criando jogo Top-Down - Básico!

Fala galera, de boa?

Bom, eu já tinha feito o guia de como fazer um jogo Top-Down avançado, agora eu vim aqui trazer a vocês como fazer um jogo Top-Down básico, sem complicação, e bem mais fácil. Então, prontos?

Ah, não se esqueça de ir no Menu e ligar o Advanced Mode.

0. Objetivo do tutorial
1. Preparativos
2. Jogador
3. Obstáculos
4. Inimigos
5. Itens
6. Roons do jogo
7. Objetivo do jogo
8. Considerações finais

0. Objetivo do tutorial:

Criar um jogo Top-down em que o personagem deve desviar dos inimigos e salvar ovos de dragões para passar de fase.

1. Preparativos:

Primeiro, vamos criar os sprites e os objetos que usaremos no jogo. Deixe-os parado até o momento que formos usá-los e se quiser, pode especificar o sprite de cada um antes. Então, crie:

Sprites: (Faça todos 32x32 de preferência)
- jogador_baixo
- jogador_cima
- jogador_esquerda
- jogador_direita
- tesouro_sprite
- vida_sprite
- bau_sprite
- parede_1_sprite
- parede_2_sprite
- ovo_de_dragao_sprite (faça com 5 cores diferentes)
- inimigo_1
- inimigo_2
- inimigo_3
- inimigo_4
 obs.: Os inimigos, crie cada um com 4 subimagens, cada uma virada para um lado, começando pela direita, no sentido anti-horário.

Objetos:
- jogador
- ovo_de_dragao
- item_tesouro
- item_bau
- item_vida
- inimigo_principal
- inimigo_1
- inimigo_2
- inimigo_3
- obstaculo_principal
- parede_1
- parede_2

Vamos agora trabalhar com GML. Mas espera, onde devo colocar os códigos? Numa folha de código:


Agora, antes de mais nada, crie uma room. No Create event dela, coloque:
global.pontos =0
Deixe isso guardado no momento e vamos começar nosso trabalho.

2. Jogador:

Bom, como este é um jogo bem simples, nosso jogador será bem rápido de se fazer. No Create event do jogador, coloque:

 vidas =3

Agora, faremos o movimento. No Step event, coloque numa peça de código:

    //Movimentação para a direita
    if keyboard_check(vk_right)
    {sprite_index = jogador_direita
    if place_free(x+4,y){x +=4}
    }

    //Movimentação para a esquerda
    if keyboard_check(vk_left)
    {sprite_index = jogador_esquerda
    if place_free(x-4,y){x -=4}
    }

    //Movimentação para cima
    if keyboard_check(vk_up)
    {sprite_index = jogador_cima
    if place_free(x,y-4){y -=4}
    }

    //Movimentação para baixo
    if keyboard_check(vk_down)
    {sprite_index = jogador_baixo
    if place_free(x,y+4){y +=4}
    }

Agora que o movimento do personagem está pronto como passe de mágica, vamos programar para ele ''andar'' visualmente apenas quando uma tecla de movimento é utilizada. Coloque este código na mesma folha do código acima, depois dele.

    if keyboard_check (vk_down) or keyboard_check (vk_up) or keyboard_check (vk_right) or keyboard_check (vk_left) = true //Checa se algum direcional está sendo pressionado
    {
    image_speed=0.5 //A imagem do personagem se movimentará junto com ele
    }
     else //Se não...
    {
    image_speed =0 //O desenho do personagem ficará parado
    image_index =0 //e voltará para a primeira imagem
    }

Agora, ainda no step event mas em uma folha de código separada, coloque:
if vidas <=0 //Se não sobrarem mais vidas...
{
show_message("Você perdeu!") //Mensagem de Game over
game_restart() //O jogo recomeça
}
E que tal se, a cada 1000 pontos, o jogador ganha uma vida extra? Basta colocar mais um código no step event:
if global.pontos >=1000 //Se tiver mais de mil pontos...
{
vidas +=1 //Uma vida extra!
blobal.pontos -=1000 //Não se esqueça de descontar os pontos.
}
Pronto! Nosso personagem já está configurado! Agora vamos aos outros aspectos do jogo.

3. Obstáculos:

Bom, estes obstáculos vão formar nossas roons. Deixe os objetos parede_1 e parede_2 com Parent obstaculo_principal e ambos Solid também.

Se você quiser criar mais obstáculos, como pedras, árvores e etc, vá em frente, mas lembre-se de deixar todos sólidos e com Parent no obstaculo_principal.

4. Inimigos:

Como nosso personagem não dispõe de armas nem superpoderes, não podemos utilizar inimigos com muita IA ou estaríamos perdidos. Então, vamos utilizar apenas de alguns comandos básicos. Primeiro, temos quatro inimigos, inimigo_1...4 e o inimigo_principal.

Primeiro, coloque no Parent dos quatro inimigos o inimigo_principal.

No create event do primeiro, coloque:
direction = choose(270,90)
speed =4
No create event do segundo:
direction = choose(270,90)
speed =2
No create event do terceiro:
direction = choose(0,180)
speed =4
E no create event do ultimo:
direction = choose(0,180)
speed =2

Agora, adiciona um Collision event com o objeto jogador no inimigo_principal. Coloque o seguinte código:
jogador.vidas -=1 //Menos uma vida
show_message("Você foi atacado! Tente novamente!")//Mensagem
room_restart() //Sala reinicia
Como você pôde ver, mudamos apenas um detalhe de cada. Alguns andam mais rápido, outros mais lento, uns na vertical, outros na horizontal. Coloque sprites diferentes para cada um para ficar mais bonito. Lembre-se o inimigo_principal NÃO faz parte do jogo, então não coloque-o em nenhuma room.

Para finalizar, vamos colocar um código para eles inverterem a direção ao contato com obstáculos, para ficarem patrulhando numa mesma linha. Para isso, crie um Collision event com o objeto obstaculo_principal no objeto inimigo_principal e coloque o seguinte código:

direction +=180
Pronto! Agora os nossos inimigos já estão funcionando, agora vamos para o próximo passo!

5. Itens:

Para o jogo não ficar tão sem-graça, por que não adicionados alguns itens nele? Para isso temos o item_bau, item_tesouro e item_vida. Para programá-los é bem fácil.

Coloque um Collision event em cada com com o jogador.

No item_bau:
global.pontos +=100
instance_destroy()
No item_tesouro:
global.pontos +=50
instance_destroy()
No item_vida:
jogador.vidas +=1
instance_destroy()
Pronto! Agora basta espalhar eles pelo seu jogo! Vale lembrar que programamos o jogador para receber uma vida extra a cada 1000 pontos, então leve isso em consideração antes de distribuir os itens por aí!

6. Roons do jogo:

Antes de mais nada, faça alguns backgrounds legais. Crie mais quatro roons no jogo, totalizando 5. (lembre-se que a primeira precisa ter no Create event global.pontos =0, como eu tinha dito no começo do tutorial)

Coloque o nome das roons de: Sala_1, Sala_2, Sala_3, Sala_4 e Sala_5.

Agora, espalhe os itens e os inimigos e modele os caminhos com os obstáculos. Coloque o jogador numa localização que você ache melhor para começar cada room. Deixe tudo pronto para adicionarmos os detalhes finais.

7. Objetivo do jogo:

Agora vamos ao ovo_de_dragao, o objetivo para passar de fase no jogo e também para completá-lo. Agora, apenas para deixar o jogo mais bonito, coloque o seguinte código no Create event do ovo_de_dragao:
image_speed =0
image_index = room //Agora o ovo ficará com uma subimagem, ou seja, uma cor diferente em cada room
E então crie um Collision event com o objeto jogador:
if (room != room_last) //Se não for a última sala
{
show_message("Você conseguiu! Vamos para a próxima!") //Mensagem de sucesso
room_goto_next() //Próxima sala
}
else//Mas se for...
{
show_message("Você pegou todos os ovos de dragões! Obrigado por jogar!") //Mensagem final
game_end() //Fim de jogo
}
8.Considerações finais:

Bom pessoal, é isso. Aí está um tutorial fácil de entender, rápido de se fazer e que nos garante um jogo bem simples estilo Top-down.

Não se esqueça de preencher as informações do jogo e se quiser, adicionar um Menu nele para ficar mais completo.


Se for copiar, ao menos cite a fonte!


Valeu! E até a próxima!

38 comentários:

  1. Olá amigo... procurei no forum do game maker mas não encontrei ... quem sabe vc me ajuda...
    Quero saber como faço para parar o background em um certo espaço do room? MEU back tem 800x1000 e minha room 800X6000. Uso views. Como o back se repete para completar nao sei como fazer.

    ResponderExcluir
    Respostas
    1. Opa, desculpe a demora. Bem, você tem duas opções: ou sobrepor o Background no lugar que você quer que ele pare com outro background, ou utilizar os Tilesets e colocar o Background manualmente. Essas sãos as opções que eu tenho conhecimento.

      Excluir
  2. Muito legal seus comentários. Comprei recentemente o game maker studio, por sinal muito legal mesmo. Queria te perguntar sobre uns detalhes:
    Por exemplo, como faco para um ojteto tipo guerreiro só poder atirar uma certa quantidade de flechas por fase. Eu ja fiz ele atirar, agora preciso limitar as flechas por fase. Quero que assim que comece outra fase o numero de flechas volte como de inico: por ex: 800 flechas por fase.
    E outra, como posso fazer com que seu escudo tb so possa receber um tanto limitado de tiros dos inimigos. Se passar de um certo numero o escudo suma (de preferencia que pisque por 5 segundos para indicar que esta sumindo e entao desapareca).
    VALEU PELA AJUDA.
    PAULO.

    ResponderExcluir
    Respostas
    1. Simples. No ataque dele, simplesmente coloque uma condição:

      if flechas >0
      {
      flechas -=1//Tira uma flecha da contagem
      //O resto do código ataque acontece vem aqui
      }

      E no evento "room start" do próprio jogador, coloque:

      flechas = 800//Isso vai acrescentae 800 flechas toda vez que uma fase começar.

      No caso do escudo, você só precisa colocar uma energia dele, por exemplo, no "create event" coloque:

      energia =100//A energia do escudo
      delay =60//Esse valor vai fazer o escudo piscar

      E no step event:

      if energia <0
      {
      delay -=1//Começa a contagem regressiva pro escudo sumir...
      visible=choose(0,1)//Faz o escudo piscar aleatóriamente... esse é um método
      }

      if delay <0//Se o delay for menor que 0...
      instance_destroy//O escudo some.



      Espero ter ajudado!

      Excluir
  3. Estou fazendo um jogo tipo TOP DOWN. Meu back tem vspeed=1. Nas laterais coloquei objetos rochas. Para que elas acompanhassem o back tive que colocar vspeed=1 nelas tb. Mas aí que está o problema. Quando o player colide com elas, as mesmas se movimentam. Nas laterais consegui resolver aumentando a mascara dos objetos rocha, mas quando o player entra por "baixo" acaba arrastando as rochas. Gostaria que esses objetos não se mexessem quando colidissem com o player. Acredito que o problema esteja no fato de eu ter colocado os objetos na mesma velocidade do back, caso contrario não estariam se deslocando para baixo.
    Pode me ajudar nisso?

    Outra coisa, percebi que explica muito bem; tenho pensado em elaborar um site exclusivo para dicas(tenho GMSTUDIO e tenho uma pequena equipe aprendendo comigo), orientaçoes, tudo que diz respeito ao GAME MAKER STUDIO. Sei que já existe um ótimo forum, mas acredito que conseguiríamos fazer algo diferente e muito didático. Percebo que muitas pessoas são carentes de mais informações. Vc teria um tempo para estar postando matérias e ajudando nas dúvidas da galera?
    Poderiamos conversar melhor? meu email: gustavo12g@yahoo.com.br

    GUSTAVO MARC

    ResponderExcluir
    Respostas
    1. Olá Gustavo!

      Bem, sem entender o que você planejava fazer, fica difícil localizar o verdadeiro problema e achar a solução. Considerando que você disse que o Background se move na Vspeed =1 e as paredes também, posso dizer que você quer fazer um jogo onde a tela se movimenta sozinha na direção para baixo.

      Bem, para resolver esse problema, ou seja, quando o jogador colidir com uma parede e a parede "segurar" o jogador, mas ao mesmo tempo continuar acompanhando o background, basta colocar no STEP EVENT do Jogador (de preferência):

      if place_meeting(x,y,obj_parede)
      y+=1//coloque aqui a mesma velocidade da parede, nesse caso 1.


      Ps: anotei seu e-mail. Se quiser apagar o comentário para manter ele seguro, vá em frente :]

      Excluir
    2. Não se esqueça de retirar os códigos do Collision Event da parede com o jogador, se tiver algo importante, adicione assim:

      if place_meeting(x,y,obj_parede)
      {
      y+=1//coloque aqui a mesma velocidade da parede, nesse caso 1.
      //Resto do código aqui.
      }

      Excluir
  4. Muito obrigado por sua resposta. Acredito que não coloquei com clareza minha ideias:
    No create do objeto_player está: image_speed = 3/room_speed
    No back: vspeed=1 (Sim ele se desloca para baixo, tipo o antigo jogo knightmare do msx, só pra vc ter uma referencia)
    O objt_pedra tb tem vspeed=1
    O que quero é que o obj_player, quando se chocar com o obj_pedra(por baixo) seja contido e empurrado para baixo com a mesma vspeed=1 do mesmo. Ele entao precisaria contornar o obj_pedra para passar.
    Aguardo seu contato para discutirmos a questao do site.
    Muito Grato... GUSTAVO MARC

    ResponderExcluir
  5. Desculpe... agora entendi, funcionou perfeitamente, pode desconsiderar o que escrevi acima. Apenas mais uma dúvida, abusando um pouco, como faria para que o player saisse por exemplo da margem direita da view e aparecesse na margem esquerda na mesma horizontal. Já vi isso em alguns jogos. Seria um recurso interessante.

    ResponderExcluir
    Respostas
    1. Existe um evento pronto de Drag'n'Drog (ícones) no Game Maker que está na primeira aba, ele se chama "Wrap Screen". Daí basta você selecionar "Wrap horizontaly" e pronto.

      Se quiser fazer isso, mas com código, tente colocar o seguinte código no evento Other > Outside Room

      if x <0
      x = room_width-4;
      else
      x = 4;

      Até mais!

      Excluir
    2. Mas... voltando um pouco na questão da pedra empurrar o jogador para baixo, eu desconsiderei que o obj_jogador pode ter provavelmente uma velocidade para cima (direção oposta), o que pode ofuscar o efeito da pedra empurrar ele para baixo.

      Nesse caso, não se esqueça de adicionar a seguinte condição no seu evento para cima (provavelmente está no Keyboard UP):

      if !place_meeting(x,y,obj_parede)//se NÃO tiver uma pedra colidindo com o jogador...
      {
      vspeed =(-2)//...adiciona velocidade para cima.
      }

      Obs: se o jogador não vai para cima, apenas para os lados, desconsidere esse comentário :]

      Excluir
  6. Fico até sem jeito de pedir mais ajuda... agradeço imensamente a gentileza de compartilhar conosco seu conheciemnto. Muito obrigado, meu e de mais 10 pessoas. Estamos desenvolvendo um grande projeto com o GAME MAKER STUDIO. Sempre achei que muitos dos jogos desenvolvidos no Brasil necessitavam de melhor elaboração e principalmente (fundamentalmente) desenhos de muita qualidade e originalidade. Temos na equipe um desenhista fantástico, e na programação estamos estudando muito. Percebo a dificuldade das pessoas em obterem informações, principalmente na prática, daí minha ideia de estar compartilhando o conhecimento, somando forças através de um site.
    Seria uma imenso prazer ter vc como um dos colaboradores desse fututo site.
    Mais uma vez muito obrigado, e de vez em quando vamos incomodá-lo com algumas dúvidas :) Se nos permitir.
    Gustavo, Carlos, Roberto, Taisa, Paulo, Erika, Adriana, José, Milton, Clara.

    ResponderExcluir
    Respostas
    1. Disponha... logo, quando eu puder, entrarei em contato. Embora esteja ocupado com outras coisas, atualmente estou trabalhando em um projeto também :]

      Logo estarei disponibilizando uma versão beta, e pretendo colocar o open source do jogo, para quem quiser editar e estudar minha forma de programação com GML.

      Excluir
  7. Tenho duas dúvidas e gostaria de uma ajuda sua:
    1) queria saber como faço para que meus obj_inimigos possam atacar (meu jogo e top down) variando seus movimentos até chegarem no player. Eles possuem vspeed=1. Eles devem atacar verticalmente para baixo. Saindo de cima e desaparecendo em baixo. Talvez usando paths? Nunca usei. Poderia ser algo assim. Eles apareciam em cima; faziam um moviemnto em zig-zague por exemplo e sumiam em baixo. Outra hora, com outro tipo de inimigo mais inteligente; ele saia de cima; em movimentos diversos; e quando percebesse o player partiria para cima dele.

    2)Imagina um jogo de nave. Que usa as setas para direcionar e a barra de spaco para atirar. Ok. Quero fazer esse jogo para androide. Muito bem. Ai faco os comandos para obedecerem o mouse. OK. MAS E NO CASO DO TIRO COM A BARRA DE ESPAÇO. Como faria para funcionar no tablet? O que devo usar na programacao do GM para gerar o tiro, já que o tablet usa o toque?

    Valeu pela ajuda... Manoel f.

    ResponderExcluir
    Respostas
    1. Não tenho certeza, não procurei saber ainda como funciona programações em outras plataformas :/

      Eu não recomendo o uso de Paths, eles são bem pouco proveitosos.

      Já no caso da IA variada, bem... Você terá que criar partes por partes. Por exemplo, um inimigo tem (no step event):

      {
      vspeed=1
      if distance_to_object(obj_jogador) <=32
      instance_create(x,y,obj_tiro)
      }

      ...e o outro (o mais inteligente):

      -STEP EVENT:
      {
      vspeed=2
      if distance_to_object(obj_jogador) <=64
      instance_create(x,y,obj_tiro)
      }

      -CREATE EVENT:
      alarm[0]=35

      -ALARM 0:
      {
      direction = random_range(225,315)
      alarm[0]=30
      }

      Vá aprimorando suas táticas, isso é só um exemplo básico :)

      Excluir
  8. Ok, valeu... so acrescentando... como faria para que os inimigos tivessem uma trajetoria em zig-zague até chegar embaixo(movimento vertical para baixo) fora da room? Só consegui fazer isso atraves de paths.

    ResponderExcluir
    Respostas
    1. Usando Alarms dá pra fazer tranquilo:

      CREATE EVENT:
      {
      alarm[0]=30//30 = 1 segundo, 60 = 2 segundos 90 = 3...
      direction = choose(225,315)
      speed = 2//Ou qualquer outro valor...
      }

      ALARM 0:
      {
      direction = 225
      alarm[1] =30
      }

      ALARM 1:
      {
      direction = 315
      alarm[0] =30
      }

      Excluir
  9. Amigo Doritos... muito bacana seu guia... mas te peço um grande favor, sem querer incomodá-lo mais uma vez... mas só vc memso pra nos ajudar.
    Estou precisando saber como faço para que:

    OBJ_INIMIGO... qo qual no create event possua um som qualquer.
    Como faço para que esse som só seja ativado quando estiver entrando na view?
    Jogo tipo top down. Velocidade vertical. vspeed=1.
    Prometo não incomodar mais.. Muito Grato.

    Gustavo, Carlos, Roberto, Taisa, Paulo, Erika, Adriana, José, Milton, Clara.

    ResponderExcluir
    Respostas
    1. Olá amigo, não precisa se preocupar, respondo quando eu puder e não é de nenhum incômodo!

      É bem simples. Você pode usar vários artifícios para isso, mas a que eu acho mais fácil é a seguinte:

      Create event do obj_inimigo:
      var_som = false;

      Step Event do obj_inimigo:
      if var_som = false and y > view_yview[0]
      {
      sound_play(meu_som_alterar);//Altere o nome do som dentro dos parênteses
      var_som = true;
      }

      Excluir
  10. Infelizmente não deu certo. Deixa eu explicar melhor. Tenho uma view de 1000x640. Quando coloco o inimigo fora dessa viu e dou um run para executar, o som começa a tocar mesmo antes dele entrar na view. Queria que esse som só começasse no momento que ele entrasse na view. Esse inimigo tem vspeed=1 de forma a acompanahr a movimentacao do back.
    Será que seria possível?
    Gustavo

    ResponderExcluir
    Respostas
    1. O unico erro que eu consegui imaginar é que a view que você está usando não é a view "0". Se for o caso, tente alterar "if var_som = false and y > view_yview[0]" << esse 0 para o número da view que você está utilizando.

      Excluir
    2. Por exemplo, "if var_som = false and y > view_yview[1]" ou "if var_som = false and y > view_yview[7]"

      Excluir
  11. VALEU OBRIGADO :))))).. DEU CERTO!!! Só mais uma pequena dúvida. A Adriana, perguntou acima, mas não entendi bem sua resposta.
    Meu back se move com vspeed=1 OK. Jogo top down. O player se desloca para cima em sentido oposto. Em um certo ponto(final do back (final da fase)) chega uma porta onde um inimigo esta guardando-a. Eu gostaria que esse background parasse a certa distancia dessa porta para que haja o confronto entre o player e o inimigo que guarda a porta. Aí entao, após ter vencido o inimigo o player possa passar pela porta.
    Como o back se move constantemente, não estou conseguindo faze-lo parar em determinada posicao.
    Pode me ajudar?

    ResponderExcluir
  12. So acrescentando: Meu back tem 1000x1000, entao para completar usei tiles, pois minha room tem 1000x8000. Talvez aí esteja o problema.
    Aproveitando, e abusando, quando meu inimigo lanca um poder ele é criado e sai de traz do obj_inimigo. Dando a impressao que esta sendo lancado de suas costas. Como faria para que esse obj_poder fosse aparecesse na frente do obj_inimigo quando for disparado. Tenho tido esses problemas quando coloco elementos na room(back). Os inimigos costumam passar por debaixo dos obstaculos e nao por cima.

    ResponderExcluir
    Respostas
    1. Bem, vamos por partes.

      Para o seu background parar quando o fim da fase acontece (que eu acredito que seja quando a view/player esteja no topo máximo da room) você pode colocar no Step Event de qualquer objeto (o obj_player que seja) o seguinte:

      if view_yview[coloque_o_numero_da_view_aqui] <=0
      {
      background_vspeed[coloque_o_numero_do_bg_aqui] =0;
      }

      Já o poder do obj_inimigo, você é só você mandar criar ele um pouco abaixo do inimigo, por exemplo:
      instance_create(x,y+64,obj_poder)//+64 é só um exemplo, coloque-o mais/menos se precisar. Lembrando que quanto maior esse número for, mais para baixo o poder será criado.

      Já o caso dos inimigos passarem por baixo dos obstáculos, deve ser problemas com Depth. Quanto mais depth o objeto tem, mais 'embaixo' ele fica. Colocar menos depth nos inimigos do que nos obstáculos deve resolver o problema.

      Excluir
  13. Valeu muito pela ajuda.. muito obrigado!
    Mas não consegui que o back parasse.
    Talvez entenda melhor com esse link : quero que aconteca exatamente isso. No final de cada fase tem um chefao inimigo. (http://www.youtube.com/watch?v=CFglKPvQmN4)
    Vc vai perceber que a vspeed dele pára pouco antes da porta para outra fase .. para que o combate aconteca.. so depois ele passa da porta. No meu caso meu back é 1000X1000. Como a room e 1000x8000, as tiles completaram multiplicando os backs para preencher toda room.

    ResponderExcluir
    Respostas
    1. Eu entendi perfeitamente o que você quer. Jurava que o código que eu passei iria funcionar. Ainda preciso saber de algumas coisas:

      - O obj_jogador começa na parte inferior da fase? Se sim, o Boss que estamos falando provavelmente está no topo. Ele é criado quando o jogador chega no local da batalha ou já foi colocado lá?

      - Alguma view segue o player? Se sim, de qual view estamos falando? (0...7?).

      - Você disse que o obj_jogador segue na vspeed de -1, ele segue nessa velocidade sozinho ou é necessário pressionar algum botao (como a seta para cima) para que ele movimente?

      Excluir
  14. 1) Sim começa na parte inferior. O boss já fpo colocado lá( só partindo para a ação quando estiver dentro da view.

    2)nenhuma view segue o player. No seu create event esta: image_speed = 3/room_speed.

    3)Acho q talvez não tenha explicado direito. Não uso setas para movimenta-lo. Na tela de background a vspeed esta marcada como 1. A medida que o cenário se desloca para baixo, ele fica dentro da view, e posso sim movimenta-lo um pouco mais para cima ou para baixo usando a setas(como no video que te mandei).

    Eu resolvi da seguinte forma, mas acho q teria outra melhor: coloquei um objeto controle em certo ponto perto do topo. Então pedi para que o back parasse quando o obj controle estivesse a um valor x do objeto jogador. Aí deu certo. Vi tb algo assim no forum mas não entendi bem: if !(view_yview[0]=room_height-view_hview[0])
    { view_yview[0]+=1; }

    Aproveitando de sua boa vontade em me ajudar:

    1)Vc acha que eu poderia colocar a musica de fundo em wave mesmo apesar de mais pesado? Parece q em mp3 o gms nao lê bem. Pergunto pq em midi a musica que eu criei nao fica boa, pois nao consegui converte-la com qualidade.

    2)Vc ensina no tutorial como colocar os pontos e as vidas na tela, mas como eu colocaria tb qual fase o jogo está?

    ResponderExcluir
    Respostas
    1. O código que você achou no fórum faz exatamente a mesma coisa do que eu te passei, mas só funcionam na base de views que provavelmente seguem o player. Mas se você encontrou uma outra maneira de fazer isso e ficou satisfeito, não tem problema.

      1) Nunca e jamais use wave como BGM. Wave é um formato especificamente para sons curtos, de no máximo 15~20 segundos. Ele é insanamente pesado, muito mais que um arquivo mp3. O problema é que realmente o GM não lê mp3 e pede ajuda à algum programa que possa reproduzir para ele o som, por isso formatos MIDI são os mais recomendáveis.

      2) Só você criar uma váriável global (como global.fase =1, global.fase =2,global.fase =3) no create event de todas as rooms das fases. Depois no obj_interface, coloque um {draw_text(x,y,"Fase: "+string(global.fase)}

      Excluir
  15. Mais uma vez muito obrigado pela ajuda, tem sido de muita valia.
    Nome momento to com um problema:
    Tenho um obj_player que atira flechas. Ok.
    Seu número de flechas e limitado por fase. Ok
    O que eu queria era mudar a opção de flechas criando outros tipos.
    Isso eu faco usando sprite_index OK.
    Aí é que está a questão: Essas outras flechas possuem carcterísticas diferentes. Uma de fogo por exemplo. Então deveria causar mais estrago nos inimigos do que a normal que começa com ele. Por exemplo, para ele destruir um bola de espinhos: com a flecha normal ele precisaria de 4 tiros , mas com a de fogo poderia ser 2. Além disso, quando ele estivesse com a flecha normal ele teria um limite por fase de 500 flechas por ex, mas se ele optasse por pegar outro tipo esse limite diminuisse. Por exemplo, ele usou 100 flechas normais. Depois que pegou a de fogo, em vez de ele ter 400 restantes ele ficaria com 300 restantes.
    Só para te orientar, ele vai trocar de flecha toda vez que encontrar com certo objeto.
    Gostaria de fazer isso para várias flechas como opção. Quanto mais poderosa ela fosse, menos exemplares dela poderiam ser atirados, já q o estrago seria maior.

    ResponderExcluir
  16. Isso acima é o que gostaria, mas primeiramente não consigo mudar a flecha que começa atirando por outra. Que o player colida com um objeto e a flecha troque. Tentei sprite_index mas ela não mudou.

    NO create esta: pode_atirar=true
    flechas=10

    no :

    if pode_atirar = true
    {instance_create(x,y,flecha_1)
    pode_atirar = false
    alarm[0] =10}

    No alarm[0]:

    pode_atirar = true
    if flechas >0
    {flechas-=1
    pode_atirar=true}
    else
    {pode_atirar=false}

    ResponderExcluir
    Respostas
    1. ******esse no: acima quer dizer quando aperto a tecla space.

      Excluir
    2. De certa forma isso é fácil. Faça o seguinte:

      No Create do obj_jogador, coloque:

      {
      var_minha_flecha = flecha_1;
      var_limite_de_flechas = 300;
      }

      No código de atirar flecha, troque o instance_create (instance_create(x,y,flecha_1)) por este:

      instance_create(x,y,var_minha_flecha);

      Nos itens que substituem as flechas do jogador, coloque o seguinte:


      //Flechas normais
      {
      obj_jogador.var_minha_flecha = flecha_1
      obj_jogador.var_limite_de_flechas = 300//escolha um valor diferente para cada flecha
      instance_destroy()
      }

      Faça isso com todos os itens que alteram a flecha do obj_jogador. Já no Step Event do obj_jogador, coloque:

      if var_municao > var_limite_de_flechas
      var_municao = var_limite_de_flechas.

      Excluir
  17. Tenho tentado fazer um PAUSE para meu jogo mas ainda não consegui. Eu queria que quando eu apertasse um certo botaõ que fica na tela o jogo pausasse, ficando o jogo paralisado nesse instante. Então aparecesse alguns botoes em cima dessa mesma tela indicando: voltar ao jogo, ou ir para o menu principal.
    Logo após clicasse em voltar o jogo, o mesmo se reiniciasse do ponto que parou.ISSO seria possível fazer? Como?

    Agradeceria muito se puder me ajudar.

    Agradecido desde já...
    MIGUEL

    ResponderExcluir
  18. Só tenho uma duvida, o que é top down?

    ResponderExcluir
    Respostas
    1. Um jogo que você pode andar pra cima, baixo, esquerda e direita. Você joga como se estivesse olhando de cima para baixo.

      Excluir
  19. alguem pode me ajudar ?? eu nao consigo achar esse create event na room .. onde fica ???

    ResponderExcluir
    Respostas
    1. Fica na aba Settings da própria room, no botão "Creation Code".

      Excluir

Dúvidas? Pergunte!
Ajudou? Agradece!
:]