Skocz do zawartości

Rudy

Użytkownicy
  • Postów

    154
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez Rudy

  1. Pytanie brzmi: jak sterujesz tym gościem? 1. x += 5 <-- ruch na prawo co step 2. speed = 5; direction = 0; <-- jedne wpisanie danych i już Spróbuj tego kodu: GML (Step) if (x < 200) { x = 200; hspeed = 0; } if (y < 200) { y = 200; vspeed = 0; } if (x > room_width-200) { x = room_width-200; hspeed = 0; } if (y > room_height-200) { y = room_height-200; vspeed = 0; }
  2. GML (Step) if (x < 20 || x > room_width-20) hspeed = 0; if (y < 20 || y > room_height-20) vspeed = 0; Proste i logiczne. (20 - mniej więcej przesunięcie granicy tak, żeby połowa obiektu nie znikała zanim sie zatrzymie) A jeżeli bez speed = 0, to w takim razie jak? Masz zamiar odbić obiekt, obrócić, przenieść?
  3. Poprawka mojego kodu, faktycznie nie działał, bo zły kierunek znaku :) no i lekka zmiana w okolicy move_towards_point() :) Przykład (GM8): TUTAJ Kod: GML (Create) // zmienne pomocnicze trwa_ruch = 0; xx = 0; yy = 0; GML (Step) // kod aktywujący ruch przez kliknięcie myszką if (mouse_check_button_pressed(mb_left) && trwa_ruch == 0) { xx = mouse_x; yy = mouse_y; trwa_ruch = 1; } // Funkcja wymaga stałego działania if (trwa_ruch == 1) { trwa_ruch = SmoothDirection(xx, yy, 0.25, 10); } GML (Script SmoothDirection) // Function SmoothDirection(x, y, przys., maks_pred.) // wzór fizyczny s = v^2/2a czyli droga jaką pokona jeszcze rozpędzony obiekt w ruchu opóźnionym. // Sprawdzamy, czy dystans jest mniejszy od tego i czy powinniśmy hamować // +2*speed po to, żeby obiekt potem nie zawracał jeśli przypadkiem ominie punkt if (speed*speed/2/argument2+speed*2 > point_distance(x, y, argument0, argument1)) speed = max(speed-argument2, 0); // w przeciwnym wypadku przyśpieszamy i korygujemy kurs else { speed = min(speed+argument2, argument3); direction = point_direction(x, y, argument0, argument1); } // jeśli ruch skończony, zwracamy zero, a jeśli nie to ruch kontynuujemy if (speed == 0) return false; return true;
  4. Rudy

    Laser

    Mam teleskop soczewkowy 900mm ogniskowa, 80mm średnica. Nic wielkiego, a przepaliłem nim następujące przedmioty: - zapałkę - pomalowaną kartkę papieru (biały nie pochłania energii światła) - drewno - plastik - włosy :D - materiał - podgrzał metal To powyżej w przeciągu 2s, niżej mam osiągnięcie czasochłonne (do 5 min) - 5-krotnie złożoną białą kartkę papieru (32 kartki), pomalowaną tylko na pierwszej - 6-krotnie poskładaną czarną kartkę (64 warstwy) a to masz jeden ze "słabszych" teleskopów. Weźmiesz większy, to przepalisz nim wszystko :P . Jedyny problem to to, że pali tylko w ogniskowej (punkt, nie linia). Co do widoczności... zależy, jakie jest te powietrze. Jeśli zadymione to zwykły laser ze sklepu za 10 starczy. Jeśli chcesz mieć lepszy efekt, kup sobie laser zielony (wielkości długopisu), w nocy nawet przy czystym powietrzu wyraźnie widać ścieżkę. Co do dnia, to nie wiem, osobiście nie miałem takiego lasera. A jeżeli chcesz na prawdę dobry efekt kup sobie jeden z tych, co są na dyskotekach :) . Przy czym on nie przepala :)
  5. Rudy

    Laser

    Kup sobie teleskop i nakieruj na słońce :P
  6. Skoro chodzi ci o płynne przejście to pewnie też płynny start i zakończenie drogi. A więc potrzebna ci zmienna zmiany prędkości - przyśpieszenie i coś ograniczające prędkość ruchu. Plan: musisz wymyślić sobie jakieś przyśpieszenie, np 0.5, oraz maksymalną prędkość, np 10. Kod (zał: speed = 0, (xx,yy) to pozycja, gdzie chce się przemieścić, dv to przyśpieszenie, msp maksymalna prędkość, goo to czy obiekt ma się przemieszczać GML (Create) // deklaracja danych, dobry nawyk xx = 0; yy = 0; dv = 0.5; msp = 10; goo = 0; GML (Step) // kod aktywujący ruch przez kliknięcie myszką if (mouse_check_button_pressed(mb_left) && goo == 0) { // ustawienie danych do przelotu xx = mouse_x; yy = mouse_y; goo = 1; } if (goo == 1) { // wzór fizyczny s = v^2/2a czyli droga jaką pokona jeszcze rozpędzony obiekt w ruchu opóźnionym. // Sprawdzamy, czy dystans jest mniejszy od tego i czy powinniśmy hamować if (speed*speed/2/dv < point_distance(x, y, xx, yy)) speed = max(speed-dv, 0); // w przeciwnym wypadku przyśpieszamy w tamtym kierunku else move_towards_point(xx, yy, min(speed+dv, msp)); // jeżeli obiekt mimo powyższego stoi znaczy, że ruch się skończył if (speed == 0) goo = 0; }
  7. Rudy

    string do tablicy

    Istotnie, haha.length() nie jest stałą wartością, więc trzeba stworzyć tablicę dynamiczną. Dodatkowo, powinno być haha.length()+1 (żeby zmieścić null-character).
  8. Ja widziałem :P . HGE -> Link Listy a tablice to jednak co innego, ośmielam się stwierdzić, że ich działanie w GML podobne jest do działania w C++, tzn tablice to proste przesunięcie wskaźnika, a listy to przeskakiwanie co wskaźnik do kolejnego elementu. W drugim znajduje się pętla, w pierwszym nie ;) . Ogólnie tak, np point_direction. Strzelam, chociaż pewny nie jestem, że może korzystać on z tangensa. Czyli pewnie przed samym obliczeniem robi sobie test warunkowy, żeby uniknąć crasha. A załóżmy, że z gra jest tak zbudowana, że na 100 procent możemy założyć, że ten warunek zawsze będzie prawdziwy. Czyli mamy o jedną instrukcję mniej :) . (i około 5 komend asma ;D )
  9. Błędy pojawiają się tylko, jeżeli programista o czymś zapomni/nie zna się na używanym kodzie. Można więc powiedzieć, że u ciebie jest więcej błędów jeżeli chcesz dojść do porozumienia z originami, u mnie z kolei jeżeli próbuję się obyć bez nich :). Możliwe, chociaż zależy od tego, czym są te listy w rzeczywistości. Może to są "obudowane" tablice, a może jakieś coś szybszego :) W ogóle o co się kłócimy :D . Każdy ma swój styl i swoje narzędzia pracy :) .
  10. Zależy w sumie w jaki sposób ich użyć ;) Właściwie lengthdir = sin/cos tylko z pomnożeniem przez długość i łatwiejszą nazwą ;) . Ale ustawisz origin i żadnych poprawek nie musisz robić ;) Przykładowo, masz dwie koła o rożnych promieniach, chcesz wykonać odbicie sprężyste niecentralne. Jeżeli nie masz ustawionych originów, musisz tworzyć dodatkowe zmienne żeby przesunąć pozycję na środek kuli. Przesuwają obrazek o origin :) . Wtedy np jeżeli chcesz odbicie lustrzane robisz po prostu image_yscale = -1; Jeśli origin będzie na górze, to będzie na dole i to już nie to samo :) . Ale jeśli na środku to będzie środek i tak :) . Suche obliczenia to to, co komputer lubi najbardziej :) . Funkcje to też obliczenia, ale jest ich więcej i niektóre nie są potrzebne (mam na myśli to, że tworząc własne obliczenia możesz dokonywać optymalizacji). Ale faktycznie, można również użyć tych funkcji, efekt będzie taki sam :)
  11. Originy to bardzo przydatna rzecz. Dzięki originom można poprawnie użyć image_angle obracając postać. Łatwiej o sprawdzenie pozycji przy wszelkich kolizjach i obiektach, zwłaszcza okrągłych. Świetnie się prezentują przy wyglądzie wszelkich obiektów (jedynie kwadratowym ujdzie jakoś) 1. Masz okrągłe przyciski? a ) originy na środek b ) sprawdzaj odległość myszki od pozycji 2. Kwadratowe? a ) originy na środek b ) sprawdź czy myszka jest w zakresie x, y 3. Romb? a ) originy na środek b ) sprawdzaj czy liczba abs(x-mouse_x)+abs(y-mouse_y)*k (gdzie k to pozioma przekątna/pionowa) nie przekracza połowy poziomej przekątnej Inny? napisz :P
  12. Masz rację, jednak tę sprawę załatwia and (lub or po zaprzeczeniu) :D . Ogólnie chodzi o wylosowanie nowego spawnera, jeżeli ten jest w widoku. Czyli de facto x jest w przedziale i y jest w przedziale. Jeżeli szukalibyśmy warunku żeby nie był to zaprzeczamy wszystko (and na or i < na >) i albo robimy ! przed nawiasem albo wpisujemy until (chyba tak to działa, czyli tłumacząc: "do momentu, aż...")
  13. nie do końca ;) kod powinien wyglądać tak: GML (Create Spawnera) global.spawn[global.s] = id; // zał: global.s zostało wcześniej zadeklarowane global.s += 1; // tablica zaczyna się od 0, tylko ludzie tacy dziwni liczą od 1 :D .</span></span></span></span> GML (Smierc Potworka) do // podobne do while, ale najpierw wykonuje, potem sprawdza. Czyli wylosuje min 1 raz;) { c = global.spawn[irandom_range(0, global.s-1)]; } while(c.x>view_xview[0] and c.x<view_xview[0]+view_wview[0] and c.y>view_yview and c.y<view_yview+view_hview[0]); instance_create(c.x, c.y, potworek); Faktycznie znaki miały być odwrotnie :) . Ale miało być and. Przeczytaj sobie warunek: Twój kod: Losuj sprawnera; Dopóki (pozycja x jest poza widokiem albo pozycja y jest poza widokiem) { Losuj spawnera; } Stwórz potworka na spawnerze; Widać, że losuje tak długo aż znajdzie się w środku :) . Sama zamiana znaków spowoduje, że pętla się zapętli dla każdego x i każdego y (co miałeś okazję sprawdzić :) ). Zamiana tylko or na and spowoduje za każdym razem przerwanie pętli. Z kolei obydwie akcje to będzie coś takiego (mój kod): Wykonuj { Losuj spawnera; } Dopóki (pozycja x jest w widoku oraz pozycja y jest w widoku); Stwórz potworka na spawnerze; Wystarczyło więc zaprzeczyć warunek w while :) PS: Jeśli chcesz zapamiętać działanie while, przetłumacz do na słówko dopóki ;) . Czyli dopóki warunek jest prawdziwy, wykonuj kod niżej ;) .
  14. zaprzeczenie czego? Bóg nie jest zły, jest dobry. Skoro zaprzeczasz czemuś pozytywnemu, to wiadomo, że wyjdzie z tego coś negatywnego :P Dowód! Coś nie może być doskonałe choćby z tego powodu że jest materialne. Można to zniszczyć :P . A nie istnieć też nie może. Musi być jakiś wyznacznik, do którego możesz się porównać i ocenić "doskonałość". Wygrałem : P
  15. Twoją odpowiedzią jest nie? To nie jest odpowiedź. Zamiast szukać prawdy, zasłaniasz się niewiedzą. Nie masz odpowiedzi, wyjaśnienia na te prawdy. Skoro wolisz żyć w nieprawdzie, proszę bardzo, ja jednak zostanę przy światłości. Wolę wierzyć, niż żyć w niewiedzy. nie przyznanie się do kłamstwa jest jawną częścią rozmowy. Istnieje jednak niejawna, która zawiera w sobie więcej prawdy :P .
  16. Nie ma najwyraźniej. Znajdź odpowiedź, albo uwierz w Boga. Pięć dróg Tomasza z Akwinu czyli: - jeśli istnieje ruch, to istnieje pierwszy poruszyciel – Bóg. Nauka udownodniła to, że Wszechświat jest w ciągłym ruchu. Ale ruch nie mógł istnieć od zawsze. Ktoś musiał poruszyć pierwszą cząstkę. - jeśli każda rzecz ma swą przyczynę, istnieje pierwsza przyczyna sprawcza – Bóg Istnieje zasada przyczynowości. Każde działanie ma swoją przyczynę (przeszłość) i skutek (przyszłość). Skoro tak, musiała istnieć pierwsze przyczyna od której wszystko się zaczęło. - jeśli byty przygodne nie istnieją w sposób konieczny (pojawiają się na świecie i przemijają), musi istnieć byt konieczny – Bóg skoro wszystko co istnieje na świecie ma swój początek i koniec, musi istnieć również coś, co będzie istniało bez względu na czas. - jeśli rzeczy wykazują różną doskonałość, to istnieje byt najdoskonalszy – Bóg wiadomo, nikt nie jest doskonały. Ale procent tej doskonałości musi coś wyznaczać. Tym wyznacznikiem jest Bóg. - jeśli celowe działanie jest oznaką rozumności, to ład i porządek w działaniu bytów nieożywionych, lub pozbawionych poznania, świadczą o istnieniu Boga, kierującego światem nieożywionym. Skoro istnieje coś takiego jak ład i porządek, musi też istnieć coś, co podtrzymuje te stany. Człowiek na pewno to nie jest. Ale ta wojna wcale nie została wywołana przez ludzi, ludzie na chwilę obecną nie mieliby takiej władzy, chyba, że już istnieje ktoś kto widzi nas wszystkich z góry. Ale jak na razie tylko jedna Istota to potrafi. Właśnie to zrobiłeś ;P
  17. Nie jest to proste, ale możliwe. Na pewno nie zrobisz tego jednym obiektem/spritem/particlem. masz 2 opcje: albo robisz to obiektami (tzn sonar "wystrzeliwuje" ileś tam obiektów we wszystkie strony) i normalnie sprawdzasz kolizję albo bierzesz particle, dodajesz changery itd. itp. to drugie raczej lepsze.
  18. Drobny edit wyżej :P Coś nie mogło powstać z niczego, to nielogiczne :P
  19. No dobra, ale co było przed tym? Nauka może szukać odpowiedzi ale i tak nie znajdzie wszystkich. Poza tym, są dowody na prawdziwość Biblii, są dowody na istnienie Boga (czyt. Istoty Wyższej) i to wcale nie wymyślone przez jakiegoś wg ciebie oszołoma, ale czysto logiczne i matematyczne. Jakbyś chodził na religię, zrozumiałbyś. Ja jestem chrześcijaninem i już nie raz doznałem na sobie skutki wojny między dobrem i złem, które wywodziły się tylko z wg ciebie kilku przypadków losu. Ja wiem, że to nie mógł być przypadek. Poza tym przyznaj się, nie chodzisz do kościoła, nie wierzysz w Boga, bo to niewygodne, aż godzina straconego czasu na tydzień.
  20. Uraziłeś jej ego, poczuła się niepotrzebna :P
  21. ... nie można było obrazkiem? I gdzie w ogóle ten obiekt (pozycja startowa czy coś)? btw: nie chodzi ci może o znajdowanie drogi?
  22. Ta linia odpowiada za zmianę obiektu, do którego idzie na następny. To, skąd on ma wiedzieć, co to za obiekt dowiaduje się właśnie z poprzedniego obiektu. Innymi słowy: 1. Po odliczeniu alarmu id_to zamienia się z -1 (brak ruchu) na najbliższy obiekt o_obiekt 2. Ten obiekt powinien mieć zdefiniowane zmienne image_angle (do znalezienia miejsca na lewo/prawo od obiektu, można zmienić na inną zmienną) i id_next jako id kolejnego obiektu, każde indywidualnie, sprawdź Creation Code każdego z obiektów (Ctrl + PPM), tam są te zmienne zdefiniowane. 3. Po dojściu do obiektu o_ja korzysta ze zmiennej id_next umieszczonej w o_obiekt do którego zdążało, żeby ustalić, do którego następnego ma iść. Dlatego id_next musi być zdefiniowane w łańcuchu o_obiekt. Może to być id kolejnego obiektu (np 100024), lub -1 jako koniec ruchu. Użyłem zasady tzw. Linked Listy, czyli każdy obiekt posiada odnośnik do kolejnego obiektu, a ostatni urywa łańcuch. Jeżeli inaczej chcesz połączyć obiekty, daj znać :P .
  23. co 1/image_index, czyli co 2 klatki. Ale nie musimy tego liczyć i tak wszystkie liczby są zmiennoprzecinkowe ;) . Więc... wyobraźmy sobie, że nasz image_speed = 0.4. Zerujemy image_index przy starcie. I potem co step dodajemy. A w draw tak jak powiedziałem ;) Jak to działa? Klatka 0: image_index = 0; // floor(image_index) = 0 Klatka 1: image_index += 0.4 // = 0.4 floor(image_index) = 0 Klatka 2: image_index += 0.4 // = 0.8 floor(image_index) = 0 Klatka 3: image_index += 0.4 // = 1.2 floor(image_index) = 1 Klatka 4: image_index += 0.4 // = 1.6 floor(image_index) = 1 Klatka 5: image_index += 0.4 // = 2.0 floor(image_index) = 2 Klatka 6: image_index += 0.4 // = 2.4 floor(image_index) = 2 Klatka 7: image_index += 0.4 // = 2.8 floor(image_index) = 2 Klatka 8: image_index += 0.4 // = 3.2 floor(image_index) = 3 itd, itd... Działa? Raczej tak :) . Ale nie trzeba może ucinać, jeśli liczba będzie za duża? Nie, draw_sprite_ext i tak już to robi. Nie wierzysz, sprawdź image_index przez debug.
  24. Musisz mieć w każdym z obiektów odnośnik/wskaźnik/id do kolejnego obiektu z przodu, a w objekt1 odnośnik do któregoś z obiekt2 1. Wyznaczasz pozycję o 90° w lewo od kierunku kolejnego obiektu o dowolnej odległości od obiekt2 i kierujesz się do niego obiektem1. 2. Gdy dotrze do pozycji zmieniasz odnośnik na kolejny. 3. I już :) Niedługo pojawi się przykład. A oto on: PRZYKŁAD
  25. dobrze z polem index w draw_sprite_ext. A co do zmiennej: Jeśli prędkość zmieniania ma być co klatkę to zmienna += 1 co step. jeśli nie to zmienna += szybkosc i w draw_sprite_ext dodaj floor(zmienna) I już ;)
×
×
  • Dodaj nową pozycję...