Skocz do zawartości

Problem kolizją, other itp. naraz


Ryuk

Rekomendowane odpowiedzi

Po stworzeniu na obiekcie1, obiekt2 wpisuje w nim przy evencie kolizji z obiektem1 następujący kod:

 

GML
if mouse_check_button_pressed(mb_left) {

if other.sprite_index=spr_glass1

{ other.sprite_index=spr_glass2

other.mask_index=spr_glass2 }

else

 

if other.sprite_index=spr_glass2

{ other.sprite_index=spr_glass3

other.mask_index=spr_glass3 }

else

 

if other.sprite_index=spr_glass3

{ other.sprite_index=spr_glass4

other.mask_index=spr_glass4 }

else

 

if other.sprite_index=spr_glass4

{ other.sprite_index=spr_glass1

other.mask_index=spr_glass1}

 

}

 

Jak w kodzie sprite i maska się zmienia, ale gdy w danym roomie mam więcej niż jedną taką grupkę obiektów, gdy kliknę na jeden z obiektów2 to działa to na wszystkich "grupkach". Co w takim razie robię źle?

Odnośnik do komentarza
Udostępnij na innych stronach

mouse_check_button_pressed sprawdza czy przycisk myszy został kliknięty, ale w całym oknie gry, a nie tylko na obiekcie. By dotyczyło to tylko tego obiektu, który jest pod myszą musisz użyć instance_position.

GML
if( mouse_check_button_pressed( mb_left ) && instance_position( mouse_x, mouse_y, id ) == id ) { ...

Ewentualnie występuje wiele kolizji z obiekt2.

 

Gdybyś wyjaśnił co chcesz osiągnąć byłoby łatwiej.

Odnośnik do komentarza
Udostępnij na innych stronach

(...)gdy kliknę na jeden z obiektów2 to działa to na wszystkich "grupkach".

 

1. nie powinno sie uzywac instrukcji przypisania przy instrukcjach warunkowych.

tzn zamiast = powinienies w if dawac ==

2. jak juz wiesz ze other.sprite to np:spr_glass1 to naturalne w nastepnej linij byloby odnosic sie juz do spr_glass1 a nie kontynuowac other.sprite. Tak byloby chyba przejrzysciej

3 w obiektach do poruszania uzywasz samo x i y czy raczej spr_glass1.x spr_glass1.y? (jesli to drugie to po prostu zmien na x i y)

Odnośnik do komentarza
Udostępnij na innych stronach

1. nie powinno sie uzywac instrukcji przypisania przy instrukcjach warunkowych.

tzn zamiast = powinienies w if dawac ==

Głupoty gadasz. GML akurat miesza składnie kilku języków, więc to co on napisał jest poprawne. W warunkach = oznacza dokładnie to samo co == w C.
Odnośnik do komentarza
Udostępnij na innych stronach

Głupoty gadasz. GML akurat miesza składnie kilku języków, więc to co on napisał jest poprawne. W warunkach = oznacza dokładnie to samo co == w C.

Nie chce wchodzic w bezuzyteczna sprzeczke, ale to ty gadasz głupoty.

uzywanie przypisania = i porównywanie == to kwestia logiki.

Logiczne jest tez ze nie napisalem ze NIE MOZNA tak pisac, tylko nie powinno sie, a to sa dwie rozne kwestie. Nie mozna vs Nie powinno.

Tak samo mozna napisac caly program w jednej linii bo to bedzie poprawne... tylko czy to bedzie czytelne?

Odnośnik do komentarza
Udostępnij na innych stronach

Logiczne jest tez ze nie napisalem ze NIE MOZNA tak pisac, tylko nie powinno sie, a to sa dwie rozne kwestie. Nie mozna vs Nie powinno.
Powiedziałeś właśnie, że nie powinno się używać = w warunkach, w GML, który czerpie ze składni Pascala tak samo jak i z C. GML w warunkach tak samo traktuje == jak i =, dodatkowo dokumentacja nie precyzuje, który z zapisów jest poprawny i powinien być wykorzystywany - pewnie dlatego, że oba są poprawne i nie ma tutaj konkretnych wymagań.

 

Tak samo mozna napisac caly program w jednej linii bo to bedzie poprawne... tylko czy to bedzie czytelne?
Brak związku logicznego z dyskusją.
Odnośnik do komentarza
Udostępnij na innych stronach

(...)

 

Brak zwiazku logicznego z dyskusją :jezor:

 

ps: i przy okazji moze dla ciebie jako stalego wyjadacza w gml to juz nie ma roznicy, ale dla mnie ktory jestem tu od niedawna jak i dla autora z tematu (z 1 postem na koncie) lepiej jest uczyc sie poprawniejszej formy pisania programow i logiczniejszej ;)

Odnośnik do komentarza
Udostępnij na innych stronach

i przy okazji moze dla ciebie jako stalego wyjadacza w gml to juz nie ma roznicy, ale dla mnie ktory jestem tu od niedawna jak i dla autora z tematu (z 1 postem na koncie) lepiej jest uczyc sie poprawniejszej formy pisania programow i logiczniejszej ;)
Człowieku, nie piszesz w C, nie piszesz w Pascalu tylko w GMLu. Jemu to obojętne.

 

I uwierz, nie tylko dla mnie. Dla większości początkujących to bez różnicy i to nawet lepiej. Dla Ciebie ta korzyść, że będzie Ci łatwiej uczyć się C czy PHP czy innego C like, a minus, że przy Pascalu będziesz szukał błędów przy warunkach.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
mouse_check_button_pressed sprawdza czy przycisk myszy został kliknięty, ale w całym oknie gry, a nie tylko na obiekcie. By dotyczyło to tylko tego obiektu, który jest pod myszą musisz użyć instance_position.
GML
if( mouse_check_button_pressed( mb_left ) && instance_position( mouse_x, mouse_y, id ) == id ) { ...

Ewentualnie występuje wiele kolizji z obiekt2.

 

Gdybyś wyjaśnił co chcesz osiągnąć byłoby łatwiej.

 

Wydaje mi się, że można też zrobić tak:

 

GML
if( mouse_check_button_pressed( mb_left ) && position_meeting( mouse_x, mouse_y, self ) ) { ...
Odnośnik do komentarza
Udostępnij na innych stronach

Wydaje mi się, że można też zrobić tak:
GML
if( mouse_check_button_pressed( mb_left ) && position_meeting( mouse_x, mouse_y, self ) ) { ...
Dokładnie!

 

I wiesz co, z ciekawości sprawdziłem obie metody wydajnościowo. Zgadnij, która była szybsza. Twoja. O 0,6%, GM jest śmieszny. :)

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję bardzo! Pomysł Tymona jak i gnyska działa dobrze i udało się osiągnąć efekt, który był oczekiwany. Co do sprawy taxi_driver'a nie będę się zagłębiał, ponieważ jestem jeszcze bardzo zielony w tych sprawach (chociaż już troszkę mam styczności z programowaniem). Jeszcze raz wielkie dzięki :D

Odnośnik do komentarza
Udostępnij na innych stronach

Wiecie co jest jeszcze śmieszniejsze że korzystanie z stałych jest wolniejsze niż z globalnych tymczasówek var

var jest szybsze o jakieś 3,4% w GM8.1

 

w poniższym teście tak jak podzieliłem time_diff/ time_diff2 to wyszło 3,4%

GML
time = current_time;

 

repeat 100000000

//------------------------------------------------------------------------------------------------------------------

var _x;

_x = 2323;

jakis_wzorek = _x +_x *_x - _x;

 

//------------------------------------------------------------------------------------------------------------------

time_diff = current_time - time;

time2 = current_time;

 

 

repeat 100000000

//------------------------------------------------------------------------------------------------------------------

jakis_wzorek = c_stala +c_stala *c_stala - c_stala;

 

//------------------------------------------------------------------------------------------------------------------

time_diff2 = current_time - time2;

c_stala = 2323

Odnośnik do komentarza
Udostępnij na innych stronach

GML
time = current_time;

 

repeat 100000000

//------------------------------------------------------------------------------------------------------------------

var _x;

_x = 2323;

jakis_wzorek = _x +_x *_x - _x;

 

//------------------------------------------------------------------------------------------------------------------

time_diff = current_time - time;

time2 = current_time;

 

 

repeat 100000000

//------------------------------------------------------------------------------------------------------------------

var _jakas_kompletnie_niepotrzebna_tymczasowa;

jakis_wzorek = c_stala +c_stala *c_stala - c_stala;

 

//------------------------------------------------------------------------------------------------------------------

time_diff2 = current_time - time2;

Taaa... :gnysek: :borek: :ranmus: :psichix:
Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

To ja podpowiem: (ofc nie zapomnijcie dodać stałej)

 

GML
time = current_time;

 

repeat 100000000

//------------------------------------------------------------------------------------------------------------------

var _x;

_x = 2323;

jakis_wzorek = _x +_x *_x - _x;

show_message(string(jakis_wzorek));

 

//------------------------------------------------------------------------------------------------------------------

time_diff = current_time - time;

time2 = current_time;

 

 

repeat 100000000

//------------------------------------------------------------------------------------------------------------------

jakis_wzorek = c_stala +c_stala *c_stala - c_stala;

show_message(string(jakis_wzorek));

 

//------------------------------------------------------------------------------------------------------------------

time_diff2 = current_time - time2;

Odnośnik do komentarza
Udostępnij na innych stronach

No co wynik jest taki sam, nie rozumiem teraz o co wam chodzi.

edit: Jedyna różnica jest taka że na 1 show_message czekam sekundę a to drugie show_message zamula 14 sekund. Wzór jest przecież taki sam.

Ja się zdziwiłem gdy Tymon dodał zupełnie bezcelowe var ( które teoretycznie nic nie powinno robić ) to te 14 sekund skróciło się do 1.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Widzisz Platyna, mówiłem... Naprawdę dałem tak dużą podpowiedź, ze już większej się nie da, wystarczy odpalić mój kod i od razu widać, co jest źle.

 

Edit: no dobra,

 

GML
repeat 10000000 {

var _x;

}

_x = 2323;

jakis_wzorek = _x +_x *_x - _x;

 

Teraz widzisz, co źle napisałeś ? :P

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