GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Entrar

Esqueci-me da senha

Últimos assuntos
» player não consegue andar
por 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


Inimigo atira

2 participantes

Ir para baixo

Inimigo atira Empty Inimigo atira

Mensagem por Galinho Qua 22 Nov 2023, 16:26

opa tudo bom então ,eu quero fazer que se o meu obj player chegar a uma certa distancia do meu inimigo o meu inimigo vai atirar na direção em que meu player esta e depois que meu inimigo atiro uma vez ele só pode atirar novamente após um determinado tempo estou tentando fazer isso já faz 3 semanas e ate agora não consegui alguém pode por favor me ajudar?
Galinho
Galinho

Games Ranking : Sem avaliações

Data de inscrição : 22/11/2023
Reputação : 0
Número de Mensagens : 4
Prêmios : Inimigo atira Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker Studio 2.0


Galinho gosta desta mensagem

Ir para o topo Ir para baixo

Inimigo atira Empty Re: Inimigo atira

Mensagem por GabrielXavier Qui 23 Nov 2023, 08:18

Olá, vou te dar um exemplo de como fazer!

Primeiro, adicione as seguintes variáveis ao seu objeto obj_inimigo para controlar o tempo entre os tiros:
Código:

// Create Event de obj_inimigo
tempo_entre_tiros = 60; // 60 frames entre cada tiro
tempo_ate_proximo_tiro = 0;

distancia_maxima = 200; // Defina a distância máxima desejada

velocidade_tiro = 5; // Define a velocidade que o tiro vai sair
recuo_tiro = 5; // Define a variação do tiro, quanto maior mais ruim a mira do inimigo, se for 0 o inimigo vai atirar exatamente na direção do player no momento do tiro

Agora, no evento Step de obj_inimigo, adicione o seguinte código para verificar a distância entre o inimigo e o jogador, e atirar apenas quando o jogador estiver a uma certa distância:
Código:

// Step Event de obj_inimigo

// Verifica se o jogador está a uma distância específica
if (point_distance(x, y, obj_player.x, obj_player.y) < distancia_maxima) {

    // Verifica se já passou tempo suficiente para atirar novamente
    if (tempo_ate_proximo_tiro <= 0) {

        // Código para atirar
        
        var recuo = irandom_range(-recuo_tiro, recuo_tiro); // Define um valor aleatorio entre -5 e 5 (que vai ser usado em graus para adicionar um recuo aleatorio na direção do tiro)
        var inst = instance_create_layer(x, y, "Instances", obj_tiro); // Substitua obj_tiro pelo nome do seu objeto de tiro, substituir "Instances" pelo nome da layer que você está usando na sua room
        inst.speed = velocidade_tiro; // Defini a velocidade da bala
        inst.direction = point_direction(x, y, obj_player.x, obj_player.y) + recuo; // Define a direção do tiro

        // Reseta o tempo até o próximo tiro
        tempo_ate_proximo_tiro = tempo_entre_tiros;
    }
}

// Reduz o tempo até o próximo tiro a cada frame
tempo_ate_proximo_tiro -= 1;

Essa é a forma mais básica de criar um tiro, não cheguei a testar o código, mas em teoria é assim que funciona.

Você pode ajustar a velocidade do tiro, o recuo do tiro e a distância mínima que o inimigo vai começar a atirar no player, você deve substituir os nomes dos objetos do exemplo pelos nomes reais de cada objeto referente ao seu projeto.

Você deve adicionar o código `instance_destroy()` no obj_tiro no evento onde esse objeto sai da tela do jogo para que ele não fique vagando infinitamente pelo seu jogo e consumindo recursos.
Isso deve ser feito no evento em que o objeto tiro sai da view ou então no evento em que ele sai dos limites da sala do jogo.

Ou dependendo do seu jogo, ele pode ser destruído após percorrer uma determinada distância em píxeis desde o ponto em que foi criado.

Maiores informações sobre as funções usadas no exemplo:

point_distance()
point_direction()
irandom_range()
instance_create_layer()


Qualquer dúvida, não se hesite em perguntar!
GabrielXavier
GabrielXavier

Games Ranking : Nota A

Notas recebidas : A
Data de inscrição : 25/02/2012
Reputação : 45
Número de Mensagens : 403
Prêmios : Inimigo atira Empty

Medalhas x 0 Tutoriais x 1 Moedas x 0

Ouro x 0 Prata x 1 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker Studio 2.0


Galinho gosta desta mensagem

Ir para o topo Ir para baixo

Inimigo atira Empty Re: Inimigo atira

Mensagem por Galinho Qui 23 Nov 2023, 12:57

GabrielXavier escreveu:Olá, vou te dar um exemplo de como fazer!

Primeiro, adicione as seguintes variáveis ao seu objeto obj_inimigo para controlar o tempo entre os tiros:
Código:

// Create Event de obj_inimigo
tempo_entre_tiros = 60; // 60 frames entre cada tiro
tempo_ate_proximo_tiro = 0;

distancia_maxima = 200; // Defina a distância máxima desejada

velocidade_tiro = 5; // Define a velocidade que o tiro vai sair
recuo_tiro = 5; // Define a variação do tiro, quanto maior mais ruim a mira do inimigo, se for 0 o inimigo vai atirar exatamente na direção do player no momento do tiro

Agora, no evento Step de obj_inimigo, adicione o seguinte código para verificar a distância entre o inimigo e o jogador, e atirar apenas quando o jogador estiver a uma certa distância:
Código:

// Step Event de obj_inimigo

// Verifica se o jogador está a uma distância específica
if (point_distance(x, y, obj_player.x, obj_player.y) < distancia_maxima) {

    // Verifica se já passou tempo suficiente para atirar novamente
    if (tempo_ate_proximo_tiro <= 0) {

        // Código para atirar
        
        var recuo = irandom_range(-recuo_tiro, recuo_tiro); // Define um valor aleatorio entre -5 e 5 (que vai ser usado em graus para adicionar um recuo aleatorio na direção do tiro)
        var inst = instance_create_layer(x, y, "Instances", obj_tiro); // Substitua obj_tiro pelo nome do seu objeto de tiro, substituir "Instances" pelo nome da layer que você está usando na sua room
        inst.speed = velocidade_tiro; // Defini a velocidade da bala
        inst.direction = point_direction(x, y, obj_player.x, obj_player.y) + recuo; // Define a direção do tiro

        // Reseta o tempo até o próximo tiro
        tempo_ate_proximo_tiro = tempo_entre_tiros;
    }
}

// Reduz o tempo até o próximo tiro a cada frame
tempo_ate_proximo_tiro -= 1;

Essa é a forma mais básica de criar um tiro, não cheguei a testar o código, mas em teoria é assim que funciona.

Você pode ajustar a velocidade do tiro, o recuo do tiro e a distância mínima que o inimigo vai começar a atirar no player, você deve substituir os nomes dos objetos do exemplo pelos nomes reais de cada objeto referente ao seu projeto.

Você deve adicionar o código `instance_destroy()` no obj_tiro no evento onde esse objeto sai da tela do jogo para que ele não fique vagando infinitamente pelo seu jogo e consumindo recursos.
Isso deve ser feito no evento em que o objeto tiro sai da view ou então no evento em que ele sai dos limites da sala do jogo.

Ou dependendo do seu jogo, ele pode ser destruído após percorrer uma determinada distância em píxeis desde o ponto em que foi criado.

Maiores informações sobre as funções usadas no exemplo:

point_distance()
point_direction()
irandom_range()
instance_create_layer()


Qualquer dúvida, não se hesite em perguntar!











oba muito obrigado ajudo demais serio mesmo, porém por algum motivo só funciona o primeiro tiro, tipo quando ele faz o primeiro tiro depois que passa o tempo necessário o outro tiro não sai, e o primeiro tiro também só sai se eu tiver já colocado o meu player na distancia do meu inimigo tipo se eu colocar o meu player fora da distancia em que ele atira se eu chegar na distancia que ele atira ele não atira, se poder me ajudar agradeço muito
Galinho
Galinho

Games Ranking : Sem avaliações

Data de inscrição : 22/11/2023
Reputação : 0
Número de Mensagens : 4
Prêmios : Inimigo atira Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker Studio 2.0


Galinho gosta desta mensagem

Ir para o topo Ir para baixo

Inimigo atira Empty Re: Inimigo atira

Mensagem por GabrielXavier Qui 23 Nov 2023, 13:40

Sem ver o seu código não consigo te ajudar, pois pode depender de outros fatores do seu projeto.

Aqui está um exemplo que escrevi para te mostrar: EXEMPLO

Feito no GMS2.3, o player segue o mouse e a visão do inimigo é representada por um círculo vermelho, sempre que o player entra na visão do inimigo ele dispara contra o player, se limitando a uma vez a cada 60 quadros. No canto esquerdo imprimi algumas variáveis para ver os valores em tempo real.

Se não conseguir resolver e quiser upar seu projeto e me mandar por MP para analisar seu código estou à disposição!
GabrielXavier
GabrielXavier

Games Ranking : Nota A

Notas recebidas : A
Data de inscrição : 25/02/2012
Reputação : 45
Número de Mensagens : 403
Prêmios : Inimigo atira Empty

Medalhas x 0 Tutoriais x 1 Moedas x 0

Ouro x 0 Prata x 1 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker Studio 2.0


Ir para o topo Ir para baixo

Inimigo atira Empty Re: Inimigo atira

Mensagem por Galinho Qui 23 Nov 2023, 14:15

GabrielXavier escreveu:Sem ver o seu código não consigo te ajudar, pois pode depender de outros fatores do seu projeto.

Aqui está um exemplo que escrevi para te mostrar: EXEMPLO

Feito no GMS2.3, o player segue o mouse e a visão do inimigo é representada por um círculo vermelho, sempre que o player entra na visão do inimigo ele dispara contra o player, se limitando a uma vez a cada 60 quadros. No canto esquerdo imprimi algumas variáveis para ver os valores em tempo real.

Se não conseguir resolver e quiser upar seu projeto e me mandar por MP para analisar seu código estou à disposição!












opa tudo bom a única coisa que tem no meu inimigo e um sistema usando switch pra ele der a chance de fica parado ou correndo para ele ficar alterando de estado. Mandei o meu código aqui em baixo para você poder ver também mandei o obj pai do meu inimigo por que vá que seja ele eu acho que não mais nunca se sabe, se conseguir me ajudar agradeço eu já refis esses códigos tantas vezes que já do ficando meio confuso ,eu acho que fiz tudo errado ,eu também tentei ver o exemplo que você me deixou mais não sei como faço para ver só tem as pastas não entendi muito bem.




Código Criar:



// Create Event de obj_inimigo
tempo_entre_tiros = 10; // 60 frames entre cada tiro
tempo_ate_proximo_tiro = 0;

distancia_maxima = 200; // Defina a distância máxima desejada

velocidade_tiro = 5; // Define a velocidade que o tiro vai sair
recuo_tiro = 5; // Define a variação do tiro, quanto maior mais ruim a mira do inimigo, se for 0 o inimigo vai atirar exatamente na direção do player no momento do tiro

// Inherit the parent event
event_inherited();

//personalizando as variaveis
//ele vai decidir se ele pode anda para a direita ou para esquewrda
vel = choose(1, -1);

tempo_decidir_andar = room_speed;


estado = "idle"; //idle, run, power

muda_sprite = function(_sprite)
{
 //checar se eu estou com a sprite certa
 if (sprite_index != _sprite)
 {
sprite_index = _sprite;
image_index = 0;
 }
}


tempo_estado = room_speed * 5;
timer_estado = tempo_estado;




//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Código Etapa:

//se eu bater na parede, eu mudo de direçao
if (place_meeting(x + velh, y, obj_chao))
{
velh *= -1;
}

//se eu nao posso cair então quanto eu for cair eu mudo de direçaor
if (pode_cair == false)
{
if (place_meeting(x + (velh * 10), y + 1, obj_chao) == false)
 {
  //se eu nao posso cair e nao estou tocando no chão na minha frente
 //então eu mudo de direçao
 velh *= -1;
 }

}

velv += grav;

switch(estado)
{
case "idle":
muda_sprite(spr_inimigo_idle_agua);

  velh = 0;
 
 
 
  //diminuindo o timer do estado
  timer_estado --;
  if (timer_estado <= 0)
  {
  estado = choose("run", "idle");
  timer_estado = tempo_estado;
 
  //garanto que se ele foi para o estado de run ele anda
  if (estado == "run")
  {
  velh = choose(-vel, vel);
  }
  }
 
break;

case "run":



muda_sprite(spr_inimigo_run_agua);
   image_xscale = sign(velh);

timer_estado --;
if (timer_estado <= 0)
{
estado = choose("run", "idle", "run");
timer_estado = tempo_estado;
}

break;

}



// Verifica se o jogador está a uma distância específica
if (point_distance(x, y, obj_player.x, obj_player.y) < distancia_maxima) {

   // Verifica se já passou tempo suficiente para atirar novamente
   if (tempo_ate_proximo_tiro <= 0) {

       // Código para atirar
       
       var recuo = irandom_range(-recuo_tiro, recuo_tiro);
       var inst = instance_create_layer(x, y, "shoot", obj_shoot2)
       inst.speed = velocidade_tiro;
       inst.direction = point_direction(x, y, obj_player.x, obj_player.y) + recuo;

       // Reseta o tempo até o próximo tiro
       tempo_ate_proximo_tiro = tempo_entre_tiros;
   }
}

// Reduz o tempo até o próximo tiro a cada frame
tempo_ate_proximo_tiro -= 1;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

OBJ PAI DO MEU INIMIGO

CREATE DELE:

velh = 0;
velv = 0;
vel = 3.5;
grav = .3;

ETAPA DELE:

/fazendo a colisão horizontal
//cehcando se eu estou colidindo com a parade
var _col = instance_place(x + velh, y, obj_chao);
//se eu colidi eu grudo em quem eu colidi
if (_col)
{
//cehcando se eu estou indo para a direita
if (velh > 0)
{
//grudando na parte esquerda da parede
x = _col.bbox_left + (x - bbox_right);
}

//cehcando se eu estou indo para a esquerda
if(velh < 0)
{
x = _col.bbox_right + (x - bbox_left);
}

//uma vez que eu colidi, nao importa o lado, eu paro
velh = 0;

}

x += velh;

var _col = instance_place(x, y + velv, obj_chao);
if (_col)
{
if (velv > 0)
{
//indo para baixo
y = _col.bbox_top + (y - bbox_bottom);
}
if ( velv < 0 )
{
//indo para cima
y = _col.bbox_bottom + (y - bbox_top);
}
velv = 0;
}


y += velv;


//fazendo a colisão horizontal
//cehcando se eu estou colidindo com a parade
var _coli = instance_place(x + velh, y, obj_barreira);
//se eu colidi eu grudo em quem eu colidi
if (_coli)
{
//cehcando se eu estou indo para a direita
if (velh > 0)
{
//grudando na parte esquerda da parede
x = _coli.bbox_left + (x - bbox_right);
}

//cehcando se eu estou indo para a esquerda
if(velh < 0)
{
x = _coli.bbox_right + (x - bbox_left);
}

//uma vez que eu colidi, nao importa o lado, eu paro
velh = 0;

}
Galinho
Galinho

Games Ranking : Sem avaliações

Data de inscrição : 22/11/2023
Reputação : 0
Número de Mensagens : 4
Prêmios : Inimigo atira Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker Studio 2.0


Galinho gosta desta mensagem

Ir para o topo Ir para baixo

Inimigo atira Empty Re: Inimigo atira

Mensagem por GabrielXavier Qui 23 Nov 2023, 14:37

O código dessa forma ficou confuso até para eu entender, não consegui identificar o erro, a única coisa que parece estar errada ali é a função "event_inherited();", você deve declarar ela no início do evento na primeira linha de código e não após escrever algum trecho de código no evento, não sei se pode ser isso que esta causando o erro no seu projeto, mas tem chance de ser.

O projeto de exemplo que te mandei é um projeto completo, só você baixar a pasta inteira do link e abrir com o game maker que você vai ver o projeto, os códigos e se executar vai conseguir ver o exemplo rodando.

Manual: event_inherited();
GabrielXavier
GabrielXavier

Games Ranking : Nota A

Notas recebidas : A
Data de inscrição : 25/02/2012
Reputação : 45
Número de Mensagens : 403
Prêmios : Inimigo atira Empty

Medalhas x 0 Tutoriais x 1 Moedas x 0

Ouro x 0 Prata x 1 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker Studio 2.0


Galinho gosta desta mensagem

Ir para o topo Ir para baixo

Inimigo atira Empty Re: Inimigo atira

Mensagem por Galinho Qui 23 Nov 2023, 14:57

GabrielXavier escreveu:O código dessa forma ficou confuso até para eu entender, não consegui identificar o erro, a única coisa que parece estar errada ali é a função "event_inherited();", você deve declarar ela no início do evento na primeira linha de código e não após escrever algum trecho de código no evento, não sei se pode ser isso que esta causando o erro no seu projeto, mas tem chance de ser.

O projeto de exemplo que te mandei é um projeto completo, só você baixar a pasta inteira do link e abrir com o game maker que você vai ver o projeto, os códigos e se executar vai conseguir ver o exemplo rodando.

Manual: event_inherited();




ok muito obg ajudo demais vó tentar arrumar o código e deixar ele menos confuso Very Happy
Galinho
Galinho

Games Ranking : Sem avaliações

Data de inscrição : 22/11/2023
Reputação : 0
Número de Mensagens : 4
Prêmios : Inimigo atira Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker Studio 2.0


Galinho gosta desta mensagem

Ir para o topo Ir para baixo

Inimigo atira Empty Re: Inimigo atira

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos