Skocz do zawartości
  • 0
H2S04

Problem z kodem zmiany broni

Pytanie

Mam problem z kodem zmiany broni. Po pierwszym kliknięciu "E" broń leżąca na ziemi zmienia x i y na x i y postaci, po drugim wciśnięciu "E" broń dopiero się zmienia... Jest to upierdliwe :/

 

Collision Code with o_WeaponParent:

GML
if keyboard_check_pressed(ord("E")){

if other.weap > 5{

if primweap = other.weap{

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

global.weaponid[other.weap,5] += other.mag;

other.mag = 0;

} else {

var a = global.weaponid[other.weap,6] - other.mag;

global.weaponid[other.weap,5] += a;

other.mag -= a;

}

} else {

if primweap = 0{

primweap = other.weap;

primammo = other.ammo;

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

global.weaponid[other.weap,5] += other.mag;

instance_destroy(other);

} else {

var a = global.weaponid[other.weap,6] - other.mag;

global.weaponid[other.weap,5] += a;

instance_destroy(other);

}

instance_destroy(other);

} else {

var oldammo, oldweap, oldweapinst;

oldammo = primammo;

oldweap = primweap;

primweap = other.weap;

primammo = other.ammo;

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

global.weaponid[other.weap,5] += other.mag;

instance_destroy(other);

} else {

var a = global.weaponid[other.weap,6] - other.mag;

global.weaponid[other.weap,5] += a;

instance_destroy(other);

}

oldweapinst = instance_create_layer(x,y,"Instances",o_WeaponOld);

oldweapinst.ammo = oldammo;

oldweapinst.weap = oldweap;

oldweapinst.mag = 0;

instance_destroy(other);

}

}

} else {

if secweap = other.weap{

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

global.weaponid[other.weap,5] += other.mag;

other.mag = 0;

} else {

var a = global.weaponid[other.weap,6] - other.mag;

global.weaponid[other.weap,5] += a;

other.mag -= a;

}

} else {

if secweap = 0{

secweap = other.weap;

secammo = other.ammo;

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

global.weaponid[other.weap,5] += other.mag;

instance_destroy(other);

} else {

var a = global.weaponid[other.weap,6] - other.mag;

global.weaponid[other.weap,5] += a;

instance_destroy(other);

}

instance_destroy(other);

} else {

var oldammo, oldweap, oldweapinst;

oldammo = secammo;

oldweap = secweap;

secweap = other.weap;

secammo = other.ammo;

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

global.weaponid[other.weap,5] += other.mag;

instance_destroy(other);

} else {

var a = global.weaponid[other.weap,6] - other.mag;

global.weaponid[other.weap,5] += a;

instance_destroy(other);

}

oldweapinst = instance_create_layer(x,y,"Instances",o_WeaponOld);

oldweapinst.ammo = oldammo;

oldweapinst.weap = oldweap;

oldweapinst.mag = 0;

instance_destroy(other);

}

}

}

}

 

//}

 

/*

global.weaponid[16,0] = "Pumpo"; // name

global.weaponid[16,1] = 20; // dmg

global.weaponid[16,2] = 40; // AP

global.weaponid[16,3] = 10; // Ammo

global.weaponid[16,4] = 10; // Max Ammo

global.weaponid[16,5] = 0; // Mag

global.weaponid[16,6] = 5; // Max mag

global.weaponid[16,7] = 0; // empty mag

global.weaponid[16,8] = sou_Pumpo; // sound

global.weaponid[16,9] = room_speed*4; // reload time

global.weaponid[16,10] = room_speed*1; // shoting time

global.weaponid[16,11] = 0; // mag ammo

///////////////////////////////*/

 

GML
other.weap //jest to id broni jaką posiada objekt do losowania broni.

primweap //zmienna broni głównej

other.mag //zmienna ile jest magazynków przy broni.

global.weaponid[other.weap,5] //posiadana ilość magazynków,

global.weaponid[other.weap,6] //maxymalna ilość magazynków;

other.ammo //posiadana amunicja przez obiekt

other.weap > 5 //jeżeli nie jest to pistoletem, to przypisuje do slotu głównej broni

oldammo //aktualnie posiadana amunicja do danej broni

oldweap //id broni

oldweapinst //nowa instancja broni

primammo //amunicja do głównej broni</span></span>

 

W postaci mam jeszcze zmienną, którą broń posiadam

GML
usedweap; // jest = 0(pistolety) lub 1(karabiny); to jest czy używam primweap czy secweap</span>

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

8 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

W okresleniu problemu pomogloby napewno sprawdzic która część kodu się wykonuje.

Powpisuj show_debug_message(Jakaś wiadomość, unikalna dla każdej lini, może być numer wykonywanej lini) w różne miejsca w kodzie by sprawdzić jak kod się wykonuje.

Jest dużo ifów i elsów i na sucho nie da rady określić ktore czesci kodu sie wykonuja czyli ktora czesc kodu zawadza. Zobacz ktore linie sie aktywuja przy pierwszym kliknieciu a ktore przy drugim.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Zrobię sąsiadce laptopa, ogarnę ten temat i napiszę co i jak. Ale wygląda na to, że kod cały się wykonuje skoro działa. Tylko jest ten glitch, że muszę kliknąć dwa razy E by podnieść broń :/ Coś będę modził :D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Wszystko działa dobrze :/ jednak dalej jak staję obok broni, tak by zaliczyło kolizję to, teleportuje broń na postać... Dziwne...

 

 

EDIT3: NIŻEJ;

EDIT4: Spróbuję zamienić else na przełącznik... zobaczę jak to będzie działać.

EDIT5: Na samym dnie :/

 

EDIT1: Cholera zapomniałem edytować posta wyżej :o...

EDIT2: A ch**a nie wygląda dobrze... Zebrałem broń, gdy nie posiadałem żadnej, więc powinien iść tylko debug:

GML
primweap Jest większe od 5 // 1 Początek

primweap = 0; // 3 początek

other.mag + mag <= maxmag

// 3 koniec

// 1 Koniec</span></span></span></span></span></span></span></span></span></span></span>

 

A dodatkowo wykonuje to

GML
primweap Jest większe od 5 // 1 Początek

primweap != 0; // 4 początek

other.mag + mag <= maxmag

Tworzenie nowej bronii

//4 Koniec

// 1 Koniec</span></span></span></span></span></span></span></span></span></span></span>

Jeszcze to obadam zaraz...

 

 

 

 

Próba1 :

GML
Resizing fullscreen window..

Resizing swap chain..

primweap Jest większe od 5 // 1 Początek

primweap = 0; // 3 początek

other.mag + mag <= maxmag

// 3 koniec

// 1 Koniec

primweap Jest większe od 5 // 1 Początek

primweap != 0; // 4 początek

other.mag + mag <= maxmag

Tworzenie nowej bronii

//4 Koniec

// 1 Koniec

primweap Jest większe od 5 // 1 Początek

primweap != 0; // 4 początek

other.mag + mag <= maxmag

Tworzenie nowej bronii

//4 Koniec

// 1 Koniec

primweap Jest większe od 5 // 1 Początek

primweap != 0; // 4 początek

other.mag + mag <= maxmag

Tworzenie nowej bronii

//4 Koniec

// 1 Koniec

Attempting to set gamepadcount to 0

---------------------------------------------------------------

minFPS, maxFPS, avgFPS

-31, 1310, 363

---------------------------------------------------------------

---------------------------------------------------------------

minFPS, maxFPS, avgFPS

-31, 1310, 363

---------------------------------------------------------------

 

 

C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.0.7.110/windows/Runner.exe DONE (0)

Igor complete.

elapsed time 00:00:19.3177988s for command "C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.0.7.110/bin/Igor.exe" -options="C:\Users\HieNa\AppData\Local\GameMakerStudio2\GMS2TEMP\build.bff" -- Windows Run started at 06/24/2017 07:49:15

SUCCESS: Run Program Complete

 

EDIT3: Tu cię mam gagatku. Zrobiłem myk, Podniosłem broń, wymusiłem nowy debug msg (że podniosę drugą broń), podlazłem wcisnąłem "E", nie wzięło broni, to dawaj drugi raz wymuszony debug msg i proszę, kod nie działa jak powinien :D Dzięki za dobrą wskazówkę, bo wcześniej tego nie znałem, a w gm już dłubałem wiele razy :). Teraz można pomyśleć jak to naprawić :), Tylko jak? haha dodać alarmy? W stepie jeżeli zmienna = true? Bo już sam nie wiem :D

Próba 2:

GML
Resizing fullscreen window..

Resizing swap chain..

primweap Jest większe od 5 // 1 Początek

primweap = 0; // 3 początek

other.mag + mag <= maxmag

// 3 koniec

// 1 Koniec

// Podniosłem jedną, będę podnosił drugą

primweap Jest większe od 5 // 1 Początek

primweap != 0; // 4 początek

other.mag + mag <= maxmag

Tworzenie nowej bronii

//4 Koniec

// 1 Koniec

primweap Jest większe od 5 // 1 Początek

primweap != 0; // 4 początek

other.mag + mag <= maxmag

Tworzenie nowej bronii

//4 Koniec

// 1 Koniec

// Podniosłem jedną, będę podnosił drugą

primweap Jest większe od 5 // 1 Początek

primweap != 0; // 4 początek

other.mag + mag <= maxmag

Tworzenie nowej bronii

//4 Koniec

// 1 Koniec

Attempting to set gamepadcount to 0

---------------------------------------------------------------

minFPS, maxFPS, avgFPS

-31, 1364, 347

---------------------------------------------------------------

---------------------------------------------------------------

minFPS, maxFPS, avgFPS

-31, 1364, 347

---------------------------------------------------------------

 

 

C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.0.7.110/windows/Runner.exe DONE (0)

Igor complete.

elapsed time 00:00:17.8518242s for command "C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.0.7.110/bin/Igor.exe" -options="C:\Users\HieNa\AppData\Local\GameMakerStudio2\GMS2TEMP\build.bff" -- Windows Run started at 06/24/2017 08:02:18

SUCCESS: Run Program Complete

Kod: [Poprawiony, wywaliłem niepotrzebne instance_destroy(other);]

GML
if keyboard_check_pressed(ord("E")){

if other.weap > 5{

show_debug_message("primweap Jest większe od 5 // 1 Początek")

if primweap = other.weap{

show_debug_message("Jest = other.weap // 2 początek")

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

show_debug_message("other.mag + mag <= maxmag")

global.weaponid[other.weap,5] += other.mag;

other.mag = 0;

} else {

show_debug_message("other.mag + mag > maxmag")

var a = global.weaponid[other.weap,6] - global.weaponid[other.weap,5];

global.weaponid[other.weap,5] += a;

other.mag -= a;

}

show_debug_message("// 2 koniec")

} else {

if primweap = 0{

show_debug_message("primweap = 0; // 3 początek")

primweap = other.weap;

primammo = other.ammo;

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

show_debug_message("other.mag + mag <= maxmag")

global.weaponid[other.weap,5] += other.mag;

instance_destroy(other);

} else {

show_debug_message("other.mag + mag > maxmag")

var a = global.weaponid[other.weap,6] - global.weaponid[other.weap,5]

global.weaponid[other.weap,5] += a;

instance_destroy(other);

}

show_debug_message("// 3 koniec")

} else {

show_debug_message("primweap != 0; // 4 początek")

var oldammo, oldweap, oldweapinst;

oldammo = primammo;

oldweap = primweap;

primweap = other.weap;

primammo = other.ammo;

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

show_debug_message("other.mag + mag <= maxmag")

global.weaponid[other.weap,5] += other.mag;

instance_destroy(other);

} else {

show_debug_message("other.mag + mag > maxmag")

var a = global.weaponid[other.weap,6] - global.weaponid[other.weap,5];

global.weaponid[other.weap,5] += a;

instance_destroy(other);

}

show_debug_message("Tworzenie nowej bronii")

oldweapinst = instance_create_layer(x,y,"Instances",o_WeaponOld);

oldweapinst.ammo = oldammo;

oldweapinst.weap = oldweap;

oldweapinst.mag = 0;

show_debug_message("//4 Koniec")

}

}

show_debug_message("// 1 Koniec")

}

}

 

 

 

 

 

Napisałem nowy kod: (spoilery nie działają z [g ml] :/

GML
var a, b, cse;

if keyboard_check_pressed(ord("E")){

show_debug_message("//Sprawdzam czy nie jest pistoletem");

if other.weap > 5{

show_debug_message("//Sprawdzam czy bronie główne są takie same");

if primweap = other.weap{

show_debug_message("//Bronie główne są takie same");

cse = 1;

} else {

show_debug_message("//Bronie główne są różne");

show_debug_message("//Sprawdzam czy posiadam główną broń w EQ");

if primweap = 0{

show_debug_message("//Nie posiadam broni głównej");

cse = 2;

} else {

show_debug_message("//Posiadam broń główną");

cse = 3;

}

 

}

}

 

 

switch(cse){

case 1:

show_debug_message("//Sprawdzam Stan Amunicji");

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

show_debug_message("//Magazynków jest mniej, niż ilość maxymalna więc zabieram wszystko");

global.weaponid[other.weap,5] += other.mag;

other.mag = 0;

} else {

show_debug_message("//Magazynków jest więcej niż ilość maxymalna, więc sprawdzam ilę mogę wziąć");

a = global.weaponid[other.weap,6] - global.weaponid[other.weap,5];

global.weaponid[other.weap,5] += a;

other.mag -= a;

}

show_debug_message("//Dodałem magazynki");

break;

/////////////////////////

case 2:

primweap = other.weap;

primammo = other.ammo;

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

show_debug_message("//Magazynków jest mniej, niż ilość maxymalna więc zabieram wszystko");

global.weaponid[other.weap,5] += other.mag;

instance_destroy(other);

} else {

show_debug_message("//Magazynków jest więcej niż ilość maxymalna, więc sprawdzam ilę mogę wziąć");

a = global.weaponid[other.weap,6] - global.weaponid[other.weap,5]

global.weaponid[other.weap,5] += a;

instance_destroy(other);

}

show_debug_message("//Podniosłem broń do pustego slotu.");

break;

/////////////////////////

case 3:

show_debug_message("//Zaczynam zamianę broni.")

var oldammo, oldweap, oldweapinst;

oldammo = primammo; show_debug_message("//Zapisuję starą ilość ammo");

oldweap = primweap; show_debug_message("//Zapisuję stare id broni");

primweap = other.weap; show_debug_message("//Zamieniam broń na nową broń");

primammo = other.ammo; show_debug_message("//Zamieniam ammo na nową wartość ammo");

show_debug_message("//Sprawdzam Stan Amunicji");

if other.mag + global.weaponid[other.weap,5] <= global.weaponid[other.weap,6]{

show_debug_message("//Magazynków jest mniej, niż ilość maxymalna więc zabieram wszystko");

global.weaponid[other.weap,5] += other.mag;

instance_destroy(other);

} else {

show_debug_message("//Magazynków jest więcej niż ilość maxymalna, więc sprawdzam ilę mogę wziąć");

var a = global.weaponid[other.weap,6] - global.weaponid[other.weap,5];

global.weaponid[other.weap,5] += a;

instance_destroy(other);

}

show_debug_message("//Tworzenie nowej broni:")

oldweapinst = instance_create_layer(x,y,"Instances",o_WeaponOld); show_debug_message("//Tworzę instancję przez zmienną");

oldweapinst.ammo = oldammo; show_debug_message("//Dodaję do instancji starą amunicję");

oldweapinst.weap = oldweap; show_debug_message("//Nadaję broni ID");

oldweapinst.mag = 0; show_debug_message("//Ustalam ilość magazynków na 0");

show_debug_message("//Koniec zamiany broni")

break;

/////////////////////////

case 4: //

break;

/////////////////////////

case 5:

 

break;

//////////////////////////

}

}

 

Ale i to nie pomogło :/ Klops jest teraz taki, że Podniosłem broń nr1, wcisnąłem wymuszony debug msg, i starałem się podnieść drugą, nie udało się dalej wcisnąłem debug msg, i w tedy podniosłem broń, ale widzę po kodzie, że dwa razy wykonuje mi kod zmiany broni, coś jest nie tak i już nie wiem co :c

 

GML
Resizing fullscreen window..

Resizing swap chain..

//Sprawdzam czy nie jest pistoletem

//Sprawdzam czy bronie główne są takie same

//Bronie główne są różne

//Sprawdzam czy posiadam główną broń w EQ

//Nie posiadam broni głównej

//Magazynków jest mniej, niż ilość maxymalna więc zabieram wszystko

//Podniosłem broń do pustego slotu.

// Podniosłem jedną, będę podnosił drugą

//Sprawdzam czy nie jest pistoletem

//Sprawdzam czy bronie główne są takie same

//Bronie główne są różne

//Sprawdzam czy posiadam główną broń w EQ

//Posiadam broń główną

//Zaczynam zamianę broni.

//Zapisuję starą ilość ammo

//Zapisuję stare id broni

//Zamieniam broń na nową broń

//Zamieniam ammo na nową wartość ammo

//Sprawdzam Stan Amunicji

//Magazynków jest mniej, niż ilość maxymalna więc zabieram wszystko

//Tworzenie nowej broni:

//Tworzę instancję przez zmienną

//Dodaję do instancji starą amunicję

//Nadaję broni ID

//Ustalam ilość magazynków na 0

//Koniec zamiany broni

//Sprawdzam czy nie jest pistoletem

//Sprawdzam czy bronie główne są takie same

//Bronie główne są różne

//Sprawdzam czy posiadam główną broń w EQ

//Posiadam broń główną

//Zaczynam zamianę broni.

//Zapisuję starą ilość ammo

//Zapisuję stare id broni

//Zamieniam broń na nową broń

//Zamieniam ammo na nową wartość ammo

//Sprawdzam Stan Amunicji

//Magazynków jest mniej, niż ilość maxymalna więc zabieram wszystko

//Tworzenie nowej broni:

//Tworzę instancję przez zmienną

//Dodaję do instancji starą amunicję

//Nadaję broni ID

//Ustalam ilość magazynków na 0

//Koniec zamiany broni

// Podniosłem jedną, będę podnosił drugą

//Sprawdzam czy nie jest pistoletem

//Sprawdzam czy bronie główne są takie same

//Bronie główne są różne

//Sprawdzam czy posiadam główną broń w EQ

//Posiadam broń główną

//Zaczynam zamianę broni.

//Zapisuję starą ilość ammo

//Zapisuję stare id broni

//Zamieniam broń na nową broń

//Zamieniam ammo na nową wartość ammo

//Sprawdzam Stan Amunicji

//Magazynków jest mniej, niż ilość maxymalna więc zabieram wszystko

//Tworzenie nowej broni:

//Tworzę instancję przez zmienną

//Dodaję do instancji starą amunicję

//Nadaję broni ID

//Ustalam ilość magazynków na 0

//Koniec zamiany broni

Attempting to set gamepadcount to 0

---------------------------------------------------------------

minFPS, maxFPS, avgFPS

-31, 1319, 420

---------------------------------------------------------------

---------------------------------------------------------------

minFPS, maxFPS, avgFPS

-31, 1319, 420

---------------------------------------------------------------

 

 

C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.0.7.110/windows/Runner.exe DONE (0)

Igor complete.

elapsed time 00:00:14.9509962s for command "C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.0.7.110/bin/Igor.exe" -options="C:\Users\HieNa\AppData\Local\GameMakerStudio2\GMS2TEMP\build.bff" -- Windows Run started at 06/24/2017 11:08:41

SUCCESS: Run Program Complete

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Że nikt nie zauważył instance_destroy(other);

Powinno być with(other)instance_destroy();

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Można też dodać instance_destroy(other,false), wtedy omija event Destroy, fajna sprawa :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Podejrzewam że gdy tworzysz nowy obiekt broni wywołuje się dla niej collision event a bit dla keyboard pressed jest nadal aktywny i kod wykonuje się jeszcze raz, dodanie zmiennej is_pressed by pomogło.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×