Skocz do zawartości

Zablokowane Pole


ALT

Rekomendowane odpowiedzi

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

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

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...