Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

Tiro de um lado só

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
186557
Programador
Programador
Reações: 0
Mensagens: 28

Tiro de um lado só

Mensagem por 186557 » Qua Dez 26, 2018 2:58 pm

Isso é algo meio "especifico", basicamente eu queria fazer o player atirar para esquerda e direita, quando o player vira para a esquerda e atira, o tiro é acionado normalmente mas quando o player se vira para a direita o tiro sai para a esquerda, tiro só sai para direita se o player estiver andando para a direita. Eu sei é um tanto confuso mas acho que dá pra entender, se quiserem eu tento explicar mais detalhadamente.

Pra ajudar eu tentei usar duas variaveis (me corrijam se eu estiver errado) no Create do player:

esquerda = true {direita = false}
direita = true {esquerda = false}

E no Step eu coloquei nos codigos de movimento a variavel para que ela mude de acordo com a direção que o player esta olhando ou andando:

if esquerda = true {direita = false}
if direita = true {esquerda = false}

if keyboard_check(vk_right) {
xspeed = 5;
direita = true;
sprite_index=spr_player_d1;image_speed=0.4
}
else if keyboard_check(vk_left) {
xspeed = -5;
esquerda = true;
sprite_index=spr_player_e1;image_speed=0.4
}

if keyboard_check_released(vk_right){
xspeed = 0;
direita = true;
sprite_index=spr_player_d2
}

if keyboard_check_released(vk_left){
xspeed = 0;
esquerda = true;
sprite_index=spr_player_e2
}

E por fim os tiros que pra cada direção tem uma variavel de acordo com a direção que o player esta olhando ou andando:

if keyboard_check_pressed(ord("X"))
{
    if direita = true {
    sprite_index=spr_ataque
    abc = instance_create(x,y,obj_bola)
    abc.direction = direction
    abc.image_angle = direction
    abc.speed = 8
    firecounter=0
    }

    else
    if esquerda = true {
    sprite_index=spr_ataque
    abc = instance_create(x,y,obj_bola)
    abc.direction = direction
    abc.image_angle = direction
    abc.speed = -8
    firecounter=0
    }
}

Oque tem de errado com esses codigos? Eu cometi algum erro com as variaveis?

Avatar do usuário
All-x
Administrador
Administrador
Reações: 8
Mensagens: 621
Localização: Dourados-MS

Contato:

Re: Tiro de um lado só

Mensagem por All-x » Qua Dez 26, 2018 4:12 pm

EDIT:

Agora que vi que tu já tinha um tópico sobre isso: viewtopic.php?f=114&t=2065

Por favor evitar criar vários tópicos sobre o mesmo assunto.

Como li no tópico acima, tem ainda a questão do pulo. Na minha resposta abaixo não considero isso. Então crie mais um estado chamado pulando e adapte o código. Se não conseguir, considere ler mais sobre GML e lógica de programação.
Já não tinha lhe dito pra entrar em contato pra trocar de nick? Qual teu nome?

Vamos por partes.

Elimine uma das variáveis, pois se direita é falso, subentende-se que seja esquerda.

Se a variável direita é true, significado que é o lado direito. Se é false, significa que é o lado esquerdo. lógica simples. Aproveite e adicione uma variável para o estado de atirar.

Create:

Código: Selecionar todos

direita = true;
atirando = false;
No movimento, pela lógica você não vai pressionar esquerda e direita ao mesmo tempo, então melhor usar um if-else.

Step:

Código: Selecionar todos

// Direita
if keyboard_check(vk_right)
{
	xspeed = 5;
}
// Esquerda
else if keyboard_check(vk_left) 
{
	xspeed = -5;
}
// Parado (Não é esquerda nem direita)
else
{
	xspeed = 0;
}
Agora no tiro. Nunca use = para checar algo em uma condição, use ==, mas como o == true é implícito podemos omiti-lo.

Código: Selecionar todos

if keyboard_check_pressed(ord("X"))
{
	var abc = instance_create(x,y,obj_bola);
	firecounter = 0;
	atirando = true;
	
	if direita
	{
		abc.hspeed = 8;
	}
	else
	{
		abc.hspeed = -8;
	}
}
Agora que atirando é true, temos que voltar pra false quando acabar a animação de tiro. Então no evento Other-> Animation End coloque:

Código: Selecionar todos

if sprite_index == spr_player_ataque
{
	atirando = false;
}
Outra coisa boa a se seguir é só mudar as sprites depois de fazer os movimentos. Tu não disse qual sprite é qual, mas imagino que o 1  no final do nome é pra sprite em movimento e 2 para sprite parada.

Ainda no Step:

Código: Selecionar todos

// Sprite Andando (Velocidade maior que zero)
if abs(xspeed) > 0
{
	if direita
	{
		sprite_index = spr_player_d1;
		image_speed = 0.4;
	}
	else
	{
		sprite_index = spr_player_e1;
		image_speed = 0.4;
	}
}
// Sprite parado (Velocidade não é maior que zero)
else
{
	if direita
	{
		sprite_index = spr_player_d2;
	}
	else
	{
		sprite_index = spr_player_e2;
	}
}
Ou seja, se não está atirando está andando, se não estiver andando, então está parado.

Da pra diminuir o código, porém seria mais difícil de entender. Estude lógica de programação (MUITO), máquina de estados e o básico da linguagem GML pra evitar incoerências. E também sobre as variáveis internas de movimento (direction, speed, hspeed e vspeed).

Abraços
Começando com o Game Maker? Olhou para assinatura certa!

Imagem

Tutoriais e vídeo aulas de programação! Clique no Banner e confira!

Avatar do usuário
186557
Programador
Programador
Reações: 0
Mensagens: 28

Re: Tiro de um lado só

Mensagem por 186557 » Dom Jan 06, 2019 1:15 am

Obrigado, funcionou. Sobre o nome acho que vou deixar assim mesmo, de certa forma me acostumei haha. Mas onde exatamente posso ler sobre GML? Não quero parecer que estou com duvidas idiotas ou algo do tipo.

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante