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:
No movimento, pela lógica você não vai pressionar esquerda e direita ao mesmo tempo, então melhor usar um if-else.
Step:
Agora no tiro. Nunca use = para checar algo em uma condição, use ==, mas como o == true é implícito podemos omiti-lo.
Agora que atirando é true, temos que voltar pra false quando acabar a animação de tiro. Então no evento Other-> Animation End coloque:
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:
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
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ó
Tiro de um lado só
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?
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ó
Já não tinha lhe dito pra entrar em contato pra trocar de nick? Qual teu nome?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.
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;
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;
}
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;
}
}
Código: Selecionar todos
if sprite_index == spr_player_ataque
{
atirando = false;
}
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;
}
}
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ó
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.
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante