Skocz do zawartości

I am Lord

Użytkownicy
  • Postów

    4 888
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    50

Odpowiedzi opublikowane przez I am Lord

  1. 5c0d05db14b9b_Beztytuu.png.9a4fa955a599cb23ab79b443967c32fe.png

     

    Ustal sobie jakąś promień twojego obiektu i na jego podstawie wystrzelisz 2 linie kolizji i sprawdzaj czy którakolwiek się z czymś zderzy. 

    punkt ABCD obliczysz tak:

    ax = x+lengthdir_x(radius, dir-90)
    ay = y+lengthdir_y(radius, dir-90)
    
    bx = x+lengthdir_x(radius, dir+90)
    by = y+lengthdir_y(radius, dir+90)
    
    cx = ax + lengthdir_x(dystans, dir)
    cy = ay + lengthdir_y(dystans, dir)
    
    dx = bx + lengthdir_x(dystans, dir)
    dy = by + lengthdir_y(dystans, dir)
      

    Mogłem się pomylić bo nie przetestowałem

  2. Tutaj przykładowo może się przydać stworzenie struktury z globalnej tablicy 2D na takiej zasadzie:

     

    enum eLevel {enID, enPunkty}
    globalvar gLevelsDat;
    
    gLevelsDat[numerLevelu, eLevel.enID] = room_1;
    gLevelsDat[numerLevelu, eLevel.enPunkty] = 50;

    pierwszy index tablicy gLevelsDat to będzie numer levelu czyli w twoim przypadku będzie to twój "global.level"

    drugi index tej tablicy to będzie odnośnik do tego jaką informację chcesz uzyskać, ja przygotowałem 2 informacje bo tyle na ten moment potrzebujesz (ale będziesz mógł to łatwo rozbudować sobie dopisując więcej rzeczy w tym enumie w 1 linice). Informacja pierwsza to id rooma, a informacja druga to liczba twoich punktów do uzyskania na nim.

     

    Najlepiej by było gdybyś stworzył sobie w twoim pierwszym roomie taką strukturę w jakimś obiekcie w create.

    Dla przykładu wyglądałoby to tak:

    enum eLevel {enID, enPunkty}
    globalvar gLevelsDat;
    
    var numerLevelu = 0;
    gLevelsDat[numerLevelu, eLevel.enID] = room_1;
    gLevelsDat[numerLevelu, eLevel.enPunkty] = 50;
    
    numerLevelu++;
    gLevelsDat[numerLevelu, eLevel.enID] = room_2;
    gLevelsDat[numerLevelu, eLevel.enPunkty] = 25;
    
    numerLevelu++;
    gLevelsDat[numerLevelu, eLevel.enID] = room_3;
    gLevelsDat[numerLevelu, eLevel.enPunkty] = 75;
    
    numerLevelu++;
    gLevelsDat[numerLevelu, eLevel.enID] = room_4;
    gLevelsDat[numerLevelu, eLevel.enPunkty] = 100;
    
    numerLevelu++;
    gLevelsDat[numerLevelu, eLevel.enID] = room_5;
    gLevelsDat[numerLevelu, eLevel.enPunkty] = 65;
    
    numerLevelu++;
    gLevelsDat[numerLevelu, eLevel.enID] = room_6;
    gLevelsDat[numerLevelu, eLevel.enPunkty] = 150;
    
    // i tak dalej

     

    No i gdy taką strukturkę już sobie stworzysz to potem możesz w swoim przejściowym roomie jej użyć w taki sposób:

    bazując na twojej zasadzie "If global.level=1 and klikamy enter { goto_room 1 i global.punkty=200} itd. dla 50 leveli"

     

    if ( keyboard_check_pressed(vk_enter) )
    {
    	global.punkty = gLevelsDat[global.level, eLevel.enPunkty];
    	room_goto(gLevelsDat[global.level, eLevel.enID]);
    }

     

     

    Takie rozwiązanie może się początkowo tobie wydawać skomplikowane ale to daje fajną elastyczność bo gdybyś np chciał dodatko kiedyś ustawić by każdy level miał np określoną ilość przeciwników do zabicia aby go przejść no to w prosty sposób moją strukturę rozbudujesz:

    enum eLevel {enID, enPunkty, enKille}
    globalvar gLevelsDat;
    
    gLevelsDat[numerLevelu, eLevel.enID] = room_1;
    gLevelsDat[numerLevelu, eLevel.enPunkty] = 50;
    gLevelsDat[numerLevelu, eLevel.enKille] = 8;

    i potem w roomie przejściowym:

    if ( keyboard_check_pressed(vk_enter) )
    {
    	global.punkty = gLevelsDat[global.level, eLevel.enPunkty];
    	global.wymaganeKille = gLevelsDat[global.level, eLevel.enKille];
    	room_goto(gLevelsDat[global.level, eLevel.enID]);
    }

    itd.

  3. Cytuj

    proszę o obszerny wykład

    No to się robi :12:

     

    Różnie można adresować, to też zależy w którym evencie to robisz.

     

    Ogólnie są dwie formy adresowania, pierwsza formą jest adresowanie podając pojedynczą kropkę a druga forma to użycie keyword with

    W obu przypadkach podajesz nazwę obiektu albo id instancji albo keyword other/self np:

    obj_mojObiekt.z
    inst_4DB70D2.z // (w GMS2)
    (100012).z // (w GMS1 i niżej)
    other.z
    self.z

    za pomocą formy obj_mojObiekt.z odnosisz się do wszystkich instancji o nazwie podanego obiektu, dlatego w tej formie jest to mało użyteczne. Bo gdybyś chciał odczytać zmienną 'z' to odczytałoby ci zmienną z instancji o największym id ze wszystkich obiektów tej nazwy dlatego że GM próbował by kolejno 'zaglądać' do każdej takiej instancji więc nadpisywał by wynik tak długo aż zostanie mu ostatnia i zwróci wartość właśnie tej ostatniej instancji.

    Ta forma ma większy użytek gdy chcesz zmienić zmienną we wszystkich obiektach tej nazwy jednocześnie np:

    obj_mojObiekt.z = 100 // i teraz każdy obiekt obj_mojObiekt ma 'z' o wartosci 100

    to samo działanie z użyciem with wygląda następująco:

    with (obj_mojObiekt)
    {
      z = 100
    }

    gdybyś jednak chciał użyć with do odczytania zmiennej 'z' to sprawa się komplikuje, zrobiłbyś to na dwa sposoby:

    // sposób pierwszy
    var tymczasowaZmienna;
    with (obj_mojObiekt)
    {
      tymczasowaZmienna = z
    }
    show_debug_message(tymczasowaZmienna) // konsola wyswietli wartość 'z' 
      
    // sposób drugi
    jakasZmiennaLokalna = 0
    with (obj_mojObiekt)
    {
      other.jakasZmiennaLokalna = z
    }
    // przypisałeś wartość zmiennej jakasZmiennaLokalna do wartosci 'z' obiektu obj_mojObiekt

     

    Jednak to tylko jest mało użyteczne adresowanie po nazwie obiektu, dużo bardziej użyteczne jest adresowanie bezpośrednio po id instancji ale takie id najpierw trzeba znać.

    Musisz sobie zwracać uwagę na to jakie funkcje zwracają id instancji, do tych najpopularniejszych należą

    instance_create(x, y, obj);
    instance_create_depth(x, y, depth, obj); // tylko dla GMS2
    instance_create_layer(x, y, layer_id, obj); // tylko dla GMS2
    
    instance_nearest(x, y, obj);
    
    // grupa funkcji z kolizji wykrywania kolizji:
    collision_*(); // np. collision_circle( x1, y1, rad, obj, prec, notme );

     

    Tak więc, podam kilka praktycznych przykładów:

    1.

    // EVENT STEP
    var ID;
    ID = instance_nearest(x, y, obj_skrzynka);
    show_debug_message(ID.z) // konsola zacznie wyświetlać wartość 'z' skrzynki do której jesteś najbliżej

    2.

    // EVENT STEP
    var ID;
    ID = collision_circle( x, y, 128, obj_skrzynka, 0, true );
    if (ID != noone)
    {
    	show_debug_message(ID.z) // konsola zacznie wyświetlać wartość 'z' skrzynki która jest w zasięgu okręgu
    }
    
    /* ten if jest tutaj potrzebny poniważ funkcje collision_* zwracają także keyword noone w przypadku gdy do kolizji nie dojdzie
     w dodatku gdy w zasięgu jest więcej skrzynek to odczyta wartość z instancji o najwyższym id 
     czyli tego obiektu który ostatni nadpisze zmienną ID*/

    3.

    // EVENT PRZYCISKU STRZAŁU
    var ID;
    ID = instance_create(x, y, obj_bullet);
    ID.z = z+64; 
    /* nowo utworzona instancja obiektu pocisków: obj_bullet będzie miała na start przypisaną wartość 'z' 
    do wartości 'z' gracza + wysokość gdzie znajduje się pistolet*/

     

    Kolejną najciekawszą sprawą adresowania zmiennych jest użycie keywordu other

    Jak mogłeś wcześniej zobaczyć, użyłem słówka other wewnątrz with, w tym przypadku other będzie miało wartość id instancji z którego wywołujesz with

    Jednak gdyby użyć other w którymś z eventów kolizji to wtedy other przyjmuje wartość id instancji z którą kolizja nastąpiła i tutaj mogę np podać przykład niszczenia się pocisku o ścianę z którą się zderza, będzie to wyglądało tak:

    // EVENT COLLISION WITH obj_sciana
    if (z > other.z && z <other.z+other.wysokosc_sciany)
    {
      instance_destroy();
    }

     

  4. Nigdy się nie wypowiadałem na temat twoich prac bo zwyczajnie nie trafia do mnie ten styl, nie rozmyślałem też nad tym co dana praca ma przedstawiać ale kurde ten autoportret to mi się bardzo podoba, może dlatego że odchodzi trochę od stylu. :)

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

×
×
  • Dodaj nową pozycję...