Skocz do zawartości

arkanoid


rower44

Rekomendowane odpowiedzi

  • Filar Społeczności

Oj ludzie, ludzie. Rozstrzygnę ten spór. :)

 

CREATE paletki:

ms=5; //maksymalna szybkosc paletki

END STEP paletki:

if (pilka.direction>180) x+=min(max(abs(pilka.hspeed)/2,ms),abs(x-pilka.x))*sign(pilka.x-x);

 

 

 

 

 

A teraz wersja z poślizgiem:

 

CREATE paletki:

ms=5; //maksymalna szybkosc paletki
friction=0.1;

END STEP paletki:

if (pilka.direction>180) hspeed=min(max(abs(pilka.hspeed)/2,ms),abs(x-pilka.x))*sign(pilka.x-x);

 

 

 

 

 

Kodu tymona nie mam zamiaru poprawiac, bo za duzy i jakos nie dziala. Natomiast kod bartowiszka pod wzgledem optymalizacji jest tragiczny. Powinien wygladac tak:

if ( pilka.direction>180 )
{
   if ( pilka.x>x )
   {
       x+=min(ai,pilka.x-x);
   }
   else
   {
       x-=min(ai,x-pilka.x);
   }
}

Efekt ten sam.

 

 

To byl wlasnie kurs ZOPTYMALIZOWANEGO pisania w GML. :]

Odnośnik do komentarza
Udostępnij na innych stronach

Pod względem kodu wygrywa Ranma_man... :P

Kodu tymona nie mam zamiaru poprawiac, bo za duzy i jakos nie dziala. Natomiast kod bartowiszka pod wzgledem optymalizacji jest tragiczny.

Czyli mój kod był lepszy... :D

EDIT

A tak przy okazji, to czy mógłbyś Ranma_man'ie wytłumaczyć funkcje użyte w twoich skryptach? Najbardziej chodzi mi tu o: min, max, abs i sign.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Tak się nie robi. Utwórz nowy obiekt, którego nie będziesz wstawiał na planszę, nawet nie musi mieć sprite'a. Nazwij go "klocki". Teraz wszystkim typom klockow, ktore maja byc wliczane, wybierz parent "klocki". Teraz w instance_number daj "klocki".

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Wytłumaczę co robi ta linijka:

if (pilka.direction>180) x+=min(max(abs(pilka.hspeed)/2,ms),abs(x-pilka.x))*sign(pilka.x-x);

 

ms to maksymalna szybkosc, pilka.hspeed to pozioma szybkosc pilki (pozycja x zostaje zawsze przesunieta o wartosc hspeed). Dziele ja na 2, zeby paletka miala jakies spowolnienie wzgledem pilki. Funkcja abs sluzy do pobierania wartosci absolutnej, poniewaz jezeli pilka leciala by w lewo z szybkoscia 5, to jej hspeed = -5. Ten minus przeszkadza w tym etapie w wyliczeniach, bo on tylko oznacza kierunek ruchu w lewo, a sila to 5. Funkcja max wybiera maksymalna liczbe ze wszystkich argumentow. W tym wypadku wybieram albo wyliczona szybkosc paletki albo maksymalna szybkosc, poniewaz jezeli ta pierwsza wartosc jest mniejsza od mozliwosci "biegania" paletki, to musze wybrac ms.

Zalozmy, ze juz wybralem szybkosc poruszania sie paletki w poziome. Teraz czas sprawdzic czy przypadkiem liczba pikseli, o ktora zostanie przesunieta paletka nie jest wieksza niz odleglosc pozioma miedzy pileczka i paletka. Jesli by byla za duza, to paletka by wyprzedzila pileczke, potem poleciala w odwrotnym kierunku, potem znowu na odwrot. Chodzi o zapobiezenie drganiu. Posluzylem sie funkcja min, ktora dziala analogicznie jak max, tylko z argumentow wybiera najmniejsza liczbe. Jedna z nich jest nasza wyliczona szybkosc paletki, a drugim argumentem jest wlasnie pozioma odlegosc miedzy interesujacymi nas obiektami. Dzieki temu jezeli paletka jest za szybka, skrypt wybierze maksymalna mozliwa odleglosc do przesuniecia tak by paletka nie wyprzedzila pileczki.

 

W ten oto sposob mamy juz wyliczona odlegosc do przesuniecia paletki. Tylko nie wiemy w ktora strone. Zamiast posluzyc sie warunkiem if, cala liczbe mnozymy przez sign(pilka.x-x). Sign zwraca znak. Jezeli argument jest mniejszy od 0, to zwracane jest -1, jezeli >0 to 1, a jezeli =0 to zwraca 0. W argumencie widzimy, ze odejmuje x paletki od x pilki. Jezeli pilka jest na prawo od paletki, to sign zwroci 1, jezeli pilka jest na lewo od paletki, to sign zwroci -1. Czyli, jezeli pilka jest na lewo od paletki, to mnozymy liczba * -1 i staje sie ona ujemna. Wskutek tego x+=(-liczba) da nam x-=liczba, bo + i - daje +.

 

Nastepnym razem prosze czytac helpa. :]

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Nie lubie poprawiac, ale widze, ze musze. game_end jest funkcją, więc powinno być game_end()

 

Natomiast & to operacja bitowa and, tutaj nam jest potrzebne zwykłe and czyli "and" lub &&.

 

Ludzie, sprawdzajcie czasem wlasne skrypty.

Odnośnik do komentarza
Udostępnij na innych stronach

1. Po kiego zakładać setki tematów "arkanoid" jak można ciągnąć rozmowę w jednym.

2. Kurde starajcie się kożystać z opcji "szukaj". Może taki temat już istnieje. Apeluje tutaj do tych nowych użytkowników.

3. Możecie też z GG skorzystać. Przecież po to są profile.

 

Ranma możesz wrzucić ten regulamin ?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

rowr44: Nie chce sie wlaczyc bo masz za malo ramu. Wszystkie zasoby w GM sa domyslnie ladowane od razu do pamieci przy starcie gry.

 

Zauwaz, ze gry komercyjne laduja rozne zasoby miedzy etapami itd, a potem je usuwaja z pamieci. W twoim przypadku tez bedziesz musial tak zrobic.

Odnośnik do komentarza
Udostępnij na innych stronach

Zacznij korzystać z opcji edit i pomyśl trochę sam, a nie jak czegoś niewiesz to odrazu pytasz. Wystarczy chwile pomyśleć, ułożyć sobie algorytm we własnym języku (np. jeżeli coś tam to się dzieje coś innego w przeciwnym razie nic sie nie dzieje itp.), a potem przekształcić to na GML i wstawić do gry.

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