IPB

Witaj Gościu ( Zaloguj | Rejestruj )

> Uwaga!

Uwaga!
To forum służy do zamieszczania gotowych przykładów i silników, nie do poszukiwań!

 
Reply to this topicStart new topic
Prosty trick na sprawdzanie która instancja jest na wierzchu :)
MaxGaming
post 8.11.2016 - 3:25
Post #1


Forum Veteran
*****

Wiek: ?
Grupa: Użytkownicy
Postów: 450
Dołączył: 7.07.2013
Uploader
Ostrzeżenia:
(0%) -----


Witam GMClany,
chciałbym Wam przekazać banalny "trick" na sprawdzanie która instancja jest wyżej, mimo takiego samego depthu.
Większość z Was pewnie o tym wie, ale sam kilka lat temu się nad tym głowiłem, a dopiero dziś gdy znów stanąłem przed tym problemem uświadomilem sobie jak proste jest rozwiązanie tongue2.gif

Problem:
Mamy kilka instancji o takiej samej wartości zmiennej Depth. Mimo to naturalne jest to, że jeden jest wyżej inny niżej.
Jak określić który z nich jest w takim razie na dole, a który na górze?

Trochę teorii:
Depth jak wiemy określa to które instancje maja być na wierzchu, a które pod spodem czym większy depth, tym niżej będzie instancja. Co się dzieje w takim razie gdy depth jest taki sam, czy gm sobie jakoś to ustala specjalnie? Otóż absolutni nie, gm po prostu robi co ma robić - rysuje je z tym samym depthem. I tu pojawia się pytanie dlaczego, więc coś jest wyżej, a coś niżej? No więc zróbcie sobie sami taki eksperyment, rysując dwa prostokąty nachodzące na siebie w dowolnym języku programowania(może być i gm w draw w jednej instancji). Ten który narysujemy później po prostu zakryje ten pierwszy. Jest w tym jakaś logika prawda?
Co to ma w takim razie do naszego problemu? No więc GM robi dokładnie to samo. Rysuje instancje po prostu po kolei i to jest właśnie klucz do rozwiązania tego problemu smile2.gif A kolejność instancji określa zmienna id... coś już Wam świta? Wystarczy sprawdzić która instancja ma najmniejsze id i już wiemy która jest na wierzchu smile.gif

Rozwiązanie:
skrypt porównujący dwie instancje i zwracający tą na wierchu:
GML
///instance_check_real_depth(instance, instance)
if(argument0.depth != argument1.depth)
{
if(argument0.depth < argument1.depth)
{
return argument0;
}else{
return argument1;
}
}else{
if(argument0.id < argument1.id)
{
return argument0;
}else{
return argument1;
}
}


@ps: po prostu starałem się zrobić mini-tutka dla początkujących i opisać to jak najbardziej zrozumiale, żeby nie napisać tylko kodu, ale także wytłumaczyć dlaczego tak się dzieje. Nie wiem czy zrobiłem to dobrze dlatego liczę na Wasze opinie smile2.gif
Mam nadzieję że komuś kiedyś się to przyda ;p
Aha i wiem że możnaby to rozpisać w jednym ifie, ale myślę że tak jest o wiele czytelniej dla początkującego użytkownika ;p
Go to the top of the page
 
+Quote Post
post 8.11.2016 - 3:25
Post #





Wiek:



Uploader


Pani kontekstowa pokazuje swe wdzięki tylko w Valhalli lub wszędzie jeżeli nie jesteś zalogowany(a)! :3
Go to the top of the page
 
Quote Post
Uzjel
post 8.11.2016 - 9:01
Post #2


aka Jezuel Santi
Ikona grupy

Wiek: 25 lat
Grupa: Administratorzy
Postów: 1,829
Dołączył: 28.07.2007
Skąd: Warszawa
Team: OxGames

Uzjel23


Nagrody:
Najlepsza gra (CA 2011)
Najlepsza gra (CA 2010)

Uploader


Fajnie smile.gif

Popracował bym trochę nad czytelnością kodu, wiem że niby piszesz dla początkujących, ale w ten sposób raczej nie powinno się pisać - uczmy od razu lepszych rozwiązań.

Proponuję zabawę: ktoś chciałby/spróbować napisać to ładniej/krócej.

Twój kod jest oczywiście logiczny i będzie działał, ale może ktoś pokaże inne sposoby zapisu (np używając 1 raz return).


--------------------
Twój Administrator <3
Go to the top of the page
 
+Quote Post
MaxGaming
post 8.11.2016 - 11:08
Post #3


Forum Veteran
*****

Wiek: ?
Grupa: Użytkownicy
Postów: 450
Dołączył: 7.07.2013
Uploader
Ostrzeżenia:
(0%) -----


CYTAT(Uzjel @ 8.11.2016 - 9:01) *
Fajnie smile.gif

Popracował bym trochę nad czytelnością kodu, wiem że niby piszesz dla początkujących, ale w ten sposób raczej nie powinno się pisać - uczmy od razu lepszych rozwiązań.

Proponuję zabawę: ktoś chciałby/spróbować napisać to ładniej/krócej.

Twój kod jest oczywiście logiczny i będzie działał, ale może ktoś pokaże inne sposoby zapisu (np używając 1 raz return).

Usiäde do kompa to napiszę i drugą wersję kodu, w jednym return ;p

@edit o to Ci chodziło? Nie testowałem, ale mam nadzieję że działa dobrze
GML
///instance_check_real_depth(instance, instance)
if((argument0.depth != argument1.depth && argument0.depth < argument1.depth) || (argument0.id < argument1.id && argument0.id < argument1.id))
{
return argument0;
}else{
return argument1;
}
Go to the top of the page
 
+Quote Post
I am vader
post 8.11.2016 - 19:50
Post #4


Wiadro of Antytrollerstwo
Ikona grupy

Wiek: 21 lat
Grupa: Moderatorzy
Postów: 1,684
Dołączył: 24.07.2008
Skąd: Gdynia

SSPH


Nagrody:
Uzytkownik roku (CA 2015)

Uploader
Ostrzeżenia:
(0%) -----


Tak też można.
GML
if argument0.depth=argument1.depth return min(argument0,argument1);
else if argument0.depth < argument1.depth return argument0;
else return argument1;


Mniej w oczy kole i korzysta z tej samej logiki.


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

5678(ale ten czas leci!) lat później nadal go kaleczę.
GM GMS GML GMC Game Maker Studio Language Community Polska
Unity Tutoriale Poradniki Silniki Gotowce Dyskusje Pomoc Pytania Początkujący Zaawansowany Forum
Mój nick jest głupi. Ranga też. Ale to kawał forumowej histori więc zostanie tak na zawsze.
Go to the top of the page
 
+Quote Post
MaxGaming
post 8.11.2016 - 20:03
Post #5


Forum Veteran
*****

Wiek: ?
Grupa: Użytkownicy
Postów: 450
Dołączył: 7.07.2013
Uploader
Ostrzeżenia:
(0%) -----


CYTAT(I am vader @ 8.11.2016 - 19:50) *
Tak też można.
GMLif argument0.depth=argument1.depth return min(argument0,argument1);
else if argument0.depth < argument1.depth return argument0;
else return argument1;

Mniej w oczy kole i korzysta z tej samej logiki.

Tak, ale więcej ifów i w dodatku funkcja min raczej powoduje że jest to mniej optymalne rozwiązanie, ale to już by musiał ktoś sprawdzić ;p
Go to the top of the page
 
+Quote Post
I am vader
post 8.11.2016 - 20:41
Post #6


Wiadro of Antytrollerstwo
Ikona grupy

Wiek: 21 lat
Grupa: Moderatorzy
Postów: 1,684
Dołączył: 24.07.2008
Skąd: Gdynia

SSPH


Nagrody:
Uzytkownik roku (CA 2015)

Uploader
Ostrzeżenia:
(0%) -----


Test wykonany poprzez wykonanie każdego z kodów po 30 tysięcy razy (Mikrosekundy):
Test #1
Max: 19698
LeD: 15277
Test #2
Max: 20191
LeD: 14837
Test #3
Max: 19748
LeD: 15226
Test #4
Max: 20021
LeD: 15076
Test #5
Max: 19868
LeD: 15270


Obawiam się, że mój jest szybszy.

Kod (GMS): http://puu.sh/sb5mt/3b2ddb200a.gmz

Edit: Zapomniałem dodać: Każde and czy or tworzy wirtualnie ify. Technicznie użyłeś ich wiele wiele więcej niż ja.


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

5678(ale ten czas leci!) lat później nadal go kaleczę.
GM GMS GML GMC Game Maker Studio Language Community Polska
Unity Tutoriale Poradniki Silniki Gotowce Dyskusje Pomoc Pytania Początkujący Zaawansowany Forum
Mój nick jest głupi. Ranga też. Ale to kawał forumowej histori więc zostanie tak na zawsze.
Go to the top of the page
 
+Quote Post
gnysek
post 9.11.2016 - 13:34
Post #7


Emerytowany Admin
************

Wiek: 29 lat
Grupa: Użytkownicy
Postów: 9,030
Dołączył: 2.06.2004
Skąd: Banino / Trójmiasto
Team: Gear-Studio

gnysek


Nagrody:
Najbardziej pomocny uzytkownik (CA 2011)

Uploader
Ostrzeżenia:
(0%) -----


Dlatego właśnie w GM2 wprowadzono layery w roomach, żeby GM nie musiał sortować dephtów, a potem ID. Odpada jedno sortowanie (znaczy jest, ale tylko jak tworzymy nowy layer albo korzystamy z depth).

Edit: Vader, ostatniego "else" nie musi być. Środkowego też niekoniecznie, pytanie, jak to wpływa na czas wykonania.


--------------------
GMCLAN NA FACEBOOKU: facebook.com/GMCLAN

Aktualne gry w PlayStation Plus

Obecne Projekty:
[||||||||||] Word Memo - 35%
[||||||||||] Digy Digy Dig - 30% [on hold]
[||||||||||] Almora Origins - 50%
Go to the top of the page
 
+Quote Post
I am Lord
post 9.11.2016 - 15:31
Post #8


Trzymam Sword
Ikona grupy

Wiek: 27 lat
Grupa: ♔ Zwycięzca CA 2016 ♔
Postów: 4,540
Dołączył: 16.12.2005
Skąd: Piła

Huder


Nagrody:
Mistrz Ligi24 (2013)

Uploader
Ostrzeżenia:
(0%) -----


No a co jak się nałożą obiekty z tego samego layeru na siebie? tongue2.gif


--------------------
Acziwment unloked
Ciekawsze moje gry:
Ukończone: NewtonPong Android
Nieukończone:Maze Strategy
Compostowe: DungeonMazeShooter, ScorchedTanks, Atargatis, RedvsBlue, Wspomnienia
Go to the top of the page
 
+Quote Post
I am vader
post 9.11.2016 - 20:43
Post #9


Wiadro of Antytrollerstwo
Ikona grupy

Wiek: 21 lat
Grupa: Moderatorzy
Postów: 1,684
Dołączył: 24.07.2008
Skąd: Gdynia

SSPH


Nagrody:
Uzytkownik roku (CA 2015)

Uploader
Ostrzeżenia:
(0%) -----


CYTAT(gnysek @ 9.11.2016 - 13:34) *
Edit: Vader, ostatniego "else" nie musi być. Środkowego też niekoniecznie, pytanie, jak to wpływa na czas wykonania.

Racja, przeciez i tak return konczy wykonywanie kodu. Jakis mi z glowy wypadlo tongue2.gif

CYTAT(I am Lord @ 9.11.2016 - 15:31) *
No a co jak się nałożą obiekty z tego samego layeru na siebie? tongue2.gif

To pewnie po ID sortuje.


Edit:
Z ciekawości sprawdziłem wersję Gnyska, musiałem podkręcić cykle z 30K do 300K i ilość prób z 5 do 20 żeby móc zobaczyć różnicę, bo inaczej mają zbyt podobne czasy.
Rzeczywiście wydaje się być szybszę. Jakby ktoś miał pomysł na jeszcze mocniejsze wyciśnięcie tej funkcji, zamieniam się w słuch.
Edit 2:
Po kilku chwilach kopiujwklejki po usunięciu else jest średnio o 0.8% szybciej.
Tak, zrobiłem to z czystej ciekawości biggrin.gif


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

5678(ale ten czas leci!) lat później nadal go kaleczę.
GM GMS GML GMC Game Maker Studio Language Community Polska
Unity Tutoriale Poradniki Silniki Gotowce Dyskusje Pomoc Pytania Początkujący Zaawansowany Forum
Mój nick jest głupi. Ranga też. Ale to kawał forumowej histori więc zostanie tak na zawsze.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 użytkownik(ów) przegląda ten temat (1 gości i 0 anonimowych użytkowników)
0 Użytkownicy:

 



RSS Wersja Lo-Fi Aktualny czas: 28.05.2017 - 5:54