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.

animaçao de morte do player Tópico resolvido

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
xxZ3USSSxx
Novato
Novato
Reações: 2
Mensagens: 11

animaçao de morte do player

Mensagem por xxZ3USSSxx » Qua Mai 22, 2024 5:20 pm

Ola ultimamente tenho tendo alguns problemas em criar uma forma de colocar o player no sprite dele morto, queria a ajuda de vcs para resolver esse pequeno problema. Quero que alguem me ajude de alguma forma nisso ou criando um codigo ou me dando um codigo ja existente obg. segue o codigo abaixo:

create:

hspd= 0;
vspd= 0;
vel= 4;
velj= 7;

grv= 0.3;
chao= 0;

estado= "parado";

life_max= 5;
life= 1;

alarm[0]= 0;

step:

var _right, _left, _jump, _atk;

_right= keyboard_check(ord("D"));
_left= keyboard_check(ord("A"));
_jump= keyboard_check_pressed(ord("W"));
_atk= keyboard_check_pressed(ord("J"));

hspd= (_right - _left) * vel;

chao= place_meeting(x,y + 1,obj_wall);

if(!chao){
vspd += grv;
}

switch(estado){
case "parado":
{
sprite_index= spr_player;

if(hspd != 0){
estado= "movendo";
image_xscale= sign(hspd);
}else if(_jump){
vspd= -velj;
estado= "pulando";
}else if(_atk){
estado= "ataque";
image_index= 0;
}

break;
}
case "movendo":
{
sprite_index= spr_player_wlk;

if(hspd = 0){
estado= "parado";
}else if(_jump){
vspd= -velj;
estado= "pulando";
}else if(_atk){
estado= "ataque";
image_index= 0;
}

break;
}
case "pulando":
{
if(vspd > 0){
sprite_index= spr_player_fall;
}else if(vspd < 0){
sprite_index= spr_player_jump;
}

if(chao){
estado= "parado";
}

break;
}
case "ataque":
{
sprite_index= spr_player_atk;

if(image_index > 5){
if(!instance_exists(obj_dano)){
instance_create_layer(x + (25 * image_xscale),y - 12,"Instances",obj_dano);
}
}

if(image_index > image_number - 1){
estado= "parado";
}

hspd= 0;

break;
}
}

if(alarm[0] > 0){
sprite_index= spr_player_hit;
}else{
estado= estado;
}


if(keyboard_check(vk_enter)){
game_restart();
}

endstep:

repeat(abs(hspd)){
if(!place_meeting(x + sign(hspd),y,obj_wall)){
x += sign(hspd);
}else{
hspd= 0;
break;
}
}

repeat(abs(vspd)){
if(!place_meeting(x,y + sign(vspd),obj_wall)){
y += sign(vspd);
}else{
vspd= 0;
break;
}
}

if(life <= 0){
//tentava criar o codigo aqui mas o player ou travava na primeira imagem ou ele iniciava rapido demais ja tentei diminuir a velocidade da animçao mas nao consegui :(

vel= 0;
velj= 0;
}

//nao tem nada no alarme!

colisao com o obj_inimigo:

if(alarm[0] <= 0){
life -= 1;
alarm[0]= 30;
}
Editado pela última vez por xxZ3USSSxx em Qui Mai 23, 2024 8:25 am, em um total de 1 vez.

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 6
Mensagens: 120
Localização: Rio de Janeiro, Brasil

Re: animaçao de morte do player

Mensagem por ValdeciVieira » Qua Mai 22, 2024 5:33 pm

Você usou sprite_index pra mudar pra animação de morte? e tentou mudar velocidade de animação do sprite?
Poste o código que esteve usando.

Avatar do usuário
xxZ3USSSxx
Novato
Novato
Reações: 2
Mensagens: 11

Re: animaçao de morte do player

Mensagem por xxZ3USSSxx » Qui Mai 23, 2024 8:26 am

ValdeciVieira escreveu: Qua Mai 22, 2024 5:33 pm Você usou sprite_index pra mudar pra animação de morte? e tentou mudar velocidade de animação do sprite?
Poste o código que esteve usando.
Entao esse é o codigo eu ate editei pois escrevi errado no step, mas sim eu usei sprite_index e tentei mudar a velocidade da animaçao com o image_speed mas nao deu certo :(

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 6
Mensagens: 120
Localização: Rio de Janeiro, Brasil

Re: animaçao de morte do player

Mensagem por ValdeciVieira » Qui Mai 23, 2024 2:38 pm

Desculpe a demora em responder, houve muitas quedas de energia hoje.

Antigamente a única forma de alterar a velocidade de animações das sprites era definindo manualmente e em tempo real a image_speed, mas no GMS2 eles mudaram isso, agora cada sprite tem a sua velocidade base (escolhida ao editar o asset) e o image_speed servirá apenas como um multiplicador dessa velocidade, sendo assim, definindo image_speed pra 2 ocasiona nas animações de todas as sprites 2x mais rápidas.

No entanto, também é possível alterar a velocidade base de cada sprite individualmente com sprite_set_speed durante a execução do jogo.

Avatar do usuário
xxZ3USSSxx
Novato
Novato
Reações: 2
Mensagens: 11

Re: animaçao de morte do player

Mensagem por xxZ3USSSxx » Qui Mai 23, 2024 3:06 pm

ValdeciVieira escreveu: Qui Mai 23, 2024 2:38 pm Desculpe a demora em responder, houve muitas quedas de energia hoje.

Antigamente a única forma de alterar a velocidade de animações das sprites era definindo manualmente e em tempo real a image_speed, mas no GMS2 eles mudaram isso, agora cada sprite tem a sua velocidade base (escolhida ao editar o asset) e o image_speed servirá apenas como um multiplicador dessa velocidade, sendo assim, definindo image_speed pra 2 ocasiona nas animações de todas as sprites 2x mais rápidas.

No entanto, também é possível alterar a velocidade base de cada sprite individualmente com sprite_set_speed durante a execução do jogo.
Nao tem problema pela demora, entao... eu li oq vc escreveu e vi algumas funçoes mas mesmo assim nao deu certo, eu escrevi isso aqui no codigo do endstep:

if(life <= 0){
sprite_index= spr_player_morto;
image_index= image_index - image_number - 1;

vel= 0;
velj= 0;
}

deu certo mas o player fica em um loop repetindo a imagem infinitamente.

obs: deve ser um bagulho tao simples de resolver e eu estou aqui me matando kkkk, obrigado pelo seu tempo :)

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 6
Mensagens: 120
Localização: Rio de Janeiro, Brasil

Re: animaçao de morte do player

Mensagem por ValdeciVieira » Qui Mai 23, 2024 3:17 pm

Ah, pensei que o problema fosse que a animação estive rápida demais mas você queria parar a animação quando chegasse ao final dela?
Sendo assim tente isso:

Código: Selecionar todos

if(life <= 0) and image_speed != 0{
sprite_index= spr_player_morto;
if image_index >= image_number - 1 {
	image_speed = 0
	image_index = image_number - 1
}
vel= 0;
velj= 0;
}

Avatar do usuário
xxZ3USSSxx
Novato
Novato
Reações: 2
Mensagens: 11

Re: animaçao de morte do player

Mensagem por xxZ3USSSxx » Sex Mai 24, 2024 9:21 am

ValdeciVieira escreveu: Qui Mai 23, 2024 3:17 pm Ah, pensei que o problema fosse que a animação estive rápida demais mas você queria parar a animação quando chegasse ao final dela?
Sendo assim tente isso:

Código: Selecionar todos

if(life <= 0) and image_speed != 0{
sprite_index= spr_player_morto;
if image_index >= image_number - 1 {
	image_speed = 0
	image_index = image_number - 1
}
vel= 0;
velj= 0;
}
bem sim a imagem tava bem rapida e eu queria que a animaçao parasse no final, eu tentei seu codigo mas o player ainda continua repetindo a imagem dele morrendo porem a velocidade ta bem menor.

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 6
Mensagens: 120
Localização: Rio de Janeiro, Brasil

Re: animaçao de morte do player

Mensagem por ValdeciVieira » Sex Mai 24, 2024 10:26 am

Entendi, desculpe, só foquei no código da animação e ignorei o resto.
Acho que identifiquei o problema, o estado do jogador não está sendo atualizado, então no step executa o código referente ao estado que estava/está ativo e no endstep executa o código de animação de morte.
Uma solução é adicionar o estado "morto" (ou o nome que você preferir).
Talvez algo assim:

Código: Selecionar todos

Colisão com inimigo:
if(alarm[0] <= 0) {
if life > 1 {
	life -= 1;
	alarm[0]= 30;
} else {
	estado = "morto";
	sprite_index = spr_player_morto;
	image_index = 0;
	// já troco a sprite e reseto o index da animação porque o game maker não faz isso automaticamente, então dependendo de qual animação estava rodando quando o player morreu, ele já atualizaria pro final da animação de morte
}
}

Step (state machine):
case "morto":
{
sprite_index= spr_player_morto;
if(image_index > image_number - 1) {
	image_index = image_number - 1;
}

vel= 0;
velj = 0;
break;
}
Quanto à velocidade da animação, é aquilo que eu disse, cada sprite tem sua velocidade base, é só você escolher o valor lá
Imagem

Avatar do usuário
xxZ3USSSxx
Novato
Novato
Reações: 2
Mensagens: 11

Re: animaçao de morte do player

Mensagem por xxZ3USSSxx » Sex Mai 24, 2024 12:05 pm

ValdeciVieira escreveu: Sex Mai 24, 2024 10:26 am Entendi, desculpe, só foquei no código da animação e ignorei o resto.
Acho que identifiquei o problema, o estado do jogador não está sendo atualizado, então no step executa o código referente ao estado que estava/está ativo e no endstep executa o código de animação de morte.
Uma solução é adicionar o estado "morto" (ou o nome que você preferir).
Talvez algo assim:

Código: Selecionar todos

Colisão com inimigo:
if(alarm[0] <= 0) {
if life > 1 {
	life -= 1;
	alarm[0]= 30;
} else {
	estado = "morto";
	sprite_index = spr_player_morto;
	image_index = 0;
	// já troco a sprite e reseto o index da animação porque o game maker não faz isso automaticamente, então dependendo de qual animação estava rodando quando o player morreu, ele já atualizaria pro final da animação de morte
}
}

Step (state machine):
case "morto":
{
sprite_index= spr_player_morto;
if(image_index > image_number - 1) {
	image_index = image_number - 1;
}

vel= 0;
velj = 0;
break;
}
Quanto à velocidade da animação, é aquilo que eu disse, cada sprite tem sua velocidade base, é só você escolher o valor lá
Imagem
entao...eu utilizei seu codigo e adicionei oque vc colocou ai porem

if(alarm[0] <= 0) {
if life > 1 { <--- eu tirei essa parte do codigo pois o player nao tava perdendo vida mas adicionei o resto.
life -= 1;
alarm[0]= 30;

como dito acima eu adicionei o resto, funcionou porem o player ainda morto continua andando (mesmo com a animaçao de morte te terminado)

toda vez que adiciono o vel/velj acontece algo ou a animaçao de morte trava ou ela acontece mas o player como dito antes anda mesmo morto sendo que era pra ele ficar parado :(.

Avatar do usuário
ValdeciVieira
Moderador
Moderador
Reações: 6
Mensagens: 120
Localização: Rio de Janeiro, Brasil

Re: animaçao de morte do player  Tópico resolvido

Mensagem por ValdeciVieira » Sex Mai 24, 2024 12:32 pm

Puxa vida, isso é o que dá se afastar do game maker por tanto tempo.
Esqueci que era pra diminuir a vida do player mesmo se o valor fosse igual a 1, mas o player continuar andando mesmo morto e com as velocidades zeradas?
Vamos tentar mudar algumas coisa então.

Código: Selecionar todos

Colisão com inimigo:
if(alarm[0] <= 0 and life > 0) {
life -= 1;
if life == 0 {
estado = "morto";
sprite_index = spr_player_morto;
image_index = 0;
vel=0; //pode remover esses dois
velj=0; //da state machine "morto"
} else alarm[0]= 30;
}

E só pra deixar claro, caso não tenha entendido, movemos o código de morte do jogador direto pra colisão com o inimigo, então aquele

Código: Selecionar todos

if(life <= 0){
//tentava criar o codigo aqui mas o player ou travava na primeira imagem ou ele iniciava rapido demais ja tentei diminuir a velocidade da animçao mas nao consegui :(

vel= 0;
velj= 0;
}
deve ser removido do endstep.
1 Imagem

Avatar do usuário
xxZ3USSSxx
Novato
Novato
Reações: 2
Mensagens: 11

Re: animaçao de morte do player

Mensagem por xxZ3USSSxx » Sex Mai 24, 2024 12:50 pm

ValdeciVieira escreveu: Sex Mai 24, 2024 12:32 pm Puxa vida, isso é o que dá se afastar do game maker por tanto tempo.
Esqueci que era pra diminuir a vida do player mesmo se o valor fosse igual a 1, mas o player continuar andando mesmo morto e com as velocidades zeradas?
Vamos tentar mudar algumas coisa então.

Código: Selecionar todos

Colisão com inimigo:
if(alarm[0] <= 0 and life > 0) {
life -= 1;
if life == 0 {
estado = "morto";
sprite_index = spr_player_morto;
image_index = 0;
vel=0; //pode remover esses dois
velj=0; //da state machine "morto"
} else alarm[0]= 30;
}

E só pra deixar claro, caso não tenha entendido, movemos o código de morte do jogador direto pra colisão com o inimigo, então aquele

Código: Selecionar todos

if(life <= 0){
//tentava criar o codigo aqui mas o player ou travava na primeira imagem ou ele iniciava rapido demais ja tentei diminuir a velocidade da animçao mas nao consegui :(

vel= 0;
velj= 0;
}
deve ser removido do endstep.
FUNCIONOU muito obrigado pelo seu tempo irei estudar mais esse codigo e outros para nao ter que tomar tempo de outras pessoas, muito obrigado pelo seu tempo e desculpa qualquer coisa vlw mesmo :).
1 Imagem

Responder

Quem está online

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