ZyperPL Opublikowano 26 Września 2010 Udostępnij Opublikowano 26 Września 2010 Siemka! Mam malutkie pytanko, jak zrobić, że jakaś akcja dzieje się tylko gdy obj_postac, patrzy wprost na obj_najblizszywrog? Chyba trzeba użyć direction, ale jak? Proszę o pomoc. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Lechu4444 Opublikowano 26 Września 2010 Udostępnij Opublikowano 26 Września 2010 możesz rysować linie w kierunku direction na daną odległość korzystając z lengthdir' ów i gdy linia koliduje z graczem(collision_line) wykonuje się akcja Przepis na rysowanie linii: GML draw_line(x,y,lengthdir_x('długość linii',direction),lengthdir_y('długość linii',direction)) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 26 Września 2010 Udostępnij Opublikowano 26 Września 2010 Piszesz funkcję angdiff(ang1, ang2), która będzie zwracać różnicę kątów: GML return ((((argument0 - argument1) mod 360) + 540) mod 360) - 180; I do sprawdzenia: GML if(abs(angdiff(direction, point_direction(x, y, najblizszywrog.x, najblizszywrog.y))) <= 45) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZyperPL Opublikowano 27 Września 2010 Autor Udostępnij Opublikowano 27 Września 2010 A gdzie się zmienia możliwą różnicę w kątach? Tak, żebym mógł atakować gdy będę patrzył na wroga, może gdy będę lekko od niego odwrócony, max 80 stopni? Bo teraz to nie zawsze postać mi atakuje jak ustawiam się wprost :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Grela Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 return ((((argument0 - argument1) mod 360) + 540) mod 360) - 180; Te liczby co Ci pogrubiłem, to są kąty możesz je zmieniać Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 Nie słuchaj Greli D: Całe abs(angdiff(direction, point_direction(x, y, najblizszywrog.x, najblizszywrog.y))) to jest różnica kątów między tym, gdzie patrzysz, a tym, gdzie powinieneś patrzeć (prosto na kogośtam). Więc to "45" to jest te maksymalne odchylenie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZyperPL Opublikowano 27 Września 2010 Autor Udostępnij Opublikowano 27 Września 2010 Zmieniłem na 90 i mam jeszcze w warunku distance_to_object(najblizszywrog), a gdy chcę czasem zaatakować wroga, nic się nie dzieje, tak jakby postać nie patrzała prosto na wroga :/ Bez tego patrzenia wszystko jest ok, z samym distance_to... Nie wiem w czym problem, ale może jeszcze po kombinuje i samo się naprawi :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 Ale mozna i tak (zrób sobie nowy skrypt): GML dir=point_direction(x,y,argument0.x,argument0.y); if (di==90 or dir==180 or dir==270 or dir==0) { return true; } else { return false; } I teraz sobie dajesz gdzies w stepie: GML if (mojskrypt(wrog)==true){Patrzy na niego w lini prostej :)} Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 Dawka, sory ale co Ty pierdzielisz :/ ? Nie dość że podałeś kod _potencjalnie_ działający tylko po liniach prostych, to NAWET NIE UWZGLĘDNIŁEŚ W TYM KIERUNKU, W KTÓRYM PATRZY GRACZ, więc powiedz mi jakim cudem by to miało działać. Już nie będę się też czepiał, że łatwiej by to było zrobić resztą z dzielenia, ale już kod GML if(warunek) { return true; } else { return false; } tak wali po oczach, że aż się nie da nie poprawić:GML return warunek; I nie używaj == true, bo w przypadku warunku to to dosłownie nic nie robi. Jak nie wiecie to się nie udzielajcie, plax. Bo tylko w błąd wprowadzacie. Ed: Skupiłem się na jechaniu po Dawce i zapomniałem o temacie : D Zmieniłem na 90 i mam jeszcze w warunku distance_to_object(najblizszywrog), a gdy chcę czasem zaatakować wroga, nic się nie dzieje, tak jakby postać nie patrzała prosto na wroga :/ Bez tego patrzenia wszystko jest ok, z samym distance_to...Nie wiem dokładnie co jest, ale spróbuj dopisać do stepa gdzieś kodGML global.test = abs(angdiff(direction, point_direction(x, y, najblizszywrog.x, najblizszywrog.y))), odpal grę w Debug Mode (czerwona strzałka), i dodaj do listy monitorowanych zmiennych (zielona ikonka plusika) "global.test" - będziesz widział na żywo, jaka jest ta różnica kątów, jak daleko od przeciwnika gracz patrzy. Łatwiej będzie stwierdzić, w czym problem - jeśli kąty w tym debug modzie będą się zgadzały z tym co widzisz "na oko" to problem tkwi gdzieś w tych twoich kodach na ataki itd., jeśli kąty nie będą działały (muszą działać, ale co tam) to napisz, zajmiemy się tym głębiej : D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawka83 Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 O fakin szit faktycznie popiernczyło mi się już zupełnie! Mój kod który sprawdza czy gracz znajduje sie w lini prostej do obiektu. Edit: Czuje się zjechany. W sumie to chyba by się to przerobić na kod który sprawdza czy gracz patrzy ale gracz musiał by się poruszać w 4 kierunkach :P Edit2: Sory Dawidds ale nie wiem o co ci ku### chodzi z tym true chyb po to jest aby go używać!! Jestem po prostu przyzwyczajony do innego języka programistycznego to pisze tak jak pamiętam więc nie rozumiem o co się czepiasz?! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 Mu chodziło o to że: == true nic nie robi w tym warunku: (mojskrypt(wrog)==true) samo (mojskrypt(wrog)) wystarcza Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Mentoss Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 @Dawka83: 1. NO PRESSURE @Dawidds 2. W GMie, jeśli coś ma być większe niż 0 (albo większe równe 1, nie pamiętam) to wystarczy if <warunek> - nie trzeba =true. Tak to już jest, natomiast jeśli napiszesz to =true, to nic się nie stanie Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 2. W GMie, jeśli coś ma być większe niż 0 (albo większe równe 1, nie pamiętam) to wystarczy if <warunek> - nie trzeba =true. Tak to już jest, natomiast jeśli napiszesz to =true, to nic się nie stanieNo, dokładnie o to chodzi, że nic się nie stanie : D Równie dobrze mógłby zamiast if(instance_nearest(...)) pisać if(!!instance_nearest(...) >= 0.5 && pi==pi), ale... po co?? Jak już napisałem posta to aby był bardziej "wartościowy" dodałem ten drugi element który był niepotrzebny. Tyle. Koniec. I dla ścisłości - w gmie true to >=0.5. Nie pytajcie dlaczego, gm lubi być inny. Podobnie jak istnienie instance_exists() nie ma najmniejszego sensu, bo GML if(instance_exists(...))oznacza dokładnie to samo, coGML if(instance_count(...)) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 Podobnie jak istnienie instance_exists() nie ma najmniejszego sensu, boGML if(instance_exists(...))oznacza dokładnie to samo, coGML if(instance_count(...)) instance_number, chyba, że chciałeś napisać instance_exists( all ). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 27 Września 2010 Udostępnij Opublikowano 27 Września 2010 Masz mnie. Jak mogłem nie dostrzec tej bijącej po oczach różnicy koloru między #000084 a... blue. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZyperPL Opublikowano 28 Września 2010 Autor Udostępnij Opublikowano 28 Września 2010 Oki :P Już wiem w czym problem, gdy dwa objecty najblizszypotwor są wokół mnie, jeden wprost przede mną (tak jak powinno być), a jeden za mną to mi nie działa ten skrypt jak powinien, bo cały czas jest na zero :/ I nie mam pojęcia jak to naprawić.. :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 28 Września 2010 Udostępnij Opublikowano 28 Września 2010 A powiedz może, po co Ci dokładnie potrzebne to sprawdzanie tego kąta, jaki efekt chcesz uzyskać. Łatwiej będzie ;) Bo wygląda na to, że najblizszywróg wbrew pozorom nie oznacza instancji wroga o najmniejszym dystansie do gracza, tylko po prostu tak nazwałeś obiekt : D Chcesz ze wszystkich przeciwników wybrać tych, na których patrzysz i wykonać dla nich jakieś akcje? GML with(przeciwnik) { kierunekodgraczadoprzeciwnika = point_direction(player.x, player.y, x, y); if(abs(angdiff(player.dir, kierunekodgraczadoprzeciwnika)) <= 45) { akcja tylko dla tych przeciwników, na których patrzysz prosto. } } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Mentoss Opublikowano 28 Września 2010 Udostępnij Opublikowano 28 Września 2010 nic się nie stanie w sensie, że nie zrobi to różnicy, a pomiędzy instance_exists i instance_number/count jest różnica. Exists zwraca true lub false, a number zwraca ilość tych instancji. Nie maja one żadnej różnicy, gdy stawiasz warunek typu: GML if instance_exists() ponadto, jak twierdzi dokumentacja ósemki - instance_exists może mieć w argumencie słowo all, nazwe obiektu bądź ID, a instance_count/number może mieć all lub nazwe. Wszystko dlatego, że każda instancja ma swoje ID, ale czasami trzeba je policzyć. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 28 Września 2010 Udostępnij Opublikowano 28 Września 2010 -"exists zwraca true lub false" driobna uwaga - w gmie nie ma czegoś takiego jak "true" (jest, ale nie w takim sensie) - jest to najzwyczajniejsza w świecie stała, która oznacza 1. Technicznie taka sama, jak pi. False to oczywiście 0. - jak twierdzi dokumentacja ósemki - instance_exists może mieć w argumencie słowo all, nazwe obiektu bądź ID, a instance_count/number może mieć all lub nazwe. Wszystko dlatego, że każda instancja ma swoje ID, ale czasami trzeba je policzyć.To ktoś tu chyba angielski słabo zna (albo korzystasz z polskiej dokumentcji ;p ) ;) - właśnie sprawdziłem i do obydwu tych funkcji można wsadzić zarówno all, id obiektu jak i id instancji. Jeśli będziesz odpowiadał na ten post to rozwiń to: Wszystko dlatego, że każda instancja ma swoje ID, ale czasami trzeba je policzyć.Bo nie mam pojęcia, co według Ciebie trzeba "liczyć" aby dostać id instancji - ale lepiej nie ciągnijmy tego tematu już, ok? :) I na dodatek nie wymieniłeś chyba największej różnicy, dla której JEST sens istnienia instance_exists() (właśnie mnie oświeciło, pisząc poprzedniego posta na to nie wpadłem : D) - wydajnosć. Może i na poziomie gmla nie ma żadnego sensu istnienia owego instance_exists() - NIE ISTNIEJE praktyczna sytuacja, w której ktoś potrzebował by funkcji instance_exists() i nie mógł by zamiast niej użyć instance_number() - jednak z poziomu wydajności jest, i to raczej spora. A mianowicie instance_exists lecąc po kolekcji z instancjami przerywa wywołanie od razu po pierwszym wystąpieniu poszukiwanego obiektu - natomiast _number() siłą rzeczy musi dolecieć do końca, aby sprawdzić całą ilość. Więc gdyby zapisać te dwie funkcje pseudokodem to różniły by się one tylko tym jednym BREAK. Ale to tylko na poziomie runnera gma - z punktu widzenia kodera gmla nie ma żadnej. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hudy0070 Opublikowano 28 Września 2010 Udostępnij Opublikowano 28 Września 2010 Autorzy przykładu w credits, miałem gdzieś na dysku może się przyda: pole widzenia Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ZyperPL Opublikowano 28 Września 2010 Autor Udostępnij Opublikowano 28 Września 2010 @Dawidss, najblizszywrog = instance_nearest(x,y,potwor); Chcę zrobić, że gdy moja postać stoi to może zaatakować tylko potwora, który znajduje się na przeciw niej. I tak się dzieje, ale jeśli za graczem stoi DRUGI potwór wszystko się komplikuje... :/ Mój kod: GML najblizszy_potwor=instance_nearest(x,y,potwor) if distance_to_object(najblizszy_potwor)<=5 && keyboard_check_pressed(ord('F')) && czas_do_ataku=0 && (abs(angdiff(direction, point_direction(x, y, najblizszy_potwor.x, najblizszy_potwor.y))) <= 90) { najblizszy_potwor.hp-=sila sound_play(FistPunch) alarm[0]=czas_atak*room_speed } global.test=(abs(angdiff(direction, point_direction(x, y, najblizszy_potwor.x, najblizszy_potwor.y))) <= 90) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę