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
» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18

» Retorno da GMBR!!!
por Isquilo_Roedor Sex 16 Fev 2024, 16:58

» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34

» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13

» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18

» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12

» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02

» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55

» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42

» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56

» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49

» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21

» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21

» Asteroid Core - Early Acesse Update [0.2.0.0]
por JOZ. Seg 08 Jan 2024, 14:39

» Versionamento de código com GitHub
por GabrielXavier Seg 08 Jan 2024, 07:32

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por kolesovsup Sex 29 Dez 2023, 07:16

» a funçao approach ainda existe?
por PEDRINDEV Ter 26 Dez 2023, 20:05

» Inimigo ataca até por trás! >:(
por saim Sex 22 Dez 2023, 08:55

» [RESOLVIDO]Spawn após morte
por Deception_1999 Dom 17 Dez 2023, 16:39

» Remunerado $$$ - Procuro programador para ajudar a "montar" um jogo
por theguitarmester Sáb 02 Dez 2023, 16:28

» Game maker nao abre
por Cerf Dom 26 Nov 2023, 12:01

» !AJUDA Como fazer um cronometro
por Cerf Dom 26 Nov 2023, 11:58

» Inimigo atira
por Galinho Qui 23 Nov 2023, 14:57

» Evoluship [0.1.4.3] (DevLog)
por JOZ. Qua 22 Nov 2023, 11:17

» [Resolvido]Erro na máquina de estados
por GabrielXavier Ter 21 Nov 2023, 15:26


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 : 40
Número de Mensagens : 399
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 : 40
Número de Mensagens : 399
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 : 40
Número de Mensagens : 399
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