Skocz do zawartości

Problem z "atakowaniem"


Rekomendowane odpowiedzi

Problem jest taki że z jakiegoś powodu nie mogę zaatakować dwukrotnie gdy postać stoi w jednym miejscu, dopiero poruszenie się sprawia że mogę zaatakować po raz drugi. Jednocześnie gdy użyje przycisku "Shift", czyli w tym przypadku "biegania", to w ogóle nie mogę atakować. Próbuję znaleźć przyczynę, ale jej nie widzę. Pomożecie?

 

Obj_Player - Step Event:

GML
if (attack_key)

{

if (global.MeleeAttacking == false)

{

image_index = 0;

global.MeleeAttacking = true;

}

}

Obj_Player - End Animation:

GML
global.MeleeAttacking = false;

Script - scr_move_state:

GML
//Movement

phy_rotation = -point_direction(x,y,mouse_x,mouse_y)

global.rotation = phy_rotation

 

var xaxis = (right_key - left_key);

var yaxis = (down_key - up_key);

 

// Get direction

var dir = point_direction(0, 0, xaxis, yaxis);

 

// Get the length

if(xaxis == 0 and yaxis = 0) {

len = 0;

run_len = 0;

} else {

len = spd;

run_len = run_spd;

}

 

// Get the hspd and vspd

hspd = lengthdir_x(len, dir);

vspd = lengthdir_y(len, dir);

run_hspd = lengthdir_x(run_len, dir);

run_vspd = lengthdir_y(run_len, dir);

 

if(len == 0) {

if(global.MeleeAttacking == false) {

sprite_index = spr_player_stand

}

global.Direction = "Stand"

}

 

// Move

if(keyboard_check(vk_lshift)) {

phy_position_x += run_hspd;

phy_position_y += run_vspd;

} else {

phy_position_x += hspd;

phy_position_y += vspd;

}

 

// Vertical sprites

if (vspd > 0) {

if(global.MeleeAttacking == false) {

if(!keyboard_check(vk_lshift)) {

image_speed = .2;

sprite_index = spr_player;

} else {

image_speed = .3;

sprite_index = spr_player;

}

}

global.Direction = "Up";

} else if (vspd < 0) {

if(global.MeleeAttacking == false) {

if(!keyboard_check(vk_lshift)) {

image_speed = .2;

sprite_index = spr_player;

} else {

image_speed = .3;

sprite_index = spr_player;

}

}

global.Direction = "Down";

}

// Horizontal sprites

if (hspd > 0) {

if(global.MeleeAttacking == false) {

if(!keyboard_check(vk_lshift)) {

image_speed = .2;

sprite_index = spr_player;

} else {

image_speed = .3;

sprite_index = spr_player;

}

}

global.Direction = "Left";

} else if (hspd < 0) {

if(global.MeleeAttacking == false) {

if(!keyboard_check(vk_lshift)) {

image_speed = .2;

sprite_index = spr_player;

} else {

image_speed = .3;

sprite_index = spr_player;

}

}

global.Direction = "Right";

}

 

// Melee Attack

if (global.Select_Weapon = "Melee")

{

if(global.MeleeAttacking == true)

{

sprite_index = spr_player_melee

if (floor(image_index==5))

{

instance_create(x, y, obj_attack_box)

audio_play_sound(snd_melee_swing, 0, false);

}

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

Może jestem ślepy ale nigdzie nie widzę czegoś takiego jak "attack_key".

 

I co to jest toto:

GML
if (floor(image_index==5))

Wyjaśnij mi jak to działa i dlaczego i jaki miałeś zamiar( co chciałeś osiągnąć ) pisząc to w ten sposób

 

W przetłumaczeniu - "Jeżeli - 5 klatka animacji". Akurat ta funkcja raczej działa prawidłowo i napisana jest w ten sposób ponieważ taki mi doradzono wcześniej na zagranicznym forum, gdy miałem problem z tego typu funkcją. Wcześniej używałem zwykłego "image_index==5" i nie działało jak trzeba. Jeżeli wiesz jak można lepiej napisać tego typu warunek, to chętnie poznam, bo może jest lepszy sposób na uzyskanie tego rezultatu.

 

attack_key jest w skrypcie scr_get_input, a pobierany jest w Create Evencie obj_player.

Odnośnik do komentarza
Udostępnij na innych stronach

Dawno nie robilem nic w GM ale myślę że event Animation End jest pomijany w niektórych wypadkach, rysuje sobie zmienną na ekranie i sprawdź czy jest ustawiona na false(global.MeleeAttacking)%2

Hmmm, ciekawe...

 

Ustawiłem

GML
global.MeleeAttacking = false;
w zwykłym timerze
GML
Alarm[0] = room_speed*0.5
i teraz mogę atakować w tym samym miejscu i wszystko działa jak trzeba dopóki nie użyje shifta/biegania... czyli tutaj jeszcze tylko jest problem.

 

EDIT: Okay, ustawiłem przy wywoływaniu funkcji stałą prędkość animacji image_speed = 0.2, bo z jakiegoś powodu pobierało prędkość z animacji chodzenia i gdy wciskałem shift zmieniało prędkość spr_attack_melee na 0.3 i przy tej prędkości floor(image_index==5) nie działa prawidłowo.

 

Czyli jak widać faktycznie można by tutaj to usprawnić, ale nie wiem jak...

 

PS: Warto się przenieść na Studio 2? Nie ma tam tego typu problemów jak tu z Animation End?

Odnośnik do komentarza
Udostępnij na innych stronach

Chodziło mi raczej tylko o wypisanie jej na ekranie/sprawdzenie w debuge, jeśli chodzi o shift to musisz podać kod jak sprawdzasz przyciski

 

Szczerze to, zacząłem przygodę z GM bardzo nie dawno i właśnie jedno z czym się do tej pory nie zapoznałem to jak działa Debugger :D

 

Wiem że to podstawa, więc muszę się tego nauczyć. Jest jakiś poradnik gdzieś, co do tego?

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ę...