Skocz do zawartości

Maska kolizji ataku bohatera


pankracy

Rekomendowane odpowiedzi

Cześć wszystkim,

 

Ustawiłem sobie nowego bohatera.Stary miał wymiary 50x50 a nowy obecnie ma 128x74.

ustawiłem odpowiednio maskę kolizji bohatera.

Natomiast mam problem z ustawieniem maski ataku bohatera.

Bo w starym spricie bohatera kiedy bohater wykonywał atak to składał ręce i strzelał z baniek.

Natomiast ten nowy sprite ataku ma bardziej skomplikowany atak.

Nowy Bohater ma na plecach broń i kiedy wykonuje atak to wyciąga broń za pleców i przyjmuje atak trzymając broń.

Kombinuje z ustawieniem tej maski ataku i wygląda to tak,że przy ataku bohater próbuje wykonać ruch ręka się unosi do góry i z powrotem wraca..nie wyciąga broni i nie przyjmuje pozycji ataku.

Może za dużo mam obrazków animacji w spricie ataku? bo aż 89

 

Jak to ustawić?

 

 

Ok chłopaki ogarnąłem.

Problem polegał na tym,że musiałem ustawić końcową liczbę animacji sprita i teraz jest ok;D

 

Mam tylko jedno pytanie.

Moja animacja bohatera jak atakuje 89 obrazków,czy można to trochę zwolnić jej odtwarzanie?

bo obecnie jest tak,że naciskam klawisz pod którym mam zdefiniowany atak i bohater szybko wyciąga broń i tak to wygląda..

Nie widać tej chwili jak wyciąga za pleców karabin tylko od razu go w ekspresowym tempie wyciąga;-)

 

Odnośnik do komentarza
Udostępnij na innych stronach

Próbowałem też użyć wartości mniejszej od 1

Nie widać tego momentu jak bohater wyciąga za pleców broń..tylko od razu przyjmuje pozycje ataku.

Mask_player mam ustawiony ten sam sprite z tyloma ilościami ramek co niżej ma spr_player_attack

I powiedzcie Mi bo meczę się z tymi ifami.

W nowym spricie ilość ramek skoku ma 10,a tu mam na starym spricie ustawione zaledwie 2.

Jak to ustawić,że przy skoku bohatera będzie wyświetlone te 10 ramek animacji?

 

w  end stepie obj_player mam tak

 

if wPowietrzu == true && drabina == false {
  sprite_index = spr_player_air;
  if vspd <= -1 {
   image_index = 0;
  } else if vspd >= 1 {
   image_index = 2;
  } else {
   image_index = 1;
  }
 }



if  zegarAtaku > 0 && atakBierzacy == 0 {
  sprite_index = spr_player_attack;
  image_index = 89-(zegarAtaku);
  zegarAtaku -= 1;
 }
 if zegarAtaku > 0 && atakBierzacy == 1  {
  sprite_index = spr_player_shoot;
  image_index = 6-(zegarAtaku);
  zegarAtaku -= 1;
 }

 

a tu niżej w stepie  obj_player mam tak

 

if key_check(key.action) && zegarAtaku == false  
{
//if key_check(key.down) { //usuwany strzelanie na klawisz x + w dol
zegarAtaku = 26;    
atakBierzacy = 1;
with instance_create( x+(image_xscale*12), y-26, obj_projectile) //idealnie ta funkcja obraca pocisk gracza lub wroga
{ 
hspd = other.image_xscale*15;
vspd = 0; //lekko do gory -4 //mocno do gory
g = .0; //0.2 tor lotu paraboliczny
speed=4;
owner = par_player;
sila = 0;
eksplozja = true;
zasiegEksplozji = 30;
silaEksplozji = 2+(sign(other.pwrupStr)*8);
}
 }

 

Odnośnik do komentarza
Udostępnij na innych stronach

Nic to nie daje..nadal ta sama sytuacja..zastanawiam się co jest tego powodem..skoro image_speed=0; powinno zatrzymać animacje sprita.

 

 

step

 

if  zegarAtaku > 0 && atakBierzacy == 0 {
  sprite_index = spr_player_attack;
  image_speed = 0;
  image_index = 89-(zegarAtaku);
  zegarAtaku -= 1;
 }
 if zegarAtaku > 0 && atakBierzacy == 1  {
  sprite_index = spr_player_shoot;
  image_speed = 0;
  image_index = 6-(zegarAtaku);
  zegarAtaku -= 1;
 }
Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

powinno, ale.... zegarAtaku co klatkę zmniejsza się o 1. Może to zmniejszaj o mniejsze wartości, jak np. 0.2 ? Musisz zacząć czytać swój kod, w evencie step dodając przed każdą linijką "w tej klatce obrazu...." i od razu wychwycisz problematyczne miejsca.

Odnośnik do komentarza
Udostępnij na innych stronach

Staram się Gnysek,

Też się za to już wziąłem zmniejszyłem zegarAtaku na wartość 0.5 jest lepiej,ale zastanawiam się,czemu animacja ataku sprite_index = spr_player_attack się zapętla?

wciskam klawisz X i puszczam i animacja ataku mi się zapętla zamiast zatrzymać się na ostatniej ramce animacji to wraca do początkowej...

 

obj_player

 

end step

 

if  zegarAtaku > 0 && atakBierzacy == 0 {
  sprite_index = spr_player_attack;
  image_speed = 0;
  image_index = 89-(zegarAtaku);
  zegarAtaku -= 0.5;
 }
 if zegarAtaku > 0 && atakBierzacy == 1  {
  sprite_index = spr_player_shoot;
  image_speed = 0;
  image_index = 6-(zegarAtaku);
  zegarAtaku -= 0,5;
 }

 

druga sprawa...

 

Zmieniłem kod dla animacji skakania.

Teraz wyświetla mi 10 ramek.

Ale problem polega na tym,że dzieje się to tak szybko,że nie widać kilku ramek.

Więc dodałem image_speed=0.5 teraz przy skoku działa to idealnie..

ale jak już bohater wyląduje na podłożu,to animacja biegania nie działa.Bohater się szura po planszy..

te image speed obstawiam,że muszę dać warunek który sprawdzał by podłoże? że jak jest w powietrzu to image_speed=0.5 a jak na ziemi to jest tak jak było wcześniej.

 

 

  if inAir == true && climbing == false 
  
{
sprite_index = spr_player_air;// wyswietlaj animacje skakania 

}
 

 

event-other-animation end

 

if(sprite_index == spr_player_air)
{

    image_index = image_number - 1;
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Bo tak działa GM, animacje się zapętlają. Musiałbyś dodać warunek, że jak jest na ostatniej klatce to ustawiasz image_speed na 0, albo jak zmieniasz sprite to też ustawiać na 0.

Odnośnik do komentarza
Udostępnij na innych stronach

Co do zapętlania animacji, to jak @gnysek wspomniał już, GM je zapętla bo tak działa w nim animacja :) Może dodaj limit jakiś na image_index, np. coś takiego:

if  zegarAtaku > 0 && atakBierzacy == 0 {
  sprite_index = spr_player_attack;
  image_speed = 0;
  image_index = clamp(89-(zegarAtaku), 0, 89);
  zegarAtaku -= 0.5;
 }

 

Co do drugiego problemu, to może spróbuj warunkowo clamp-ować image_index:

if wPowietrzu == true && drabina == false {
  sprite_index = spr_player_air;
  var cmin = 0, cmax = 0;
  if vspd <= -1 {
   cmin = 0;
   cmax = 5;
  } else if vspd >= 1 {
   cmin = 5;
   cmax = 10;
  } else {
   cmin = 5;
   cmax = 5;
  }
    
  klatkaAnimWPowietrzu = clamp(klatkaAnimWPowietrzu + 0.5, cmin, cmax);
  image_index = klatkaAnimWPowietrzu;
 }

Dodałem zmienną klatkaAnimWPowietrzu to musisz ją dać w Create i resetować (klatkaAnimWPowietrzu = 0) zawsze przy skakaniu.

Edytowane przez Konrad-GM
Poprawka w kodzie :P
Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki chłopaki..

Dziękuje Konrad:-)

Kurcze zupełnie inaczej to wygląda niż w ifach..

 

W przypadku pierwszym ten sposób pomógł..i bohater jak skacze są odtwarzane z odpowiednią prędkością ramki obrazu i jak zetknie się z podłożem to wszystko wraca do normy.

Natomiast przypadek z ramkami animacji ataku jest nadal ten sam...nie pomaga te wyżej rozwiązanie..

nie dość,że animacja się nie zatrzymuje na ostatniej ramce to tu też image_speed spowodował,że animacja bohatera kiedy biegnie to szuranie po planszy.

 

if  zegarAtaku > 0 && atakBierzacy == 0 {
  sprite_index = spr_player_attack;
  image_speed = 0;
  image_index = clamp(89-(zegarAtaku), 0, 89);
  zegarAtaku -= 0.5;
 }
Odnośnik do komentarza
Udostępnij na innych stronach

if image_index = 88 then image_speed=0;

Kurcze nie pomaga;/

powinno zatrzymać sprita ataku na ostatniej ramce...

 

 

rozwiązanie poprzednie,ale nie działa:

 

Step obj_player

 

 if zegarAtaku > 0 && atakBierzacy == 0 {
 
 
  sprite_index = spr_player_attack;
    if image_index == 88 {
    image_speed = 0;
}
  
  image_index = 89- (zegarAtaku);
  
  attClock -= 0.5;

pomysły już mi się kończą;/

nadal nie działa nie chce zatrzymywać się na ostatniej ramce animacji.

 

 

edit.

 

próbowałem jeszcze czegoś takiego

 

w evencie other animation end

 

dałem tak

 

if (sprite_index == spr_player_attack)
{
image_index = image_number - 1; // zatrzymuje sie na ostatniej ramce
image_speed = 0; // stop animacja
} 

Niestety to też nie pomaga i dalej kurcze problem jest,że nie chce zatrzymać się na ostatniej ramce animacji..kurcze:/

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Jeśli nie pomaga, to pewnie gdzieś potem dalszy kod ręcznie znów zmienia speed/klatkę. Może ustawiasz własnie image_index = 89, a ponieważ klatek jest 88, GM automatycznie pokazuje zerową?

Odnośnik do komentarza
Udostępnij na innych stronach

Szukam przyczyny...

To jest mój caly kod ze Step i End Step bohatera oraz Create

tak automatycznie pokazuje Mi zerową klatkę:-/

 

Kod w obj_player wygląda u mnie następująco

 

Obj_player

Step

 

///ustawienia ruchu Bohatera


// gdy Bohater jest zamrozony zatrzymujemy go
if(zamroz==true)
{
x = zamroz_x;
y = zamroz_y;
gravity=0
vspd=0;
hspd=0;
}


//licznik czasowy gry
rs_timer ++;



    ///auto unstuck kiedy nam Bohater sie zaklinuje to podana nizej funkcja go odblokuje
while(place_meeting(x,y,other))
{

    dir = point_direction(x,y,other.x,other.y)
    x = x + lengthdir_x(-1,dir)
    y = y + lengthdir_y(+10,dir)
    other.alarm[0] = room_speed;
}


if(variable_global_exists("textq")) //Jesli zmienna global.textq istenieje, to wykonuj ponizszy kod
{
    if(ds_exists(global.textq, ds_type_queue)) //Jesli data structure istenieje, to wykonuj ponizszy kod
    {

if(instance_number(obj_napis_plansz)=0)// zatrzymuje sprita bohatera na czas wyswietlenia napisu Stage
{
if(vspd>0 ^^ hspd>0 ^^ vspd<0 ^^ hspd<0)
{
image_speed=1
}
else
{
image_speed=0;
}



if (vspd > 25)  //Jesli predkosc spadania jest szybsza niz 25 (Mozna dowolnie zmieniac ta wartosc.)
{
global.damage+=5
} //Zwiekszenie obrazen o wartosc 1. (Zmienienie liczby na wieksza zwiekszy zadawane obrazenia po upadku.)

if not place_free(x,y+1)//Jesli w poblizu nas jest jakis obiekt rowniez zostana zadane obrazenia
{
other.hp-=global.damage //Odejmujemy punkty zycia od wartosci zadanych obrazen.
global.damage=0 //Resetujemy zadawanie obrazen po uderzeniu w ziemie by nie zabieralo go wiecej
}
}



if(no_text()) //teraz Bohater stoi jak jest odwarzana sekwencja tekstowa textboxa
{
///Kontrola
if !place_meeting(x,y,obj_water) 
{
//Normalny ruch
if drabina == false 
{
if key_check_pressed(key.jump)  && wPowietrzu == false 
{
vspd = -10-sign(pwrupJmp*3);
silaSkoku = 3;


//Zeskakiwanie w dol
if key_check(key.down) && place_meeting(x,y+1,par_solid_ghost) 
{
y += 4;
vspd = 0;
silaSkoku = 0;
czasSkoku = 0;
}
} 
else if key_check(key.jump) && silaSkoku > 0 
{
audio_play_sound(dzwiek_skoku_anatolka, 1, false);   //odtwarzamy dzwiek przy skakaniu
vspd -= 2+sign(pwrupJmp);
silaSkoku--;
} 
else 
{
if key_check_released(key.jump) && silaSkoku > 2 
{
vspd += 2+sign(pwrupJmp);
}

silaSkoku = 0;
}



if key_check(key.action) && zegarAtaku == false  
{
//if key_check(key.down) { //usuwany strzelanie na klawisz x + w dol
zegarAtaku = 26;    
atakBierzacy = 1;
with instance_create( x+(image_xscale*12), y-26, obj_projectile) //idealnie ta funkcja obraca pocisk gracza lub wroga
{ 
hspd = other.image_xscale*15;
vspd = 0; //lekko do gory -4 //mocno do gory
g = .0; //0.2 tor lotu paraboliczny
speed=4;
owner = par_player;
sila = 0;
eksplozja = true;
zasiegEksplozji = 30;
silaEksplozji = 2+(sign(other.pwrupStr)*8);
//image_blend = c_black; //kolor lotu pocisku
audio_play_sound(dzwiek_anatol_strzela, 1, false); //odtwarzamy dzwiek przy strzelaniu
}

}
 
if key_check(key.right) && !key_check(key.left) 
{
if hspd < 8+(sign(pwrupSpd)*5) 
{
hspd = min(hspd+(2+(sign(pwrupSpd)*2))*multiF,10+(sign(pwrupSpd)*5));
}

image_xscale = 1;
}

if key_check(key.left) && !key_check(key.right)  
{
if hspd > -8-(sign(pwrupSpd)*5) 
{
hspd = max(hspd-(2+(sign(pwrupSpd)*2))*multiF,-10-(sign(pwrupSpd)*5));
}

image_xscale = -1;
}
 
//Drabina
if  place_meeting(x,y,par_climbable) && place_meeting(x,y-32,par_climbable) && place_meeting(x,y+5,par_climbable) && zegarAtaku <= 0 && (key_check(key.up) || key_check(key.down))  
{
drabina = true;
vspd = 0;
hspd = 0;
}
}

//Wspinanie sie
if drabina == true 
{
var __hsign = key_check(key.right)-key_check(key.left);
var __vsign = key_check(key.down)-key_check(key.up);

hspd = min(max(hspd+__hsign,-2),2);
vspd = min(max(vspd+__vsign*2,-4),4);

if __vsign == -1 && !place_meeting(x,y-32,par_climbable) 
{
drabina = false;
vspd = -10;
}

if __hsign != 0 
{
image_xscale = __hsign;
}
 
if !place_meeting(x,y,par_climbable) || !place_meeting(x,y+32,par_climbable)  
{
drabina = false;
}
}
 
}
else 
{
                                                                                                                                   
//Plywanie
kierunekPlywania = point_direction(0,0,key_check(key.right)-key_check(key.left),key_check(key.down)-key_check(key.up));
if abs(key_check(key.right)-key_check(key.left))+abs(key_check(key.down)-key_check(key.up)) != 0 
{
hspd += lengthdir_x(.5,kierunekPlywania);
if !(kierunekPlywania > 0 && kierunekPlywania < 180) || place_meeting(x,y-sprite_height/3-1,obj_water) 
{
vspd += lengthdir_y(.5,kierunekPlywania);
//audio_play_sound(dzwiek_anatol_plywa, 1, false);  //odtwarzamy dzwiek gdy anatol plywa
}
}

if key_check(key.up) && !place_meeting(x,y-sprite_height/1.5,obj_water) && vspd <= 0 
{ 
  
//kierunekPlywania do gory
vspd = -12;
}
}
}



//dodane puszczanie drabiny przez bohatera przy dotknieciu podloza
if  place_meeting(x,y,par_climbable) && drabina=true && place_meeting(x,y+2,par_solid)
{
drabina=false;
}
  
//Normalny ruch
if drabina == false 
{
if key_check(key.down) && wPowietrzu == false
{
//Zeskakiwanie w dol
if key_check(key.down) && place_meeting(x,y+1,obj_zejscie_drabiny) 
{
y += 4;
vspd = 0;
silaSkoku = 0;
czasSkoku = 0;
  
}
   }
}
 
if vspd>0 && place_meeting(x,y,par_climbable) then drabina=true;

if wPowietrzu=true && vspd = -10-sign(pwrupJmp*3) && silaSkoku = 3 && hspd>0 && place_meeting(x,y,par_climbable) && key_check(key.jump) && key_check(key.right) || key_check(key.jump) && key_check(key.left) then drabina=false;


if key_check(key.action) && zegarAtaku == false && place_meeting(x,y,par_climbable) 
{
    zegarAtaku = 16;
    atakBierzacy = 1;
    with instance_create(x+10,y-26,obj_projectile)  
{
    hspd = other.image_xscale*10;
    vspd = 0; //lekko do gory -4 //mocno do gory
    g = .0; //0.2 tor lotu paraboliczny
    owner = par_player;
    audio_play_sound(dzwiek_anatol_strzela, 1, false); //odtwarzamy dzwiek przy strzelaniu
    }
}



//nabieranie powietrza
if tlen<10
{
if distance_to_object(obj_water)>1
{
tlen+=0.2
}
}

//jesli nie ma powietrza energia ucieka i bohater potem traci zycie
if tlen<0.01
{
global.hp-=0.2
}

if global.hp<=0
{
global.life -= 1;
}

Obj_player

End Step

 

///Sprity


if(instance_number(obj_napis_plansz)=0 && no_text()) {
if !place_meeting(x,y,obj_water)
 {
   
 if wPowietrzu == false && key_check(key.right) = key_check(key.left) && sprite_index != spr_player_stand && drabina == false {
  sprite_index = spr_player_stand;
  image_index =0;
 
 }
 if wPowietrzu == false && (key_check(key.right) || key_check(key.left)) && key_check(key.right) != key_check(key.left) && sprite_index != spr_player_run && drabina == false {
  sprite_index = spr_player_run;
  image_index = 0;
 }

if wPowietrzu == true && drabina == false {
  sprite_index = spr_player_air;
  var cmin = 0, cmax = 0;
  if vspd <= -1 {
   cmin = 0;
   cmax = 5;
  } else if vspd >= 1 {
   cmin = 5;
   cmax = 10;
  } else {
   cmin = 5;
   cmax = 5;
  }
    
  klatkaAnimWPowietrzu = clamp(klatkaAnimWPowietrzu + 0.1, cmin, cmax);
  image_index = klatkaAnimWPowietrzu;
 }
 
 if drabina == true {
  if x == xprevious && y == yprevious {
   if sprite_index != spr_player_hang {
    sprite_index = spr_player_hang;
   }
  } else {
   if sprite_index != spr_player_climb {
    sprite_index = spr_player_climb;
   }
  }
 }
 
 if  zegarAtaku > 0 && atakBierzacy == 0 {
  sprite_index = spr_player_attack;
  image_index = 89-(zegarAtaku);
  zegarAtaku -= 0.5;
 }
 if zegarAtaku > 0 && atakBierzacy == 1  {
  sprite_index = spr_player_shoot;
  image_index = 6-(zegarAtaku);
  zegarAtaku -= 0.5;
 }
 
  if zegarAtaku > 0 && atakBierzacy == 1 && (key_check(key.right) || key_check(key.left)) {
  sprite_index = spr_anatol_przesuwa_skrzynie;
  image_index = 23-(odejmij);
  odejmij -= 1;
 }
 
 

 
 kierunekPlywania = point_direction(xprevious,yprevious,x,y);
 wysKierunek = kierunekPlywania;
 if image_xscale < 0 {
  wysKierunek += 180;
 }
} else {
 if sprite_index != spr_player_water {
  sprite_index = spr_player_water;
  image_index = 0;
 }

 if key_check(key.right) && !key_check(key.left) && image_xscale = -1 {
  image_xscale = 1;
  wysKierunek -= 180;
 } else if key_check(key.left) && !key_check(key.right) && image_xscale = 1 {
  image_xscale = -1;
  wysKierunek += 180;
 }
 
 if abs(key_check(key.right)-key_check(key.left))+abs(key_check(key.down)-key_check(key.up)) != 0 {
  image_index += 2;
  if image_xscale > 0 {
   wysKierunek -= angle_difference(wysKierunek,kierunekPlywania)/16;
  } else {
   wysKierunek -= angle_difference(wysKierunek,180+kierunekPlywania)/16;
  }
 }
}


 //animacja do przesuwania skrzyni
 if wPowietrzu == false && (key_check(key.right)) && (place_meeting(x-5,y,obj_skrzynia) || place_meeting(x+5,y,obj_skrzynia))
 {sprite_index = spr_anatol_przesuwa_skrzynie; image_index = 23 -(odejmij);
  odejmij -= 1; }
  else if (key_check(key.left)) && (place_meeting(x-5,y,obj_skrzynia) || place_meeting(x+5,y,obj_skrzynia)) {
  sprite_index = spr_anatol_przesuwa_skrzynie; image_index = 23 -(odejmij);
  odejmij -= 1; }


}


































 

Obj_player

Create

 

/// Glowne deklaracje zmiennych Bohatera
                     
                     //////////////////////////////
                    ///////ZMIENNE STALE//////////
                    /////////////////////////////
///Ustawienia

event_inherited();
zbieranie=true;
eksplozja = false;
zasiegEksplozji = 22;
silaEksplozji = 10;
klatkaAnimWPowietrzu = 0;

global.damage=0; //zmienna odzpowiedzialna za obrazenia zadawane po upadku z duzej wysokosci
global.hp = 100;
global.hit=0; //zmienna odpowiada za obrazenia kuli i miganie 
maxHp = 100;
zegarAtaku = 0;
odejmij = 0; //zmienna potrzebna do przesuwanie skrzynki w end step 
atakBierzacy = 0;
global.zegarObrazen = 0;
kierunekPlywania = 0;
wysKierunek = 0;
silaSkoku = 0;
czasSkoku = 0;
drabina = false;
rs_timer = 0; //licznik czasowy w grze
tlen=10;//ilosc tlenu

//Moce specjalne
pwrupSpd = 0;
pwrupStr = 0;
pwrupJmp = 0;

//Pozycja odrodzenia bohatera i wywolanie skryptu widoku centralnego na graczu
spawnX = x;
spawnY = y;
centerViewOnMe();

//zachowanie pozycji gracza przy checkpointach
if (global.checkpointR == room)
{
    x = global.checkpointx;
    y = global.checkpointy;
}
start_x = x;
start_y = y;
//funkcja dodaje HUD gracza na planszach bossowych
if instance_exists(obj_game_controller)
obj_game_controller.visible=1
else instance_create(0,0,obj_game_controller);


//zamrazanie bohatera
zamroz = false;
zamroz_x = x;
zamroz_y = y;



playerSlot = 1; //ustalamy slot dla gracza numer 1
kierunekPlywaniaGamepad = 0;




    
    
    
    
    


  

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Za nic nie rozumiem tego kodu, ale bym sprawdził miejsca z image_index = 0. Bo takich jest kilka. Musisz albo skorzystać z debuggera, albo chociaż z show_debug_message() na końcu kodu, zebby sobie wyświetlać w konsoli co masz za wrtość w image_index, to może pomóc. Ciężko przeanalizować kod, którego 99% nie ma związku ze zmianą sprite/klatki i w ogóle nie ma zwiazku ze sprawą. Za dużo tego jest do analizy.

Odnośnik do komentarza
Udostępnij na innych stronach

A nie będzie tak,że jak użyje show_debug_message()  to na końcu kodu może mi się wyświetlić bardzo dużo informacji związanych z image_speed=0 ?

Ale przecież zmiana sprita bohatera i jego ramki animacji mam w obj_player bo gdzie indziej mógłbym mieć? przecież nie w obiektach wrogów czy w pułapkach ani w kolizjach.

To są wyżej moje eventy Step i Step End..więcej nie mam.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Używając show_debug_message() sam decydujesz co ma Ci wypisać. Możesz tam wprowadzić zmienną, albo dać jakiś string typu show_debug_message("Ta linijka kodu wykonała się - system poruszania") albo coś w ten deseń. Pomaga odkryć to, gdzie program liczy coś inaczej niż mieliśmy to w głowie. 

 

Cytuj

przecież nie w obiektach wrogów czy w pułapkach ani w kolizjach

A dlaczego nie? animacja otrzymania obrażeń, albo animacja utknięcia w jakieś pułapce. 

Musisz wiedzieć podstawowe rzeczy:
sprite_index - obraz bądź animacja, który dany obiekt aktualnie wyświetla
image_index - klatka animacji; Jeśli sprite_index posiada np. 13 klatek, to image_index ustala która z nich dokładnie ma być wyświetlona
image_speed - prędkość odtwarzanej animacji

Generalnie te trzy funkcję będą Ci potrzebne przy manipulacji animacją. No może jeszcze to:
image_number - zwraca liczbę klatek w animacji; Czyli jeśli masz 13 klatek, to image_number zwróci liczbę 13

Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 miesiące temu...

Mam takie pytanie...

 

przy skoku bohatera nie wyświetla mi się pełna animacja składająca się z 52 ramek animacji.

Wcześniej kiedy wstawiłem starego sprita który miał tylko 10 ramek animacji skoku,to całość się wyświetliła..

 

Co robię nie tak?

Z góry dziękuje za pomoc:-)

 

obj_player

 

create


 

klatkaAnimWPowietrzu = 0;

 

 

step

 

 if inAir == true && climbing == false {
  sprite_index = spr_player_air;
  var cmin = 0, cmax = 0;
  if vspd <= -1 {
   cmin = 0;
   cmax = 52;
  } else if vspd >= 1 {
   cmin = 26;
   cmax = 26;
  } else {
   cmin = 26;
   cmax = 26;
  }
    
  klatkaAnimWPowietrzu = clamp(klatkaAnimWPowietrzu + 0.1, cmin, cmax);
  image_index = klatkaAnimWPowietrzu;
 }
 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Kolejny kogel mogel :V 
Po co Ci te zmienne:
klatkaAnimWPowietrzu = 0;
cmin = 0;
cmax = 0;

 

Do obliczania, kiedy animacja się zakończy? A nie lepiej użyć wbudowanego w gm:s "animation end"?
I wtedy dajesz normalnie w stepie, żeby zaczął Ci wykonywać animacje po jakimś spełnionym warunku (choćby ten co masz), najlepiej od zerowej klatki, a w animation end dajesz, warunek, że jak ta animacja się zakończy, to ma zostać na ostatniej klatce 

Odnośnik do komentarza
Udostępnij na innych stronach

dobra coś takiego...

Tak działa;-) chociaż przydałoby się jeszcze troszkę zwolnić animacje..

 

Step

 

  if inAir == true && climbing == false 
  
{
sprite_index = spr_player_air;// wyswietlaj animacje skakania 

}
 

 

event-other-animation end

 

if(sprite_index == spr_player_air)
{

    image_index = image_number - 1;
}
Odnośnik do komentarza
Udostępnij na innych stronach

no i fajnie, brakuje jeszcze zaczynania animacji od początkowej klatki, ale to nie przeszkadza, to być nie musi.
Do zmiany tempa odtwarzanej animacji służy image_speed:
image_speed = 1; // normalna prędkość
image_speed > 1; // szybsza prędkość
image_speed < 1; // wolniejsza

Daj sobie
image_speed = 0.5; a po zakończeniu animacji, wróć do standardowej image_speed = 1;

Odnośnik do komentarza
Udostępnij na innych stronach

No dobra,a na podstawie wyżej przedstawionego kodu;-) zrobić coś takiego..

Mam 52 ramki animacji skoku..i teraz tak:

Bohater skacze i jak jest na szczycie już wyskoku to jest animacja do 26 klatki,a jak spadnie to kończy się na 52 czyli ostatniej..

tak żeby w pełni wyświetliła się animacja skoku bohatera...każda ramka..

 

Odnośnik do komentarza
Udostępnij na innych stronach

Zacząć od image_index = 0, kiedy skok się zaczyna. Możesz zrobić np. if keyboard_check_pressed(vk_space) then image_index = 0;
albo inacej, bo to zależy od twojego kodu sterowania:

CREATE:

animOdPoczatku = true;


STEP:

if(inAir == true && climbing == false && animOdPoczatku==true)
{
	image_index = 0; //zaczynaj od pierwszej klatki
	sprite_index = spr_player_air;// wyswietlaj animacje skakania 
	animOdPoczatku = false;
}


ANIMATION END:
 

if(sprite_index == spr_player_air)
{
    image_index = image_number - 1;
	animOdPoczatku = true;
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

No jeśli animacja się zmienia, to znaczy, że gdzieś w kodzie tak masz zapisane, że przy jakimś warunku ma się zmieniać animacja

edit: Chodzi mi o to, że gdzieś masz sprite_index który zmienia się, przy wykonaniu jakiegoś warunku, dajmy na to:
Jesteś w powietrzu -> Animacja zmienia się na spr_animacjaskakania -> Wciskasz A lub D i zmienia się animacja, bo do tej akcji przypisany jest if od sterowania

Czy coś takiego

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...