Skocz do zawartości

Łączenie przedmiotów


H2S04

Rekomendowane odpowiedzi

Bry. Walczę z tym shitem, i już nie wiem ocb. WG debug_message omija mi Goto = true {...}... Ale po kolei. Chcę by itemki łączyły się jak np. w Graveyard Keeper, po prostu leciały do siebie, i zwiększały ilość. Poniekąd kod działa, jednak jest mały problem... Czasami obiekty są blisko siebie i nie chcą się połączyć, dopiero jak stworzę dwa lub trzy nowe i któreś się złączą, to w tedy reszta może się połączyć. Coś chyba pokićkałem w kodzie. Pozdrawiam :D 

 

if FindMultiple2 == true{ // Aktywowanie szukania
var i, obj;
for (i = 0; i < instance_number(o_Wood); i++){
	obj[i] = instance_find(o_Wood,i); // Ustalenie numeru szukanego obiektu
		if obj[i].Amount >= Amount{ // #1 Jezeli Ilosc w danym obiekcie jest wieksza lub rowna
			FindMultiple2 = false; // Wylacz szukanie
			Mx = obj[i].x; // Pobierz x
			My = obj[i].y; // Pobierz y
			GoTo = true; // Wlacz ruch obiektu
			timer = 30; // ustaw timer na 30;
		} else {
			FindMultiple2 = true; // #1 Jeżeli nie to szukaj od nowa
		}
   }
}

if GoTo = true{ // Jeżeli ruch jest wlaczony

	if point_distance(x,y,Mx,My) > 10 and point_distance(x,y,Mx,My) < 250{ // Jezeli odleglosc od obiektu jest wieksza od 10 i mniejsza od 250
		direction = point_direction(x,y,Mx,My); // obroc sie w jego strone
		speed = 20; // idz
	} else { // jezeli nie 
		if 	point_distance(x,y,Mx,My) <= 10 { // jezeli jest mniejsza od 10
			GoTo = false; // wylacz ruch
			speed = 0; // wylacz speed
			col = collision_circle(x,y,10,o_Wood,false,true); // ustal kolizje
			if col{ // jezeli jest kolizja
				col.Amount += Amount; // dodaj do kolizji swoja ilosc
				Amount = 0; // ustal ja na wszelki wypadek na 0
				instance_destroy();	// zniszcz sie
			}
			
		}
	}
}

// tutaj wiadomo ocb
if timer >= 0 {

	timer -= 1;	

} else {
	FindMultiple2 = true;
}

 

Zrzut ekranu 2020-11-06 170426.png

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Jak dasz show_debug_message("cokolwiek"); przy "GoTo = true; // Wlacz ruch obiektu" to pokazuje, że ten kod się wykonuje ? Nie bardzo też wiem co jest w zmiennej "Amount", może problem leży właśnie tutaj - porównujesz wszystko z jakąś jedną wartością.

Odnośnik do komentarza
Udostępnij na innych stronach

EDIT: Po napisaniu inwentarza, nie idzie czasami podnieść obiektu bo fiksuje. Będę musiał napisać to od nowa -.- A jak nie będzie działać, to po prostu z tego zrezygnuje...

 

Amount to po prostu zmienna, która przechowuje ilość. Przy stworzeniu obiektu jest to 1, bo jest jeden obiekt i tyle ma pobrać przy łączeniu się chyba, że po złączeniu ma więcej. Właśnie po napisaniu show_debug_message, pokazuje mi, że kod GoTo = True, się nie wykonuje, mimo, że timer działa... Zaraz napiszę wszystkie debugi i eytuję post dla wglądu.

 

(czy mi się wydaje, czy timer dostaje szału? bo widzę po debugu, tu ma 30 tu nagle 17 tu nagle 30...)

(Kurła, wszytko się rozwala tutaj, dlatego wrzucam debug do pliku tekstowego i tutaj kod, by nie walnąć posta na całą stronę, bo spoiler wszystko psuje, a nie chce robić śmietnika...)

 

show_debug_message(" Start Step ");
show_debug_message(" Nastepe if FindMultiple 2 == true");
if FindMultiple2 == true{ // Aktywowanie szukania
	show_debug_message(" If Find multiple2 == true ");
var i, obj;
show_debug_message(" Ustal var i, obj, ");
show_debug_message(" start 'FOR' ");
for (i = 0; i < instance_number(o_Wood); i++){
	show_debug_message(" ustalanie obj[i] ");
	show_debug_message(" [i] ="+string(i));
	obj[i] = instance_find(o_Wood,i); // Ustalenie numeru szukanego obiektu
	show_debug_message(" obj[i] ="+string(obj[i]));
	show_debug_message(" Przejscie do szukania obiektu z iloscia (if obj[i].Amount >= AMount ");
		if obj[i].Amount >= Amount{ // #1 Jezeli Ilosc w danym obiekcie jest wieksza lub rowna
			show_debug_message(" Jezeli obiekt z iloscia > od mojej ilosci: obj[i].Amount, obj[:"+string(i)+"]."+string(obj[i].Amount));
			FindMultiple2 = false; // Wylacz szukanie
			show_debug_message(" Zmien FindMultiple z true na false ");
			Mx = obj[i].x; // Pobierz x
			show_debug_message(" ustal MX = obj[i].x  ");
			My = obj[i].y; // Pobierz y
			show_debug_message(" ustal My = obj[i].y ");
			GoTo = true; // Wlacz ruch obiektu
			show_debug_message(" GoTo = true ");
			timer = 30; // ustaw timer na 30;
			show_debug_message(" Ustaw timer na 30 ");
			show_debug_message(" Koniec If Amount >= Amount ");
		} else { show_debug_message(" Else ");
			FindMultiple2 = true; // #1 Jeżeli nie to szukaj od nowa
			show_debug_message(" FindMultiple = True // szukaj od nowa ");
		}
		show_debug_message(" Koniec For ");
   }
   show_debug_message(" Koniec Multiple2 == true ");
}

show_debug_message(" KONIEC SZUKANIA ");
show_debug_message(" . ");
show_debug_message(" . ");
show_debug_message(" . ");
show_debug_message(" Przejscie do GoTo = true // nastepna linijka powinna byc  jezeli GoTo = true ");
if GoTo = true{ // Jeżeli ruch jest wlaczony
	show_debug_message(" jezeli GoTo = True ");
	show_debug_message(" Przejscie do obliczania odleglosci ");
	if point_distance(x,y,Mx,My) > 10 and point_distance(x,y,Mx,My) < 250{ // Jezeli odleglosc od obiektu jest wieksza od 10 i mniejsza od 250
		show_debug_message(" Jezeli odleglosc > 10 i < 250 ");
		direction = point_direction(x,y,Mx,My); // obroc sie w jego strone
		show_debug_message(" uslal dira  ");
		speed = 20; // idz
		show_debug_message(" ustal speed ");
		show_debug_message(" Koniec GoTo = True ");
	} else { show_debug_message("  ELSE  ");// jezeli nie  
		show_debug_message(" Przejscie do point distance ");
		if 	point_distance(x,y,Mx,My) <= 10 { // jezeli jest mniejsza od 10
			show_debug_message(" Jezeli Point Distance < 10 ");
			GoTo = false; // wylacz ruch
			show_debug_message(" GoTo = false ");
			speed = 0; // wylacz speed
			show_debug_message(" speed = 0 ");
			col = collision_circle(x,y,10,o_Wood,false,true); // ustal kolizje
			show_debug_message(" Ustalam col= colision ");
			show_debug_message(" Przejscie do Col ");
			if col{ // jezeli jest kolizja
				show_debug_message(" If Col ");
				col.Amount += Amount; // dodaj do kolizji swoja ilosc
				show_debug_message(" Pobierz ilosc i dodaj do col ");
				Amount = 0; // ustal ja na wszelki wypadek na 0
				show_debug_message(" Ulstal na 0  ");
				instance_destroy();	// zniszcz sie
				show_debug_message(" usun sie ");
				show_debug_message(" kONIEC COL ");
			}
			show_debug_message(" KONIEC IF POINT DISTANCE ");
		}
		show_debug_message(" KONIEC ELSE ");
	}
	show_debug_message(" KONIEC GOTO przed nawiasem }");
}
show_debug_message(" KONIEC CALEGO KODU GO TO ");
show_debug_message(" . ");
show_debug_message(" . ");
show_debug_message(" . ");
// tutaj wiadomo ocb
show_debug_message(" Przescie do timera ");
if timer >= 0 {
	show_debug_message(" Jezeli Timer >= 0 ");
	show_debug_message(" Timer = "+string(timer));
	timer -= 1;	
	show_debug_message(" Odejmij -1 ");
	show_debug_message(" koniec odejmowania timera ");
} else { show_debug_message(" else // jezeli timer <= 0 ");
	FindMultiple2 = true; show_debug_message(" szukaj obiektu // FindMultiple2 = true ");
	show_debug_message(" koniec Else  ");
}
show_debug_message(" Koniec Timera ");
show_debug_message(" KONIEC STEPU ");

 

 

DEBUG MESSAGE.rtf

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Generalnie to trzeba też znaleźć sposób, by do tego zagadnienia podejść. Ja bym od razu odrzucił szukanie w każdej klatce, przez każdy z obiektów, jakiegoś innego najbliższego. Czemu? Bo to od razu powoduje taki problem, że kilka obiektów na raz znajdzie siebie i każdy poleci w inną stronę.

Ugryzł bym to inaczej. Takiego połączenia chcesz przecież dokonać, gdy pojawią się dwa przedmioty blisko siebie - nigdy, gdy jest jeden. Kluczem jest właśnie tutaj "pojawią się". Ja bym w momencie tworzenia nowego obiektu sprawdzał, czy w granicy X od niego, za pomocą collision_circle albo collision_circle_list, które mają argument NOTME wykluczający obecną instancję (w tym przypadku - świeżo stworzoną).

var near = collision_circle(x,y,300,drewno,false,true);

if (near > 0) {

    near.amount += amount;
   instance_destroy();

}

I po sprawie. Jak chcesz animować, że one się przyciągają, to nieco wiecej zabawy i wtedy collision_circle_list się przyda, żeby znaleźć wszystkie w tej samej strefie, oraz wykluczać np. te które się już "animują" (o ile tak chcesz).

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 rok później...

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