Skocz do zawartości

Flame

Użytkownicy
  • Postów

    58
  • Dołączył

  • Ostatnia wizyta

Odpowiedzi opublikowane przez Flame

  1. Nie zrozumiałeś mnie :) (albo ja ciebie xD)

     

    Potrzebuje mieć zwracane id obj_walla który koliduje z linią jego wzroku. Bez tego gra bierze najbliższą ścianę, która niekoniecznie znajduje się w zasięgu jego linii wzroku przez co przeciwnik nie atakuje. Chodzi o to, że gdy postać jest za ścianą(czyli jest dalej niż ściana w jego linii wzroku), przeciwnik nie atakuje, a gdy jest przed ścianą (co nie znaczy, że kolizji ze ścianą już nie ma) przeciwnik atakuje. Nie wiem jak mam zwrócić sobie id tego właśnie pojedyńczego bloku ściany który jest w kolizji z linią wzroku przeciwnika i o to właśnie pytam :jezor:

    A w jaki sposób odczytać ID z collision line. Collision line nie zwraca tru/false ?

  2. Dobry,

    Zrobiłem mały kodzik dot. podążania za postacią przez przeciwnika. Kodzik generalnie polega na tym żeby przeciwnik nie zobaczył postaci przez ścianę więc dałem tę linijeczkę:

    GML (step obiektu obj enemy)
    if !collision_line(x,y,x+lengthdir_x(range,dir),y+lengthdir_y(range,dir),obj_wall,false,true) && distance_to_object(obj_character)<distance_to_object(obj_wall)

    problem w tym że distance_to_object(obj_wall) nie odnosi się do ściany w zasięgu widzenia a najbliższej, która nie koniecznie jest w zasięgu linii. Z tego też powodu mimo tego, że nawet jeśli zasięg wzroku koliduje z jakąś ścianą lecz postać jest przed nią, przeciwnik nie reaguje ze względu na ścianę np. obok niego, która jest bliżej niż sama postać. Próbowałem coś robić z id obj_wall ale nie wyszło to najlepiej :/

     

    tutaj cały kodzik:

    GML (step obiektu obj enemy)
    dir=point_direction(x,y,obj_character.x,obj_character.y);

     

    if instance_exists(obj_character)

    {

    if !collision_line(x,y,x+lengthdir_x(range,dir),y+lengthdir_y(range,dir),obj_wall,false,true) && distance_to_object(obj_character)<distance_to_object(obj_wall)

    {

    if collision_line(x,y,x+lengthdir_x(range,dir),y+lengthdir_y(range,dir),obj_character,false,true) then seen=true;

    else seen=false;

    }

    else seen=false;

    }

    else seen=false;

     

    if seen==true mp_potential_step_object(obj_character.x,obj_character.y,spd,obj_wall);

     

    Dołączam SS z opisanej wyżej sytuacji: link

  3. Zmieniłem na full scale'a i teraz czarne pasy po bokach zniknęły. Jednak problem wciąż występuje bowiem wszystko jest zblurowane. Zauważyłem, że zależy to od wielkości pierwszego roomu od którego startuje gra. Gdy ustawiłem pierwszemu roomowi rozmiary 500x500 rozdzielczość mimo zachowania proporcji wyglądała jakbym miał ekran wielkości nokii 5510 xD a wyłączenie opcji "interpolate colors between pixels" powoduje że piksele są nierówne. Jedynie gdy ustawiłem moją rozdzielczość do rozmiarów pierwszego roomu w drugim roomie wszystko działao bez zarzutów tj. bez blura, bez pasów a kwadrat nie był prostokątem (czyli jak na pierwszym screenie z tego tematu)

     

    tutaj screen zblurowanej gry:

    Bez_tytu_u.png

     

    O co chodzi ;-; ?

  4. Witam,

    Wracam po dłuższej przerwie do GMa i odrazu mam problem :c. Chciałbym żeby fullscreen działał na każdej rozdzielczości więc używam do tego funkcji display_get_width() i ...height() a następnie ustawiam view z zebranych wcześniej informacji na temat rozdzielczości.

    Do ustawienia viewu korzystam z funkcji room_set_view i włączam view'a za pomocą room_set_enabled. Wiem, że te funkcje nie działają dla roomu w którym się znajdujemy dlatego ustawiam go w innym po czym przechodze do roomu gry "room_test".

     

    Tak wygląda kod:

    GML
    window_set_fullscreen(true);

     

    w=display_get_width();

    h=display_get_height();

     

    room_set_view(room_test,0,1,0,0, w, h,0,0, w, h,200,200,5,5, obj_character);

    room_set_view_enabled(room_test, true);

     

    room_goto_next();

     

    moja rozdziałka to 1680x1050 a rozmiary roomu to 3k na 3k. Kiedy ustawiam swoją rozdzielczość w room editorze na wview, hview, wport i hport to wszystko ładnie działa. Jednak gdy robie to samo za pomocą kodu pojawiają się czarne pasy po bokach i nie mam pojęcia co źle robię i jak to naprawić.

     

    Dodam jeszcze dwa screeny :

    ustawiona rozdziałka z room editora:

    fdb.png

     

    i z kodu:

    2.png

     

    Jak widać wyżej kod który zamieściłem wcześniej powoduje, że obraz jest ściśnięty i występują czarne pasy po bokach ekranu. Pomocy... :boxed:

  5. Wystarczy że stworzysz zmienną w tym obiekcie w evencie create :

    przykładowo

    GML
    punkt=true;

     

    i w evencie w którym dodajesz ten punkt (czyli pewnie w step lub w draw):

    GML
    if mouse_check_button_pressed(mb_left) and punkt=true

    {

    //kod tworzący punkt (nwm czy to obiekt czy funkcja w draw) w draw mozesz dać np : draw_set_color(c_black); draw_point(mouse_x,mouse_y);

    //lub jak robisz to za pomocą obiektu to w stepie instance_create(mouse_x,mouse_y,obj_punkt);

    punkt=false;

    }

    czyli kiedy wciśniesz lewy klawisz a punkt będzie równy "true" to wtedy stworzysz punkt a zmienna punkt zmieni wartość na false dzięki czemu po wciśnieciu ponownie lpm nie stworzy się kolejny punkt ponieważ warunkiem stworzenia punktu jest to że punkt musi mieć wartość true. A mouse_x i mouse_y bedzie stawiało obiekt w koordynatach x i y twojej myszki w grze.

  6. Fajna gierka :) Podoba mi się interakcja z otoczeniem, że wszystko jest zniszczalne. Dużo różnych przeciwników, różnorakie helikoptery, czołgi. Troche grafika taka paintowa i sterowanie wg mnie niewygodne ale można się przyzwyczaić.

  7. trojkat.png

     

    Znamy bok a, kąt prosty i kąt beta

    GML
    a=4;

    prost=degtorad(90); //zamieniamy stopnie na radiany

    beta=degtorad(55); //tu tak samo</span></span>

     

    Z tych danych możemy wyliczyć bok b, bok c, i alfa

    GML
    b=sin(beta)*(a/cos(beta));

    c=a/cos(beta);

    alfa=pi/2-beta;

     

    I teraz jak chcesz wyświetlać w grze wyniki to musisz spowrotem zamienić radiany na stopnie

    GML
    draw_text(x,y,string(radtodeg(prost)));

    draw_text(x,y,string(radtodeg(alfa)));

    draw_text(x,y,string(radtodeg(beta)));

  8. Dlaczego nie jest łatwo? Wszystkie funkcje dotyczące GUI zaczynają się od display_set_gui... :)

    Coś próbowałem z tym display_set_gui_maximise() ale też mi nie wyszło ;p Nie rozumiem do końca jak ta funkcja działa...

     

    @edit dobra już kumam jak to działa ;p Dzięki za pomoc :) Temat do zamknięcia.

  9. Dobry,

    mam problem bowiem rysuje sobie dwa sprite'y w Draw GUI, jeden znajduje się w lewym górnym rogu, drugi w prawym górnym rogu. Wszystko ok do czasu kiedy włączam fullscreen. Wtedy pojawiają się błędy...

    Nie wiem z jakiej funkcji mam skorzystać żeby ten drugi sprite rysował się w tym prawym górnym rogu na fullscreenie. Niezależnie z jakiej funcji skorzystam rysuje się on albo na środku zamiast po prawej albo rysuje się wogóle gdzieś poza ekranem...Ten pierwszy sprite rysuje się na x=0 i y=0 i z nim problemu nie ma. Normalnie gra w okienku korzysta z tego kodu :

     

    GML
    draw_sprite_ext(spr_pause,i,view_wport[0]-64,0,gui_size,gui_size,0,c_white,1);

    Niestety na fullscreenie view_wport nie działa bo rysuje się w połowie szerokości ekranu, próbowałem też z window_get_width() ale też nie działa. Co robić ??

  10. W create takiego obiektu ustawiasz alarm na 30 stepów.

    GML
    alarm[0]=30;

     

    A następnie tworzysz event alarm0 i w nim wpisujesz :

    GML
    instance_destroy();

     

    Czyli najpierw ustawiasz alarm w create na 30 stepów a gdy te 30 stepów minie wtedy wykonany zostaje event alarm0 i obiekt się usuwa.

  11. Dziekuje za odpowiedzi!

     

    "Flame" jezeli chodzi o titlesy to musze zglebic temat bo za bardzo po filmiku nie rozumiem jeszcze o co chodzi. Tzn caly zamysl tego tak ale jak to wykorzystac zeby dzialalo w grze juz nie za bardzo. Czy moglbys mi to bardziej wytlumaczyc? Jak to zastosowac nawet na najprostrzym przykladzie.

     

     

    "I am Lord" fukcja depth zalatwila sprawe;) Wielkie dzieki !!

    I am Lord na czym ta fukncja "depth" mniej wiecej polega? Dlaczego akurat to pomoglo zalatwic problem?

    Wiem ze za przeproszeniem truje dupe ale chcialbym mozliwe jak najbardziej zrozumiec GM :)

    Wielkie dzieki !!

     

    Pozdrawiam

     

    Depth to taka wbudowana zmienna odpowidająca za głębokość obiektu. Im mniejszy depth tym obiekt będzie bardziej na wierzchu. Przykładowo gdy nalożysz na siebie dwa obiekty - jeden z depthem 1, drugi zaś -1 to ten drugi będzie na pierwszym planie a pierwszy będzie zakryty.

     

    @Uzjel ma trochę racji. Help w GameMakerze nie gryzie :P

  12. Nakładasz jeden obiekt na drugi. Wogóle lepiej jakbyś korzystał z tilesów (są wydajniejsze od stawiania tysiąca wyświetlanych obiektów):

    A Żeby twoja postać miała z czym kolidować to na tych tilesach przez które postać nie ma przenikać nałóż obiekt ze spritem o takich samych rozmiarach jak jeden tile ale żeby nie było widać tego obiektu ponieważ tilesy są twoimi ścianami odznacz w ustawieniach obiektu funkcje visible żeby obiekt nie był widoczny. I w tym momencie obiekt jest niewidoczny w grze ale ma swojego sprite'a i koliduje z postacią :D

     

    Btw. w edytorze roomów możesz sobie ustawić rozmiar siatki w górnym pasku (snap_x,snap_y) w przypadku jakbyś nie mógł równo ustawić obiektów obok siebie ze względu na ich nieproprcjonalną wielkość względem siatki.

  13. Możesz stworzyć skrypt w którym zdefiniujesz sobie argumenty (argument0, argument1 itd.) i potem już tylko ustawiać ich wartości w kodzie obiektu.

    Np. stworzyłeś sobie skrypt scr_mission i w skrypcie zdefiniowałeś sobie ,że argument0=zmienna odpowiadająca za nazwę misji, argument1=zmienna odp. za kille i tworzysz w ten sposób normalną własną funkcje : scr_mission(nazwa misji, kille) którą piszesz już w kodzie obiektu.

     

    GML
    //scr_mission(nazwa_misji,kille do zdobycia);

    globalvar nazwa, max_kill, mission_completed;

     

    nazwa=argument0;

    max_kill=argument1;

    mission_completed=0;

     

    if kill==max_kill && mission_completed==0

    {

    show_message('Ukończyłeś misje');

    mission_completed=1;

    kill=0;

    }

     

    if mission_completed==1

    {

    //coś się dzieje dostajesz kase i nowe diax eq

    show_message('jej diax eq');

    mission_completed=2; //żebyś nie mogł robić znowu tej misji

    }

    no i oczywiście musisz tą zmienną kill gdzies se zdefiniować w obiekcie.

     

    a w stepie obiektu :

    GML
    scr_mission('zabij_smoki',10);

     

    I na tej zasadzie twórz sobie dalej argumenty np. obiekt do zabicia itp.

  14. Jak wogóle patrze na tego screena to on jest lekko rozciągnięty choć może mi sie wydawać.

    Korzystasz z viewów ? No bo może ustawiłeś view in room na 500x500 a port on screen na jakieś 1280x1024 i ci się obraz rozciągnął i ta linia pojawiła.

    Bo ogólnie jak masz view in room na 500x500 to port on screen musi mieć np. 1000x1000 bo 500x2 albo 250x250 bo 500/2 a nie może mieć 254x254 bo to sie ani nie mnoży ani nie dzieli.

    Spróbuj.

     

    Jakbyś dał link do projektu to projektu byłoby łatwiej wyłapać błąd ,zamiast zgadywania co może być przyczyną bo przyczyn mogą być dziesiątki.

×
×
  • Dodaj nową pozycję...