Zarejestruj Zapomniałeś hasła?
Drobne, ale częste i irytujące problemy
Dodany 20 września 2009, 15:03 Odsłon 5555
Edytory Ocena
 (16 głosów)
Kategoria Silnik Poziom (Dla n0... początkujących)
Oto 10 drobnych, ale częstych i irytujących problemów, z którymi często trzeba się zmagać, bo ich rozwiązania, choć proste, szybko wylatują z głowy. Być może warto dodać tę stronę do zakładek:)

1. Kursor skokowy
"Zaturas" napisał(a):
Koledzy! mam wyjatkowo wkurzajacy problem... No tak chodzi o to ze znowu nie moge zrobic ruch myszka 32x32 jak w mmfie no wiecie przestawianie obiektow

Rozwiązanie: Należy ustawić pozycję X obiektu kursora na ((XMouse+16)/32)*32 i analogicznie ustawić pozycję Y.

2. Kąt obrotu (angle)
Obiekty takie jak obiekt aktywny, Active Picture czy Lens interpretują podawany kąt normalnie (zwiększa się przeciwnie do ruchu wskazówek zegara, a 0 jest na godzinie trzeciej).
Niestety, z nieznanego powodu obiekt Alpha Channel liczy to odwrotnie (trzeba podać przeciwny kąt, żeby obrócić poprawnie).
Co gorsza, trzeba pamiętać o tym, że zmienna Y rośnie w dół, a nie w górę, co sprawia, że żeby poprawnie poruszać obiektem za pomocą funkcji trygonometrycznych (ruch 360), trzeba podać przeciwny kąt (przynajmniej przy funkcji sinus).
Advaced Direction object z kolei już bierze tą odwrotność pod uwagę przy obliczaniu przesunięć w ruchu i należy tam normalnie podawać kąt.
W Lua jednostką miary kątowej jest radian. Kąt w stopniach należy pomnożyć przez 0.01745, aby uzyskać kąt w radianach.

3. Nieniszczone obiekty w pętli
Obiekty nie mogą być zniszczone w szybkiej pętli. Jeśli zrobisz taką akcję, zadziała ona dopiero po zakończeniu pętli. Jeśli np. uruchomisz pętlę 100 razy i w każdym cyklu będziesz przesuwał pocisk o 1 px w prawo, to jeśli w zasięgu 100px jest dwóch przeciwników, którzy są niszczeni po trafieniu (tak jak pocisk) - zginą obaj, bo pocisk zostanie zniszczony dopiero na końcu.
Rozwiązanie: należy przerwać pętlę (stop loop), a jeśli to niemożliwe (np. pocisków jest dużo i trafienie jednego nie powinno hamować ruchu reszty), to pocisk po trafieniu powinien być wykluczany z pętli, np. poprzez dodanie do zdarzeń pętli warunku sprawdzającego, czy flaga 0 pocisku jest wyłączona, a do zdarzenia kolizji dodatkowo (poza warunkiem) - przez dodanie akcji ustawiającej tę flagę na włączoną.

4. Licznik lub tekst nad obiektem aktywnym
Liczniki i tekst (String object) domyślnie sa traktowane jak tło i nie mogą zachowywać się jak normalny interfejs, bo nie mogą być wysunięte na przód.
Rozwiązanie: są dwa - wystarczy odznaczyć we właściwościach obiektu opcję "display as background"; drugie rozwiązanie jest o wiele skuteczniejsze, bo nowe obiekty też nie będą "wystawać", ale możliwe tylko w TGF2/MMF2. Należy skorzystać z warstw (Layers): stworzyć drugą (lub kolejną) i przenieść doń wszystkie elementy interfejsu.

5. Nieznikające wklejki do tła
Starsze kliki potrafią tylko wklejać obraz do tła (Paste image into Backdrop), co jest nietrwałe. Przewinięcie poza ekran i powrót, minimalizacja i maksymalizacja czy też specjalna do tego akcja "redraw frame" (Fast Loop) powodują zniknięcie takich wklejek. Nowsze kliki mają dodatkowo akcję dodającą obiekt tła (Add Backdrop) - wtedy efekt będzie permanentny.
(więcej)

6. Błędy przy chowaniu do zasobnika
Przy chowaniu okna do zasobnika systemowego mogą powstawać błędy, głównie w obiektach systemowych (edit box, przyciski, listy rozwijane). Można je ominąć korzystając z dodatku Tray Icon do stworzenia ikony w zasobniku i Window object do chowania okna. Przy kliknięciu ikony w zasobniku należy przełączyć flagę, której pozycja wyłączona oznacza widzialność okna, a włączona - niewidzialność. Uwaga: sam dodatek Tray Icon jest kłopotliwy i nawet bez chowania okna może powodować inne błędy. Używaj go tylko, jeśli nie ma innego wyjścia i sprawdź, czy nie pojawiają się błędy z obsługą m.in. combo boxów.
(więcej)

7. Flaga blokująca
Powiedzmy, że chcesz, aby na wciśnięcie klawisza X główny bohater-wampir zamieniał się w nietoperza i odwrotnie. Pierwsze zdarzenie będzie sprawdzać, czy wciśnięto X i czy bohater jest wampirem, po czym zamieni go w nietoperza. Drugie zdarzenie sprawdzi, czy wciśnięto X i czy bohater jest nietoperzem - i zamienia go w wampira. Tu pojawia się problem - spełnione warunki pierwszego zdarzenia spowodują akcje, które sprawią, że spełnione będą warunki drugiego. Wampir natychmiast dwukrotnie się przemieni i zostanie wampirem. No i dostanie kołkiem, nieszczęśnik.
Aby uratować wampira przed śmiercią, możesz zastosować jedno zdarzenie, które przy wciśnięciu X przełącza flagę (np. 0), której wartość dopiero w dwóch kolejnych zdarzeniach decyduje o postaci bohatera. Niestety, to rozwiązanie działa tylko wtedy, gdy postaci są dwie (bo flaga posiada tylko 2 wartości - może być włączona lub wyłączona) - gdy wampir chce zamieniać się kolejno w nietoperza i ducha, to ma problem. Można też wykorzystać zmienną, ale co będzie, jak ich zabraknie? Z pomocą przybywa flaga blokująca.
Rozwiązanie polega na tym, aby zrobić 3 zdarzenia sprawdzające, czy wciśnięto X, czy bohater ma postać kolejno wampira, nietoperza i ducha oraz, dodatkowo, czy flaga 0 jest wyłączona (ten warunek nie musi być obecny przy pierwszym zdarzeniu, bo jest właśnie pierwsze i na pewno flaga jest dobrze ustawiona). Akcje to odpowiednie przemiany, ale dodatkowo ustawianie flagi 0 na włączoną (ponownie, tej akcji nie musi być w ostatnim zdarzeniu). Na samym końcu trzeba zrobić zdarzenie wyłączające flagę 0. Voila!
(więcej)

8. Losowość
Kilka ważnych zasad obowiązujących przy losowaniu:
Minimalna wylosowana wartość to 0. Aby wylosować liczbę 0 lub 1: random(2)
Aby wylosować liczby z jakiegoś zakresu, np. 10-30, trzeba dodać jego dolną granicę do funkcji random od różnicy między granicami plus jeden, np. 10+random(21); bez dodania jedynki maksymalną wylosowaną wartością byłoby 19, co dałoby zakres 10-29.
Aby wylosować liczbę zmiennoprzecinkową z danego zakresu, trzeba wyobrazić ją sobie jako ułamek zwykły. Np. chcemy wylosować wartość od 0,1 do 0,3: są to odpowiednio ułamki 1/10 oraz 3/10 lub też 10/100 oraz 30/100 (dla większej dokładności). Wystarczy więc wylosować liczbę od 10 do 30 i podzielić ją przez 100.0 (jeśli nie dodamy ".0", to klik uzna to jako dzielenie liczb całkowitych i wyjdzie zero:) ). Czyli w naszym przykładzie: (10+random(21))/100.0

9. Wojna z artefaktami
Jeśli zauważasz, że niszczone obiekty zostawiają po sobie "ślad", to możesz spróbować dwóch rozwiązań:
a) przenoś obiekt poza planszę i tam je niszcz - ślad poza planszą to nie problem,
b) nadawaj obiektom ruch i uruchamiaj go przy niszczeniu - obiekt jest wtedy "aktywizowany" i traktowany inaczej, przez co ślady nie zostają.
Jeżeli prolem sprawiają liczniki, to odznacz w ich właściwościach opcję "display as background".

10. {tu wpisz swój problem}
Sprawdź na klikowym FAQ, czy ktoś już nie poruszał problemu. Dobrym pomysłem jest też zerknąć na Klikipedię. Jeśli to się nie powiedzie, spytaj - w końcu po to tu jesteśmy:)

Podziękowania dla: Big Smoke, Cremmy, Don Sotto, Fadex, Kodek
Ostatnio edytowane 20 września 2009, 15:03 przez RomanX
Komentarze
marik23455 @ 10 kwietnia 2012, 11:46
Dzięki! Potrzebowałem właśnie ułamków o których napisałeś w losowaniu, bo chciałem zrobić zależność skali obiektu od jego pozycji.
tracersgta @ 2 maja 2011, 20:39
Napewno się przyda... :D
Fadex @ 30 grudnia 2010, 22:58
Powinieneś użyć do odtworzenia dźwięków jakiegoś rozszerzenia, gdyż wbudowany sampler powoduje właśnie tego typu problemy.
dmlsk2055 @ 30 grudnia 2010, 16:42
mam problem jak za często są dźwięki odtwarzane to mi się gra zacina :/
RomanX @ 29 listopada 2009, 15:34
To jest "inactivate" i wybierz "yes":P Pociskom za to wybierz "no".
Tropik @ 28 listopada 2009, 15:20
W Properties obiektu strzelca, z interactive if too far from window w Runtime Options wybierz No. Mam nadzieję, że pomoże. Jeśli nie, napisz stosowny temat w 'Pomocy'.
Ostatnio edytowane 28 listopada 2009, 15:22 przez Tropik
Seba913245 @ 28 listopada 2009, 12:34
A jak zrobić że przeciwnik strzela tylko jak jest na ekranie?? Bo kusznicy są poza ekranem, a obiekty poza ekranem się nie ruszają, więc bełty się kumulują i jak podchodzę do kuszników to strzelają seriami.
dng @ 5 października 2009, 15:56
Wieeemy, tylko połap się w tym nieokomentowanym silniku.
Don_Sotto @ 4 października 2009, 23:28
Był przykład Broo - ruch platformowy "Albert", albo jakoś tak ( ze wszystkimi bajerami typu pochyłe platformy etc.) . Warto do niego uderzyć w tej sprawie, ale na pewno jeszcze gdzieś jest dostępny.
Tropik @ 29 września 2009, 23:19
dng napisał(a):
jak ustawię prędkość postaci nieco większą, niż te +5 pikseli, to mi się wtapia w tło.
To akurat nie jest największy problem.:D Najgorzej jest wg mnie ze skokiem.:P Szczerze mówiąc, nie udało mi się nigdy stworzyć profesjonalnego ruchu po platformach pochyłych. Byłoby miło, gdybyś RomanXie zamieścił jakiś art. :)
Piter @ 29 września 2009, 20:43
Cytat:
mam problem a mianowicie iedy biegnę postacią i klikam klawisz strzału to pocisk czasami leci z opoznieniem i np wylatuje kilka cm pod postacią i jeszcze ją trafia;) co mam zrobic
Przyśpiesz pocisk, ew. zwolnij postać.
Ostatnio edytowane 29 września 2009, 20:44 przez Piter
misiug5 @ 29 września 2009, 20:33
mam problem a mianowicie iedy biegnę postacią i klikam klawisz strzału to pocisk czasami leci z opoznieniem i np wylatuje kilka cm pod postacią i jeszcze ją trafia;) co mam zrobic
dng @ 26 września 2009, 23:31
Szczerze? Nie. Tzn. zrobić to umiem, ale jak ustawię prędkość postaci nieco większą, niż te +5 pikseli, to mi się wtapia w tło.
Fadex @ 26 września 2009, 21:35
A co, dng, nie wiesz jak to zrobić? ^^
dng @ 26 września 2009, 20:49
Bieganie po pochyłych platformach daj.
RomanX @ 23 września 2009, 15:03
Klikod dorobię w wolnej chwili. Chciałem jak najszybciej ukończyć artykuł:P
Stankol @ 23 września 2009, 12:24
No i super! btw. adminie Romanie - używaj klikodu
Ostatnio edytowane 23 września 2009, 12:25 przez Stankol
Dodaj komentarz
Kolor:   Rozmiar:

Dodał RomanX
Profil PW
Twoja ocena
Inne tego autora
b/d
^ Do góry
© 2009 - 2012 Fabryka Gier. Publikowanie materiałów tylko za zgodą autorów.
Realizacja: Maciej Lamberski *-: