H2S04 Opublikowano 22 Czerwca 2017 Udostępnij Opublikowano 22 Czerwca 2017 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> Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 23 Czerwca 2017 Udostępnij Opublikowano 23 Czerwca 2017 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
H2S04 Opublikowano 23 Czerwca 2017 Autor Udostępnij Opublikowano 23 Czerwca 2017 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 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
H2S04 Opublikowano 24 Czerwca 2017 Autor Udostępnij Opublikowano 24 Czerwca 2017 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 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 26 Czerwca 2017 Udostępnij Opublikowano 26 Czerwca 2017 Że nikt nie zauważył instance_destroy(other); Powinno być with(other)instance_destroy(); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Uzjel Opublikowano 26 Czerwca 2017 Udostępnij Opublikowano 26 Czerwca 2017 instance_destroy(other) jest ok :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 26 Czerwca 2017 Udostępnij Opublikowano 26 Czerwca 2017 Aha dobra :D Nie wiedziałem że zmienili to w dwójce. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Uzjel Opublikowano 26 Czerwca 2017 Udostępnij Opublikowano 26 Czerwca 2017 Można też dodać instance_destroy(other,false), wtedy omija event Destroy, fajna sprawa :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 28 Czerwca 2017 Udostępnij Opublikowano 28 Czerwca 2017 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. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę