Skocz do zawartości

Zablokowane Problem z zapętlaniem się funkcji.


Gooman

Rekomendowane odpowiedzi

Mam problem. A mianowicie stworzyłem prosty skrypt losowego tworzenia przeszkód na poziomie kod wygląda następująco:

xx=32;yy=32*3;

repeat(2)
{
 do
 {
   i = round(random(28));j = round(random(23))
   if !position_meeting(xx+32*i,yy+32*j,all) 
{instance_create(xx+32*i,yy+32*j,przeszkoda)}
 }
 until (!position_meeting(xx+32*i,yy+32*j,all))
}

 

Jak chce wykorzystać ten sam skrypt do tworzenia bonusów to funkcja się zapętla, a gra w konsekwancji się zacina a jedyne co zmieniam w kodzie to obiekt który ma tworzyć. Zna ktoś może przyczyne tego ? :glare:

Odnośnik do komentarza
Udostępnij na innych stronach

Przyjzyj sie dokladnie co napisales...

 

xx=32;yy=32*3; // podejrzewam ze to szerokosc siatki i pozycja startowa

repeat(2) // powtarzaj 2 razy zestaw instrukcji
{
do // zrob
{
  i = round(random(28));j = round(random(23)) // wylosuj numer kratki
  if !position_meeting(xx+32*i,yy+32*j,all)  // sprawdz czy pozycja jest wolna
{instance_create(xx+32*i,yy+32*j,przeszkoda)} // jesli nie to zajmij pozycję
}
until (!position_meeting(xx+32*i,yy+32*j,all)) // rob to tak dlugo az pozycja bedzie wolna
}

 

Jesli pozycja była juz zajęta to w dane miejsce nic nie jest wstawiane.Jesli natomiast byla wolna, to wstawiamy tam obiekt czyniąc ją tym samym zajętą. Skrypt konczy się kiedy dana pozycja pozostaje wolna... czyli nigdy :blink:

 

 

Sprubuj tak :

xx=32;yy=32*3;

repeat(2)
{
 do
 {
   i = round(random(28));j = round(random(23))
   if !position_meeting(xx+32*i,yy+32*j,all) 
{instance_create(xx+32*i,yy+32*j,dany_obiekt)}
 }
 until (position_meeting(xx+32*i,yy+32*j,dany_obiekt))
}

 

Jesli na koncu skryptu sprawdzimy ze w danym miejscu jest obiekt jaki wstawiales, bedzie to oznaczac ze dana pozycja BYŁA a nie jest wolna i to własnie chciales sprawdzac pisząc ten skrypt.

 

P.S. Zamiast dany_obiekt wpisz argument0 i wtedy obiekt jaki chcesz stworzyc bedziesz mogl podawac jako argument bez potrzeby ingerecji w kod.

Odnośnik do komentarza
Udostępnij na innych stronach

Heh. Nie moge się z Tobą zgodzić Choosen. Oto opis funkcji until:

The statement (which can also be a block) is executed until the expression is true. The statement is executed at least once. Be careful with your do loops. You can easily make them loop forever, in which case your game will hang and not react to any user input anymore.

 

Jak widać w jej opisie skrypt jest wykonywany dopóki warunek jest spełniony. Czyli w moim wypadku gdy dana pozycja jest wolna. W przypadku gdy w danej pozycji jest utworzony obiekt warunek przestaje być spełniony i tym samym skrypt przestaje być wykonywany.

 

Until w moim skrypcie upewnia sie, czy zdefinoiowana przeze mnie ilość obiektów została utworzona. Gdy wybrałem aby utworzyło 300 obiektów to właśnie taką ilość utworzyło przy moim skrypcie, a gdy sprawdziłem Twój zamiast 300 utworzyło mi 865 z pierwszą próba a za drugą gra się zacieła .

Odnośnik do komentarza
Udostępnij na innych stronach

Ależ ja naprawdę wiem jak działa ta funkcja. Problem jest z Twoją

until (!position_meeting(xx+32*i,yy+32*j,all))

 

Skoro w pozycji (xx+32*i,yy+32*j) stworzyles przed sekundą obiekt... to funkcja position meeting(xx+32*i,yy+32*j,all) zwróci TRUE natomiast funkcja !position_meeting(xx+32*i,yy+32*j,all) zwróci FALSE nakazując tym samym ponowne wykoannie pętli

 

Moj skrypt moze nie dzialac dokladnie dlatego ze nie znam całosci programu. Trudno oczekiwac ze ktos znajdzie blad w skrypcie ktorego zmienne nie są objasnione a struktora programu ,w ktorym bedzie on zastosowany jest nieznana.

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