Qbi Wan Opublikowano 7 Maja 2014 Udostępnij Opublikowano 7 Maja 2014 Siemanko! Jak w opisie: gdy kliknę raz ma być jedna akcja; gdy kliknę dłużej, po chwili cała seria. po eksperymentach doszedłem do tego: obj_button> left press> code: GML page_number+=1; //po 1. naciśnięciu zmienia stronę o "1" steps=1; while steps=1//tu zawsze za 1. razem true { if mouse_check_button_released(mb_left)//jeżeli guzik jest już puszczony... { steps=0;//koniec "while" } else//w przeciwnym wypadku { page_number+=1;//znowu zwiększ numer strony o 1 steps=1;//to w sumie niepotrzebne, ale nie zaszkodzi;P } } exit;//w przypadku gdy pętla się kończy upewniam się że to wszystko</span> Mimo to zawsze gdy zrobię event pressed zmienia page_number TYLKO raz, a button leci jak głupie. Dlaczego to nie działa jak mi się wydaje że powinno? Znacie lepsze rozwiązanie? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 7 Maja 2014 Udostępnij Opublikowano 7 Maja 2014 Pisane z głowy: GML (step) if(mouse_check_button_pressed(mb_left)) { page_number+=1; alarm[0]=30//czas po jakim ma zacząć przesuwać } GML (alarm0) if(mouse_check_button(mb_left)) { alarm[0]=3//Jak szybko ma przeskakiwać page_number+=1; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Qbi Wan Opublikowano 7 Maja 2014 Autor Udostępnij Opublikowano 7 Maja 2014 Fajnie :D A da się bez alarmu jakoś? Żeby w jednym skrypcie było? Dlaczego ten mój nie działa? Na pierwszy rzut oka się zgadza. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 7 Maja 2014 Udostępnij Opublikowano 7 Maja 2014 Twój wykonuje sie tylko w left press gdzie nie możesz sprawdzić czy jest mouse_check_button_released(mb_left). Poza tym używasz pętli while która wykonuje się w obrębie jednego step. Zaden inny kod nie będzie się wykonywał (sprawdzenie puszczania myszy też) dopóki się ona nie skończy. Gdybyś tam dał if zamiast while i wsadził to w step, to może by działało, ale zmieniało by stronę co step i od razu, co nie jest dorym rozwiązaniem. Chyba nawet pojedyncze kliknięcie zmieniało by zawsze o 2 i więcej stron. ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Qbi Wan Opublikowano 7 Maja 2014 Autor Udostępnij Opublikowano 7 Maja 2014 Ten "press" ma sens ( :sp_ike: ) Ale czy jak wstawię "button" nie powinno działać? "whilewhile" jest pierwszą i ostatnią pętlą, więc jeżeli wykonuje się w obrębie step to gdy wykryje "released"released" robi"steps=0" i powinno uciec z pętli. Jeżeli nie, to jak można ją przerwać? Czy użyć innej pętli niż "while"? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 7 Maja 2014 Udostępnij Opublikowano 7 Maja 2014 W while nie wykryje puszczania myszki bo ono wykona się dopiero po skończeniu pętli (w następnym step). Wyraźnie widać że nie wiesz jak działają pętle i główna pętla gry. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Qbi Wan Opublikowano 7 Maja 2014 Autor Udostępnij Opublikowano 7 Maja 2014 Do tej pory myślałem że wiem :jezor: Z tej rozmowy wnioskuję że pętla (nie wiem czy każda, czy tylko while) jest w stanie sprawdzić tylko to co miało miejsce w momencie jej wywołania i nie ogranicza się do jednego raza na step. Zakładam też że mój wniosek jest pewnie błędny i z tej racji chętnie przyjmę odnośnik do jakiejś lektury na ten temat :lol: Czytałem kiedyś Contents'a od GM8, ale nie pamiętam czy coś tam o tym było. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 7 Maja 2014 Udostępnij Opublikowano 7 Maja 2014 To co musisz zrozumieć to pętla główna GM (Event Order). Jeden step w grze to jedno wykonanie pętli. Eventy potem wykonują się wg swojej ustalonej kolejności, i każdy dla każdego instance w room .Tu coś znalazłem. Jeżeli używasz pętli to ona musi się w pełni wykonać. Dopiero po jej skończeniu ten sam event wykona się w reszcie instance, a potem przejdzie do następnego eventu. Więc jeżeli robiłeś pętlę w 'Keyboard and mouse' to nie wykonał się jeszcze 'Keyboard and mouse release' więc gra nie wie o tym. W step prawie mógłbyś sprawdzić czy został puszczony klawisz, ale to wciąż byłby ten sam step. To samo wykonanie pętli głównej w którym nacisnąłeś ten klawisz. No i taka pętla po prostu zamroziłaby grę. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Qbi Wan Opublikowano 7 Maja 2014 Autor Udostępnij Opublikowano 7 Maja 2014 Czyli jeden rozpoczęty scrypt nie może działać w czasie kilku stepów. Jego działanie musi się skończyć w tym stepie w którym się zaczęło, w przeciwnym wypadku (jeżeli dotyczy keyboard & mouse) nie przejdzie do press, release, dalej (zgodnie z linkiem) end step, draw, game end, etc, i stworzy ryzyko zamrożenia wszystkiego. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 7 Maja 2014 Udostępnij Opublikowano 7 Maja 2014 Tak. Akcja musi się po prostu skończyć, aby przejść do następnej. Dlatego np używanie draw_getpixel() jest bardzo powolne bo GM czeka aż się to wykona. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 7 Maja 2014 Udostępnij Opublikowano 7 Maja 2014 ... A da się bez alarmu jakoś? Żeby w jednym skrypcie było?... bez alarmu i v jedynym scripcie mozna naprzyklad tak:GML if (!variable_local_exists( "_mouse_pressed" ) ) {_mouse_pressed=false; }; // zamiast napisania v eventu create: _mouse_pressed=false if (mouse_check_button_released(mb_left) && _mouse_pressed) { page_number+=1; } // page_number+=1; akcja wykonywana tylko raz po kliknienciu LMB else if (mouse_check_button_pressed(mb_left) ) { _mouse_pressed=true; }; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 8 Maja 2014 Administratorzy Udostępnij Opublikowano 8 Maja 2014 W GM nic nie dzieje się równolegle. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Qbi Wan Opublikowano 8 Maja 2014 Autor Udostępnij Opublikowano 8 Maja 2014 Dobrze powiedziane :D GMS nie rozpoznaje funkcji "variable_local_exists" :( W contents nie mogę znaleźć niczego do zastąpienia. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 8 Maja 2014 Udostępnij Opublikowano 8 Maja 2014 To dodaj w create. -_- Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 8 Maja 2014 Udostępnij Opublikowano 8 Maja 2014 Dobrze powiedziane :D GMS nie rozpoznaje funkcji "variable_local_exists" :( W contents nie mogę znaleźć niczego do zastąpienia.niewidzialem v pierwszym postu, ze pytanie dotyczy GM:s :) chcialem pokazac, ze mozna to ladnie napisac v GM 8.1(i mniej) jak pisze Threef, nawet napisalem zmianke v komentu przykladu. niestety niebedzie juz cale v jednym scripcie Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Qbi Wan Opublikowano 8 Maja 2014 Autor Udostępnij Opublikowano 8 Maja 2014 Sorki, teraz dopiero doczytałem że powinienem podać wersję... Zresztą, sam powinienem na to wpaść :P A w jakim evencie miałbym to dodać? Na początku myślałem że w mouse left button, ale wtedy chyba nie wykryje mi released... To by chyba przeczyło temu co wczoraj pojąłem :( Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 8 Maja 2014 Udostępnij Opublikowano 8 Maja 2014 ogolnie to raczej event STEP. (mozna by i jakies inne eventy, ale to lepiej wiedziec juz ktore i dlaczego) tez masz 2 mozliwosci: 1, przyklad umiescisz do scripts i ten script juz mozesz wolac z eventu STEP nawet kilka razy lub innego eventu, jak bedzie trzeba 2, przyklad umiescisz do eventu STEP i bezdzie dostepny tylko w tym miejscu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Qbi Wan Opublikowano 22 Maja 2014 Autor Udostępnij Opublikowano 22 Maja 2014 A można zamienić "variable_local_exists" na "is_undefined(n)"? nie wiem czy to działa tylko przy ds_ czy przy innych zmiennych też, chociaż jest taki przykład dla podobnej funkcji: GML if is_string(val) { name = "Player: " + val; } ...więc chyba do wszystkich zmiennych :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 22 Maja 2014 Udostępnij Opublikowano 22 Maja 2014 na 99% niemozna, chyba bys zapisywal zmienno do file, ale to u gm:s tez niejest zawsze tak proste :) powinenes byc absolutnie pewny przy wywolaniu scriptu, ze zmienna jest, i ma wymagano wartosc. trudniejsze, ale nieniemozliwe. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Qbi Wan Opublikowano 24 Maja 2014 Autor Udostępnij Opublikowano 24 Maja 2014 Zmieniłem koncepcję :lol2: Teraz obj next i prev_button mają wspólny kod w STEP: GML if(!mouse_check_button(mb_any)) { button_pressing=false } if(mouse_check_button(mb_left) && point_in_triangle(mouse_x,mouse_y, x,y,x+(5*-(argument0)),y+5,x,y+10)) { if(button_pressing=false) { page_number+=argument0;// page_number+=1; akcja wykonywana tylko raz po kliknienciu LMB date_time_pressed=date_current_datetime() } button_pressing=true if((date_second_span(date_time_pressed, date_current_datetime()))>=1) { page_number+=argument0; } } gdzie w zależności od guzika argument0 to 1 lub -1. Do tego w Draw rysuję trójkącik i wszystko działa gites :) Jest tylko jeden mały problem: ta sekunda różnie wygląda, pewnie zależy to od fps'ów. Gdzie najlepiej wpisać delta_time? Czy to coś pomoże? Może zwiększyć ilość sekund? Z jaką dokładnością date_span_time liczy sekundy? Porówna mi 1,5? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 25 Maja 2014 Udostępnij Opublikowano 25 Maja 2014 current_time liczy czas po milisec. w ostatnich postach pare razy o nim pisalem :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 25 Maja 2014 Udostępnij Opublikowano 25 Maja 2014 create: starttime = current_time; draw: var time = current_time - starttime; draw_text(x,y,"Czas:"+string(floor(starttime/1000)); Ta-da, najpeorstrze dokladne liczenie sekund. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Qbi Wan Opublikowano 25 Maja 2014 Autor Udostępnij Opublikowano 25 Maja 2014 Tak nad tym myślałem, ale nie będzie dużo kłopotów żeby przy długim czasie działania programu zapisać duże wartości (4h w milisekundach)? create: starttime = current_time; Mój kod omija potrzebę wstawiania event'u Create :jezor: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 25 Maja 2014 Udostępnij Opublikowano 25 Maja 2014 Nie targuj sie czy twoj kod jest lepszy, bo dodanie eventu create i tak jest lepsze niz ta wiocha ktora teraz masz. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 25 Maja 2014 Udostępnij Opublikowano 25 Maja 2014 1, limit czasu dokladnie nieznam. bedzie to duzo-batjowa liczba :) coz powinno wystarczycz na weilu dni 4h= tylko 14,4 M milisec po napelnienu wszystkych bajtow napewno dojdzie do liczenia od 0. coz doprowadzi do 1 blednego testu time co x-dni jesli masz w planu dokonac kontroli latu na Marsa za pomoco PC i uzyc current_time, to poprostu prowadz dodatkowo kontrole za pomoco innych czasowych funkcji 2, BTW: przypadkiem wpadlem na GM:S funkcje get_timer() This function returns the time that your game has been running on the chosen platform in microseconds (there are 1 million microseconds per second). 3, ostatecznie nalezy wybor algoritmow tylko do ciebie :) 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ę