Skocz do zawartości
  • 0
Ice Cube

Strzał 3d

Pytanie

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 ? :( 

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

25 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 1

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
);

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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;

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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);

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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ć

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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);
}
 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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żą 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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. :D 

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 ;/ 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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 :P 

 

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?

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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 ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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

 

 

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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
    }
}

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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!

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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?

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

ewentualnie niech bedzie solid wyłączone,ale zrobić kod by nie wchodzić na postacie i na wrogów

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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;
        }
    }
}

 

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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 ;)

  • Super (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Może ci się tak wydawać bo masz pewnie okrągłe maski kolizji. Ale one zupełnie inaczej działają

 

place_meetinghttps://docs2.yoyogames.com/index.html?page=source%2F_build%2F3_scripting%2F4_gml_reference%2Fmovement and collisions%2Fcollisions%2Fplace_meeting.html

 

collision_circlehttps://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

  • Lubię (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×