ALT Opublikowano 19 Lutego 2011 Udostępnij Opublikowano 19 Lutego 2011 Mam generatory drzew,i chce żeby o_tree generował się na danym poziomie,czyli nie byle gdzie tylko na jakiejś lini,i żeby nie spawnował się na określonym polu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Platyna Opublikowano 19 Lutego 2011 Udostępnij Opublikowano 19 Lutego 2011 A jak ten twój generator działa? Generalnie to chyba możesz mu nadać jakąś wartość y by był na określonej wysokości, nie? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 19 Lutego 2011 Udostępnij Opublikowano 19 Lutego 2011 GML //===tworzymy drzewko=== //Załóżmy, że y=const, room ma małą szerokość (np 480 px) oraz, że drzewa zawsze są oddalone od siebie o 40 px. //Na samym początku sprawdzamy czy są jeszcze jakieś wolne pola, aby można stworzyć drzewko. //Skorzystamy z zmiennej tworz. //Jeżeli tworz równa się 1, to można tworzyć drzewo, jeżeli 0, to nie można. //Na starcie zakładamy, że nie można tworzyć. tworz=0; //Teraz robimy pętle. Warunki pętli wynikają z założeń. Jeżeli przechodząc po linii y nie natrafimy na drzewo i nie ma //tego "określonego pola", to znaczy, że można tworzyć drzewo. Przerywamy działanie pętli. //Nie ma sensu dalej sprawdzać. for(i=40;i<=480;i+=40) { if(!collision_point(i,y,o_drzewo)&&!collision_point(i,y,o_okreslone_pole)) { tworz=true; break } } //Sprawdzamy czy zmienna tworz równa się 1. Jeżeli tak, to tworzymy drzewo. W tym celu losujemy położenie x. //Potem sprawdzamy, czy na wylosowanym polu jest drzewo albo "okreslone pole". //Jeżeli są to losujemy jeszcze raz. Losujemy do skutku, aż natrafimy na pole, //na którym możemy zasadzić drzewko. Na końcu tworzymy drzewko. if(tworz) { a=choose(40,80,120,160,200,240,280,320,360,400,440,480); while(collision_point(i,y,o_drzewo)||collision_point(i,y,o_okreslone_pole)) a=choose(40,80,120,160,200,240,280,320,360,400,440,480); instance_create(a,y,o_drzewo) } Teraz musisz cały przykład dopasować do swoich potrzeb. Możesz jeszcze jakoś pokombinować, aby zmniejszyć ilość losowań. Bo tutaj to nie jest szczyt optymalizacji. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 19 Lutego 2011 Udostępnij Opublikowano 19 Lutego 2011 Mam generatory drzew,i chce żeby o_tree generował się na danym poziomie,czyli nie byle gdzie tylko na jakiejś lini,i żeby nie spawnował się na określonym polu. Mój stary generator. Nie ukrywam, że nie bez wad ale u mnie sprawdził się idealnie. GML //Sadzi obiekty w obrebie podanych namiarow //argument0 - x1 //argument1 - y1 //argument2 - x2 //argument3 - y2 //argument4 - ile obiektow //argument5 - jakie obiekty //argument6 - ilosc powtorzen dla nieudanego sadzenia (zeby nie zapetlic gry jak nie znajdzie wolnego placu) //argument7 - gestosc x1:=argument0; y1:=argument1; x2:=argument2; y2:=argument3; ile:=argument4; czego:=argument5; powt:=argument6; gestosc:=argument7; zasadzone:=0; //ilosc obiektow jakie uda sie zasadzic nieudane:=0; //ilosc nieudanych prob przerwac:=false; //przerywamy kiedy ilosc prob przekroczy dozwolona liczbe if powt < 1 then powt:=1; //jesli ilosc prob zostala ustawiona na za mala daj 1 if powt > 50 then powt:=50; //jesli ktos przedobrzy z iloscia prob to moze podwiesic kompa na dluzszy czas if gestosc < -2 then gestosc:=-2; //jesli zageszczenie zbyt male to daj -2 if gestosc > 2 then gestosc:=2; //jesli zageszczenie zbyt duze to daj 2 tmp:=instance_create(-300,-300,czego); //tworzymy obiekt tymczasowy zeby dx2:=(tmp).sprite_width/(4+gestosc); //odczytac jego szerokosc dy2:=(tmp).sprite_height/(4+gestosc); //i wysokosc dzielac ja przez 4+ gestosc with (tmp) instance_destroy(); //niszczymy obiekt tymczasowy do { do //Pętla typu "do" wykonuje akcje w klamrach dopóki przy until jest "false" (fałsz) { dx:=random(x2-x1)+x1; // losuj pozycje x od x1 do x2 planszy dy:=random(y2-y1)+y1; // losuj pozycje y od y1 do y2 planszy if nieudane > (ile*powt) then przerwac:=true; //jesli ilosc prob przekroczy max to przerywamy sadzenie nieudane+=1; } //w until sprawdzanie elipsy w prostokacie wylosowanym +/- dl i szer obiektu until (przerwac==true or collision_ellipse(dx-dx2,dy-dy2,dx+dx2,dy+dy2,all,1,1)<=100003);//collision_circle(dx,dy,64,all,1,1)<=100003);// place_free(dx,dy)); //Powtarzaj az pozycja bedzie wolna if przerwac==false then {instance_create(dx, dy, czego); //jesli wyszlismy z powyzszej petli z prawidlowa pozycja to posadz obiekt zasadzone+=1;} //i zwieksz licznik obiektow o 1 } until (zasadzone >= ile or przerwac==true) //lub jesli wszystkie proby zakonczone pomyslnie lub przekroczony max limit prob to zakoncz</span> Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ALT Opublikowano 20 Lutego 2011 Autor Udostępnij Opublikowano 20 Lutego 2011 THX,zamykam. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi