Ice Cube Opublikowano 31 Października 2018 Udostępnij Opublikowano 31 Października 2018 Witam w obiekcie pocisk : create: move free -speed: 5 ,direction:obj_camera.direction z=10 draw: d3d_draw_wall(x-7*global.camsin,y-7*global.camcos,z, x+7*global.camsin,y+7*global.camcos,z+5,textura,1,1); ////////////////////////////////////////////////////////////////////// pytanie jak zrobić strzelanie góra dół? mam w obj_camera.pitch i te "pitch" się zmienia w zależnosci gdzie patrze góra,dół rozumiem,że musze coś zrobić ze zmienna Z ale co ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 31 Października 2018 Udostępnij Opublikowano 31 Października 2018 Cześć, do tego typu obliczeń pomocne są wektory. W Create Event pocisku stwórz zmienne wektora odpowiedzialnego za kierunek ruchu np. // (...) pozostałe zmienne pocisku jak i pozycja 'z' // budujemy wektor lotu pocisku: var dir_x = global.camcos; var dir_y = global.camsin; var dir_z = global.campitch; // normalizujemy wektor dir_xyz var dir_len = sqrt(dir_x*dir_x + dir_y*dir_y + dir_z*dir_z); dir_x /= dir_len; dir_y /= dir_len; dir_z /= dir_len; // predkosc pocisku var spd = 5; // tworzymy wektor poruszania sie naszego pocisku jako motion_xyz: motion_x = dir_x * spd; motion_y = dir_y * spd; motion_z = dir_z * spd; Nie jestem pewien, czy Twoje obj_camera.pitch jest rezultatem funkcji trygonometrycznych, podeślij może kod odpowiedzialny za obracanie się kamery góra dół to ew. poprawię powyższy kod. Następnie w Step Event dodajemy nasze zmienne motion_xyz do pozycji pocisku: x += motion_x; y += motion_y; z += motion_z; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 1 Listopada 2018 Autor Udostępnij Opublikowano 1 Listopada 2018 step: direction -= (display_mouse_get_x() -display_get_width()/2)/10; pitch += (display_mouse_get_y() -display_get_height()/2)/10; pitch = max(min(pitch,10),-10); //100 display_mouse_set(display_get_width()/2,display_get_height()/2); draw: d3d_set_projection(x,y,z,x+cos(direction*pi/180),y-sin(direction*pi/180),z-sin(pitch*pi/180),0,0,1); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 1 Listopada 2018 Udostępnij Opublikowano 1 Listopada 2018 Zachowaj wartości obracania do zmiennej globalnej, np.: // parametry kamery global.cam_lookat_x = cos(direction*pi/180); global.cam_lookat_y = -sin(direction*pi/180); global.cam_lookat_z = -sin(pitch*pi/180); // projekcja (zwroc uwage na + zamiast -) d3d_set_projection(x,y,z,x+global.cam_lookat_x,y+global.cam_lookat_y,z+global.cam_lookat_z,0,0,1); Następnie w Create Event pocisku zmodyfikuj kod: // (...) // budujemy wektor lotu pocisku: var dir_x = global.cam_lookat_x; var dir_y = global.cam_lookat_y; var dir_z = global.cam_lookat_z; // (...) To powinno wystarczyć Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 1 Listopada 2018 Autor Udostępnij Opublikowano 1 Listopada 2018 12 minut temu, Konrad-GM napisał: Zachowaj wartości obracania do zmiennej globalnej, np.: // parametry kamery global.cam_lookat_x = cos(direction*pi/180); global.cam_lookat_y = -sin(direction*pi/180); global.cam_lookat_z = -sin(pitch*pi/180); // projekcja (zwroc uwage na + zamiast -) d3d_set_projection(x,y,z,x+global.cam_lookat_x,y+global.cam_lookat_y,z+global.cam_lookat_z,0,0,1); Następnie w Create Event pocisku zmodyfikuj kod: // (...) // budujemy wektor lotu pocisku: var dir_x = global.cam_lookat_x; var dir_y = global.cam_lookat_y; var dir_z = global.cam_lookat_z; // (...) To powinno wystarczyć w create camera mam juz: { global.camsin = sin(direction*pi/180); global.camcos = cos(direction*pi/180); } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 1 Listopada 2018 Udostępnij Opublikowano 1 Listopada 2018 Ok, zapisz jeszcze sobie zmienną pitch do zmiennej globalnej w takim razie i przenieś z Create Event do Step Event. IMO bardziej poprawne byłoby liczenie wektora lookat tak: var dirrad = degtorad(direction); var pitchrad = degtorad(pitch); global.camcos = cos(dirrad) * cos(pitchrad); global.camsin = -sin(dirrad) * cos(pitchrad); global.campitch = sin(pitchrad); Żeby nie liczyć tego 2 razy, użyj tych globalnych zmiennych do funkcji d3d_set_projection, zamiast liczyć je w kilku miejscach. Teraz możesz użyć tego skryptu co Ci podesłałem do pocisku. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 1 Listopada 2018 Autor Udostępnij Opublikowano 1 Listopada 2018 Kurde za bardzo zamieszane sie to stało,walcze z tym i ciągle mam pełno błędów głównie ze zmiennymi,że nie istnieje taka zmienna ;/ ,zacznijmy jeszcze raz od nowa jak możesz podaj co ma być dokladnie w : obj_cam: create step obj_pocisk create step draw i odpisze jakie mi błędy się pokażą Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 2 Listopada 2018 Udostępnij Opublikowano 2 Listopada 2018 Widzę, że porwałeś się z motyką na słońce. Może lepiej byłoby, jakbyś podesłał treść błędu, abyś zrozumiał co robisz źle w takim razie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 2 Listopada 2018 Autor Udostępnij Opublikowano 2 Listopada 2018 Godzinę temu, Konrad-GM napisał: Widzę, że porwałeś się z motyką na słońce. Może lepiej byłoby, jakbyś podesłał treść błędu, abyś zrozumiał co robisz źle w takim razie. Oczywiscie,że tak, lubię takie wyzwania dzięki temu można się wiele nauczyć,tymbardziej jeżeli ktoś to dobrze tłumaczy np. tak jak ty to robisz. a więc mam takie coś: obj_cam create: pitch=0 dirrad = degtorad(direction); pitchrad = degtorad(pitch); {global.camcos = cos(dirrad) * cos(pitchrad); global.camsin = -sin(dirrad) * cos(pitchrad);} step: global.campitch = sin(pitchrad); direction -= (display_mouse_get_x() -display_get_width()/2)/10; pitch += (display_mouse_get_y() -display_get_height()/2)/10; pitch = max(min(pitch,10),-10); //100 display_mouse_set(display_get_width()/2,display_get_height()/2); ----------------------------------------- obj_pocisk create: z=10 // budujemy wektor lotu pocisku: dir_x = global.camcos; dir_y = global.camsin; dir_z = global.campitch; // normalizujemy wektor dir_xyz dir_len = sqrt(dir_x*dir_x + dir_y*dir_y + dir_z*dir_z); dir_x /= dir_len; dir_y /= dir_len; dir_z /= dir_len; // predkosc pocisku spd = 5; // tworzymy wektor poruszania sie naszego pocisku jako motion_xyz: motion_x = dir_x * spd; motion_y = dir_y * spd; motion_z = dir_z * spd; step: x += motion_x; y += motion_y; z += motion_z; draw: d3d_draw_wall(x-7*global.camsin,y-7*global.camcos,z, x+7*global.camsin,y+7*global.camcos,z+5,tex,1,1); błędów już niema,ale strzał wogóle nie reaguje na góra/dół oraz jeżeli daje w prawo to strzał idzie w lewo ,a jeżeli daje w lewo idzie w prawo ;/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rozwiązanie Konrad-GM Opublikowano 2 Listopada 2018 Rozwiązanie Udostępnij Opublikowano 2 Listopada 2018 Z tego co widzę, nie aktualizujesz zmiennych globalnych, powinno to wyglądać tak: obj_cam i nasz Create Event: // włączamy tryb 3D d3d_start(); // wysokość naszej kamery nad podłogą z = 10 // deklarujemy naszą zmienną do obracania się bohatera góra/dół pitch = 0; // dodatkowo użyjemy wbudowanej zmiennej tj. // 'direction' do obracania się lewo/prawo // deklarujemy nasze zmienne globalne, // będziemy je aktualizować w Step Event global.camcos = 1; // tymczasowo nadajemy wartość 1, ponieważ cos(0rad) = 1 global.camsin = 0; // natomiast sin(0rad) = 0 global.campitch = 0; Create Event głównie służy nam tutaj do deklaracji naszych zmiennych, potem będziemy na nich operować w Step Event: // obracamy naszego bohatera // operujemy tutaj na stopniach (degrees) direction -= (display_mouse_get_x() - display_get_width()/2)/10; pitch -= (display_mouse_get_y() - display_get_height()/2)/10; pitch = max(min(pitch,89.9),-89.9); // 180 stopni góra/dół, -0.1 żeby uniknąć błedu z przeskokiem display_mouse_set(display_get_width()/2,display_get_height()/2); // aktualizujemy nasze zmienne globalne // tutaj operujemy już na radianach (radians) // dlatego użyjemy funkcji degtorad var dirrad = degtorad(direction); var pitchrad = degtorad(pitch); // poniższe równanie to nic innego jak zredukowane mnożenie macierzy obrotu // więcej możesz się dowiedzieć np. na http://planning.cs.uiuc.edu/node102.html // jak pomnożysz macierze [Pitch] * [Yaw] przez wektor |xyz|, otrzymasz poniższe równanie: global.camcos = cos(dirrad) * cos(pitchrad); global.camsin = -sin(dirrad) * cos(pitchrad); global.campitch = sin(pitchrad); W Draw Event bohatera ustawiamy projekcję naszej kamery: // ustawiamy projekcję rysowania d3d_set_projection( // pozycja 'oka' kamery x, y, z, // punkt, na który 'patrzy' nasza kamera // użyjemy tutaj naszych zmiennych globalnych i dodamy do aktualnej pozycji x + global.camcos, y + global.camsin, z + global.campitch, // wektor 'góry' naszej kamery // pozycja Z jest naszą górą 0, 0, 1 ); Teraz nasz pocisk musi dowiedzieć się, w którym kierunku 'patrzy' nasz bohater i następnie będziemy na tej podstawie obliczać. obj_pocisk i w Create Event deklarujemy następujące zmienne: // wysokość pocisku od podłogi z = 10 // tekstura pocisku tex = sprite_get_texture(spr_pocisk, 0); // budujemy wektor lotu pocisku // ze zmiennych tymczasowych: var dir_x = global.camcos; var dir_y = global.camsin; var dir_z = global.campitch; // normalizujemy wektor dir_xyz var dir_len = sqrt(dir_x*dir_x + dir_y*dir_y + dir_z*dir_z); dir_x /= dir_len; dir_y /= dir_len; dir_z /= dir_len; // predkosc pocisku jako zmienna tymczasowa // posłuży nam do obliczenia wektora motion_xyz var spd = 5; // tworzymy zmienną lokalną jako wektor motion_xyz // poruszania sie naszego pocisku: motion_x = dir_x * spd; // 'wydłużamy' wektor o wartość zmiennej spd motion_y = dir_y * spd; motion_z = dir_z * spd; Step Event w pocisku jest trywialny i chyba nie wymaga tłumaczenia: x += motion_x; y += motion_y; z += motion_z; Teraz czas na rysowanie naszego pocisku w Draw Event: // obliczamy obrót w stronę kamery: var dirtocam = point_direction(obj_cam.x, obj_cam.y, x, y); var dirtocamrad = degtorad(dirtocam); var xx = -cos(dirtocamrad + pi/2) * 5; var yy = sin(dirtocamrad + pi/2) * 5; // rysujemy 'ścianę' odwróconą w stronę naszej kamery, tzw. billboard: d3d_draw_wall( // x1, y1, z1 x - xx, y - yy, z + 5, // x2, y2, z2 x + xx, y + yy, z - 5, // tekstura i jej powtarzanie tex, 1, 1 ); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 3 Listopada 2018 Autor Udostępnij Opublikowano 3 Listopada 2018 Dnia 2.11.2018 o 16:44, Konrad-GM napisał: Z tego co widzę, nie aktualizujesz zmiennych globalnych, powinno to wyglądać tak: obj_cam i nasz Create Event: // włączamy tryb 3D d3d_start(); // wysokość naszej kamery nad podłogą z = 10 // deklarujemy naszą zmienną do obracania się bohatera góra/dół pitch = 0; // dodatkowo użyjemy wbudowanej zmiennej tj. // 'direction' do obracania się lewo/prawo // deklarujemy nasze zmienne globalne, // będziemy je aktualizować w Step Event global.camcos = 1; // tymczasowo nadajemy wartość 1, ponieważ cos(0rad) = 1 global.camsin = 0; // natomiast sin(0rad) = 0 global.campitch = 0; Create Event głównie służy nam tutaj do deklaracji naszych zmiennych, potem będziemy na nich operować w Step Event: // obracamy naszego bohatera // operujemy tutaj na stopniach (degrees) direction -= (display_mouse_get_x() - display_get_width()/2)/10; pitch -= (display_mouse_get_y() - display_get_height()/2)/10; pitch = max(min(pitch,89.9),-89.9); // 180 stopni góra/dół, -0.1 żeby uniknąć błedu z przeskokiem display_mouse_set(display_get_width()/2,display_get_height()/2); // aktualizujemy nasze zmienne globalne // tutaj operujemy już na radianach (radians) // dlatego użyjemy funkcji degtorad var dirrad = degtorad(direction); var pitchrad = degtorad(pitch); // poniższe równanie to nic innego jak zredukowane mnożenie macierzy obrotu // więcej możesz się dowiedzieć np. na http://planning.cs.uiuc.edu/node102.html // jak pomnożysz macierze [Pitch] * [Yaw] przez wektor |xyz|, otrzymasz poniższe równanie: global.camcos = cos(dirrad) * cos(pitchrad); global.camsin = -sin(dirrad) * cos(pitchrad); global.campitch = sin(pitchrad); W Draw Event bohatera ustawiamy projekcję naszej kamery: // ustawiamy projekcję rysowania d3d_set_projection( // pozycja 'oka' kamery x, y, z, // punkt, na który 'patrzy' nasza kamera // użyjemy tutaj naszych zmiennych globalnych i dodamy do aktualnej pozycji x + global.camcos, y + global.camsin, z + global.campitch, // wektor 'góry' naszej kamery // pozycja Z jest naszą górą 0, 0, 1 ); Teraz nasz pocisk musi dowiedzieć się, w którym kierunku 'patrzy' nasz bohater i następnie będziemy na tej podstawie obliczać. obj_pocisk i w Create Event deklarujemy następujące zmienne: // wysokość pocisku od podłogi z = 10 // tekstura pocisku tex = sprite_get_texture(spr_pocisk, 0); // budujemy wektor lotu pocisku // ze zmiennych tymczasowych: var dir_x = global.camcos; var dir_y = global.camsin; var dir_z = global.campitch; // normalizujemy wektor dir_xyz var dir_len = sqrt(dir_x*dir_x + dir_y*dir_y + dir_z*dir_z); dir_x /= dir_len; dir_y /= dir_len; dir_z /= dir_len; // predkosc pocisku jako zmienna tymczasowa // posłuży nam do obliczenia wektora motion_xyz var spd = 5; // tworzymy zmienną lokalną jako wektor motion_xyz // poruszania sie naszego pocisku: motion_x = dir_x * spd; // 'wydłużamy' wektor o wartość zmiennej spd motion_y = dir_y * spd; motion_z = dir_z * spd; Step Event w pocisku jest trywialny i chyba nie wymaga tłumaczenia: x += motion_x; y += motion_y; z += motion_z; Teraz czas na rysowanie naszego pocisku w Draw Event: // obliczamy obrót w stronę kamery: var dirtocam = point_direction(obj_cam.x, obj_cam.y, x, y); var dirtocamrad = degtorad(dirtocam); var xx = -cos(dirtocamrad + pi/2) * 5; var yy = sin(dirtocamrad + pi/2) * 5; // rysujemy 'ścianę' odwróconą w stronę naszej kamery, tzw. billboard: d3d_draw_wall( // x1, y1, z1 x - xx, y - yy, z + 5, // x2, y2, z2 x + xx, y + yy, z - 5, // tekstura i jej powtarzanie tex, 1, 1 ); Elegancko wytłumaczone,działa!! wielkie dzieki! ale nie obejdzie sie bez kolejnych pytan Moje wszystkie obiekty ,które były w grze np. postacie teraz gdy staje na wprost ich to nie widać ich tak jak kiedyś tzn. textury nie są na wprost mnie oto kod z DRAW postaci,który poprzednio działał: d3d_draw_wall(x-4*global.camsin,y-4*global.camcos,40, x+4*global.camsin,y+4*global.camcos,0,sprite_get_texture(spr_postac1,0),1,1); ten kod był bardzo prosty i skuteczny co teraz zmienić by działało jak poprzednio? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 3 Listopada 2018 Udostępnij Opublikowano 3 Listopada 2018 Spróbuj tej metody: // wektor patrzenia kamery var xx = global.camcos * 3; var yy = global.camsin * 3; // odwracamy wektor o 90 stopni var x1 = yy; var y1 = -xx; // odwracamy wektor ale o -90 stopni var x2 = -yy; var y2 = xx; // rysujemy nasz billboard d3d_draw_wall(x + x1, y + y1, 12, x + x2, y + y2, 0, tex, 1, 1); Generalnie możesz tym też zastąpić kod Draw Event w obj_pocisk. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 3 Listopada 2018 Autor Udostępnij Opublikowano 3 Listopada 2018 34 minuty temu, Konrad-GM napisał: Spróbuj tej metody: // wektor patrzenia kamery var xx = global.camcos * 3; var yy = global.camsin * 3; // odwracamy wektor o 90 stopni var x1 = yy; var y1 = -xx; // odwracamy wektor ale o -90 stopni var x2 = -yy; var y2 = xx; // rysujemy nasz billboard d3d_draw_wall(x + x1, y + y1, 12, x + x2, y + y2, 0, tex, 1, 1); Generalnie możesz tym też zastąpić kod Draw Event w obj_pocisk. var xx = global.camcos * 3; - dlaczego 3 ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 4 Listopada 2018 Udostępnij Opublikowano 4 Listopada 2018 Hm, wstawiłem 3 zamiast 4, też podmień wysokość 'z', sorry. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 4 Listopada 2018 Autor Udostępnij Opublikowano 4 Listopada 2018 ok wszystko działa ale oczywiście pojawił się kolejny problem! jeżeli strzelam do potwora ktory jest solid i ma wysokosc 22 w jego kolizji z pociskiem jest kod: if z<23 with(other) instance_destroy();instance_destroy() // jezeli pocisk trafi potwora zlikwiduj potwora i pocisk - i to działa ale jeżeli pocisk trafi nad jego głową to nie przelatuje tylko zatrzymuje sie i porusza się pionowo do góry ;/ dodałem Else solid=false a w step solid=true i przy pierwszym pocisku dalej leci do góry,dopiero kolejny przelatuje mu nad głową poprawnie jakies pomysły jak to rozgryzc? p.s.s pocisk nie jest solid Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 5 Listopada 2018 Udostępnij Opublikowano 5 Listopada 2018 GMowa opcja solid jest użyteczna ale jedynie do gier 2D, tutaj Ci się nie przyda więc pociskowi musisz sprawdzać kolizję inaczej. Najprostszym sposobem byłoby sprawdzanie kolizji w obj_pocisk Collision Event [Wróg - Pocisk]. Możesz ustawić jednego rodzica wrogom, żeby nie tworzyć eventów dla każdego z ich rodzaju. W tym evencie dopiero sprawdzaj warunek: // w tym evencie kolizja nastąpiła (w 2D) // sprawdźmy, czy również występuje ona na tej samej wysokości co pocisk if (z > other.z) { // 'z' pocisku porównujemy z pozycją 'z' wroga if (z < other.z + wysokosc) { // ^ ale uwzględniając wysokość wroga with(other) { instance_destroy(); // usuń wroga } instance_destroy(); // usuń pocisk } } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 6 Listopada 2018 Autor Udostępnij Opublikowano 6 Listopada 2018 Dnia 5.11.2018 o 18:23, Konrad-GM napisał: GMowa opcja solid jest użyteczna ale jedynie do gier 2D, tutaj Ci się nie przyda więc pociskowi musisz sprawdzać kolizję inaczej. Najprostszym sposobem byłoby sprawdzanie kolizji w obj_pocisk Collision Event [Wróg - Pocisk]. Możesz ustawić jednego rodzica wrogom, żeby nie tworzyć eventów dla każdego z ich rodzaju. W tym evencie dopiero sprawdzaj warunek: // w tym evencie kolizja nastąpiła (w 2D) // sprawdźmy, czy również występuje ona na tej samej wysokości co pocisk if (z > other.z) { // 'z' pocisku porównujemy z pozycją 'z' wroga if (z < other.z + wysokosc) { // ^ ale uwzględniając wysokość wroga with(other) { instance_destroy(); // usuń wroga } instance_destroy(); // usuń pocisk } } Rozumiem o co chodzi z kolizją 3d ,ale albo mam jakiś błąd w dalszym kodzie,albo to jakiś błąd gm8 ponieważ jeżeli wytne cały kod kolizji pocisk normalnie przelatuje przez wroga a jeżeli dam tylko (na klockach) kolizje pocisku z wrogiem i nic wiecej tam nie dam to gdy pocisk trafia we wroga pocisk staje w miejscu gdzie jest wróg! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 6 Listopada 2018 Udostępnij Opublikowano 6 Listopada 2018 Sprawdziłem na GMS i sytuacja wygląda tak samo, najwyraźniej GameMaker jakoś inaczej obsługuje kolizje z obiektami z włączoną flagą solid. Jedyne rozwiązanie jakie tu widzę, to wyłączenie obiektom funkcji solid i obsłużenie wszystkich kolizji własnym kodem. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 6 Listopada 2018 Autor Udostępnij Opublikowano 6 Listopada 2018 3 minuty temu, Konrad-GM napisał: Sprawdziłem na GMS i sytuacja wygląda tak samo, najwyraźniej GameMaker jakoś inaczej obsługuje kolizje z obiektami z włączoną flagą solid. Jedyne rozwiązanie jakie tu widzę, to wyłączenie obiektom funkcji solid i obsłużenie wszystkich kolizji własnym kodem. no właśnie te solid fajnie jakby było bo jak podejde do jakiejś postaci i nie ma solid to wchodze na nią a raczej w nią;/ a nie idzie tego obejść kodem przez wyłanczanie solid jak pocisk bedzie nad głową wroga lub innej postaci tak by to w miare płynnie chodziło? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 6 Listopada 2018 Autor Udostępnij Opublikowano 6 Listopada 2018 ewentualnie niech bedzie solid wyłączone,ale zrobić kod by nie wchodzić na postacie i na wrogów Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 7 Listopada 2018 Udostępnij Opublikowano 7 Listopada 2018 Ewentualnie możesz zachować opcję z solid, ale w obiekcie obj_pocisk, w Step Event musiałbyś dodać kod odpowiedzialny za sprawdzanie kolizji zamiast w Collision Event: // sprawdzamy kolizje z wrogami with (obj_wrog) { if (place_meeting(x, y, other.id)) { // kolizja nastąpiła, ale w 2D, sprawdźmy wysokość pocisku if (other.z < 24) { with (other) { // niszczymy pocisk instance_destroy(); } // niszczymy wroga instance_destroy(); // przerywamy blok 'with' break; } } } Ice Cube 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 8 Listopada 2018 Autor Udostępnij Opublikowano 8 Listopada 2018 Dnia 7.11.2018 o 17:11, Konrad-GM napisał: Ewentualnie możesz zachować opcję z solid, ale w obiekcie obj_pocisk, w Step Event musiałbyś dodać kod odpowiedzialny za sprawdzanie kolizji zamiast w Collision Event: // sprawdzamy kolizje z wrogami with (obj_wrog) { if (place_meeting(x, y, other.id)) { // kolizja nastąpiła, ale w 2D, sprawdźmy wysokość pocisku if (other.z < 24) { with (other) { // niszczymy pocisk instance_destroy(); } // niszczymy wroga instance_destroy(); // przerywamy blok 'with' break; } } } Świetnie o to chodziło! ,ale wytłumacz mi jak to działa,że place_meeting wyłapuje pocisk nawet jak trafie w ręke potwora która nie jest idealnie na środku x i y pocisku. wiem,że kolizja łapie sprajta obiektu i tutaj akurat mam sprajta 16/16 i nie musze idealnie trafić w środek a mimo to wszystko to działa Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 8 Listopada 2018 Udostępnij Opublikowano 8 Listopada 2018 Funkcja place_meeting bierze pod uwagę maski obu instancji, maskę obj_pocisk i obj_wrog. Jeszcze istnieje taka funkcja jak position_meeting do sprawdzania kolizji tylko punktowo Ice Cube 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 8 Listopada 2018 Autor Udostępnij Opublikowano 8 Listopada 2018 4 minuty temu, Konrad-GM napisał: Funkcja place_meeting bierze pod uwagę maski obu instancji, maskę obj_pocisk i obj_wrog. Jeszcze istnieje taka funkcja jak position_meeting do sprawdzania kolizji tylko punktowo a nie działa tak wlasnie collision_circle? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 8 Listopada 2018 Udostępnij Opublikowano 8 Listopada 2018 Może ci się tak wydawać bo masz pewnie okrągłe maski kolizji. Ale one zupełnie inaczej działają place_meeting > https://docs2.yoyogames.com/index.html?page=source%2F_build%2F3_scripting%2F4_gml_reference%2Fmovement and collisions%2Fcollisions%2Fplace_meeting.html collision_circle > https://docs2.yoyogames.com/source/_build/3_scripting/4_gml_reference/movement and collisions/collisions/collision_circle.html Co ważniejsze, place_meeting zwraca true lub false a collision_circle zwraca id obiektu z którym nastąpiła kolizja Ice Cube 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 10 Listopada 2018 Autor Udostępnij Opublikowano 10 Listopada 2018 Konrad-GM , Iam Lord -Wielkie dzięki za pomoc! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 16 Listopada 2018 Autor Udostępnij Opublikowano 16 Listopada 2018 Jeszcze jedno pytanko do tematu! obiekt potwór/kolizja z nabojem/ x += lengthdir_x(5, other.direction); y += lengthdir_y(5, other.direction); jeżeli trafilem potwora odskakiwal odemnie,teraz odskakuje w bok why? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Konrad-GM Opublikowano 16 Listopada 2018 Udostępnij Opublikowano 16 Listopada 2018 Jeżeli używasz tego kodu na obj_pocisk co Ci przesłałem, to ten pocisk nie używa zmiennej direction, dlatego direction zawsze będzie równe 0. Spróbuj odczytać kierunek pocisku od jego zmiennych motion_xyz. Jest to wektor lotu pocisku i można za jego pomocą policzyć wektor normalny w którym kierunku leci pocisk na płaszczyźnie 2D tj.: // normalizujemy wektor 2D motion_xy var motionlen = sqrt(other.motion_x*other.motion_x + other.motion_y*other.motion_y); var xdir = other.motion_x / motionlen; var ydir = other.motion_y / motionlen; // teraz przesuwamy wroga x += xdir * 5; y += ydir * 5; Ice Cube 1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 16 Listopada 2018 Autor Udostępnij Opublikowano 16 Listopada 2018 2 godziny temu, Konrad-GM napisał: Jeżeli używasz tego kodu na obj_pocisk co Ci przesłałem, to ten pocisk nie używa zmiennej direction, dlatego direction zawsze będzie równe 0. Spróbuj odczytać kierunek pocisku od jego zmiennych motion_xyz. Jest to wektor lotu pocisku i można za jego pomocą policzyć wektor normalny w którym kierunku leci pocisk na płaszczyźnie 2D tj.: // normalizujemy wektor 2D motion_xy var motionlen = sqrt(other.motion_x*other.motion_x + other.motion_y*other.motion_y); var xdir = other.motion_x / motionlen; var ydir = other.motion_y / motionlen; // teraz przesuwamy wroga x += xdir * 5; y += ydir * 5; Działa dzięki! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ice Cube Opublikowano 16 Listopada 2018 Autor Udostępnij Opublikowano 16 Listopada 2018 Teraz, Ice Cube napisał: Działa dzięki! jakie jeszcze parametry mogę zczytać z other? tzn. other.x ,other.motion_x itp 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ę