Página 1 de 1

Tiro de um lado só

Enviado: Qua Dez 26, 2018 2:58 pm
por 186557
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?

Re: Tiro de um lado só

Enviado: Qua Dez 26, 2018 4:12 pm
por All-x
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

Re: Tiro de um lado só

Enviado: Dom Jan 06, 2019 1:15 am
por 186557
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.