Skocz do zawartości

Akcja kliknięcia


Rekomendowane odpowiedzi

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

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

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

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

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

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

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

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

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

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

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

  • 2 tygodnie później...

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

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

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

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

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

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