Skocz do zawartości

pankracy

Użytkownicy
  • Postów

    320
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    1

Aktywność reputacji

  1. Lubię (+1)
    pankracy przyznał(a) reputację dla gnysek w Trampolina paraboliczna   
    Bardzo możliwe, aczkolwiek polecam też używanie move_contact_solid lub jakąś pętlę while, zeby idealnie o 1px dotknąć podłoża.
  2. Lubię (+1)
    pankracy otrzymał(a) reputację od gnysek w Animacja bohatera podczas wykonywania ruchów w wodzie jest zbyt szybka   
    Dzięki chłopaki za pomoc.
    Twój kod jest bardziej czytelniejszy dla mnie.
  3. Lubię (+1)
    pankracy przyznał(a) reputację dla gnysek w Animacja bohatera podczas wykonywania ruchów w wodzie jest zbyt szybka   
    Ja generalnie jestem za tworzeniem tzw. flag, czyli zmiennej, która stwierdza, czy coś jest czy nie. I tak bym zrobił kod. Tzn. całość w tym stylu, żeby było czytelniej:
     
    // pseudokod // 1. najpierw ustal stany postaci if (costam lub costam lub costam) { plywanie = true; } else { plywanie = false; } // 2. potem reaguj na nie // logika od ruchu, animacji itd. var predkosc_poruszania = plywanie ? 0.5 : 4; // 0.5 jak pływamy, 4 jak nie pływamy var ruch_poziomo = -keyboard_check(vk_left) + keyboard_check(vk_right); // zwróci -1, 0 lub 1 x += predkosc_poruszania * ruch_poziomo; if (plywanie = true) { if (sprite_index != spr_plywa) { sprite_index = spr_plywa; image_index = 0; image_speed = 0.2; } } else { ... // itd. }  
    W ten sposób trudniej się pogubić, poza tym mając zmienną od stanów, łatwiej je wymuszać i zmieniać w innych przypadkach, a nie zmieniamy zachowania (można np. włączyć pływanie podchodząc do drabinki, czy drzwi, czy wymusić na początku etapu - spoza step tego obiektu).
  4. Lubię (+1)
    pankracy przyznał(a) reputację dla gnysek w Animacja bohatera podczas wykonywania ruchów w wodzie jest zbyt szybka   
    To w sumie nie przyspiesza, a przeskakuje klatki
  5. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Animacja bohatera podczas wykonywania ruchów w wodzie jest zbyt szybka   
    Bo ją sam przyśpieszasz, wywal tą linię i z głowy.
  6. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    A to zmienna `g` jest zmienną globalną?
  7. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    Nie rozumiem, a to nie odtwarza się w całości czy jak, a ta animacja trwa aż 5 sekund?
     
    Może wystarczy tylko sprawdzanie, czy stoi na ziemi? `if !place_free(x, y+1) g = 1.0;`
  8. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    A to masz na myśli cooldown? Że gracz może ponownie użyć trampoliny PO 5 sekundach jej użycia, czy jedynie podczas trwania animacji, ale która jest odtwarzana CO 5 sekund?
     
    No grawitacją steruj już w Step par_entity, w kodzie gdzie sprawdzasz czy obiekt stoi na ziemi ustawiaj pierwotną wartość grawitacji `gravity = 1.0`. A ustawienie połowy grawitacji ustawiaj w kodzie, gdzie sterujesz trampoliną i ustawiasz graczowi prędkość odbicia, czyli w Step obj_trampolina, w bloku if place_meeting.
     
    Jak masz if place_meeting w obj_trampolina, to tam przy okazji możesz też odtworzyć dźwięk.
  9. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    `if obj_trampolina == false && place_meeting(x,y,par_entity)` serio?
  10. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    To dodaj zmienną `start` w Create obj_trampolina. Jeżeli ten obiekt dziedziczy z innego obiektu Create, to na początku skryptu użyj event_inherited() to wtedy Create rodzica również zostanie wywołany.
     
    Nie, bo zmienna `start` będzie widoczna tylko i wyłącznie w tym bloku kodu, jak tylko go opuści to zostanie usunięta - nie będzie miała żadnej wartości, ani true ani false, przestanie kompletnie istnieć.

    Polecam przejrzeć:
    https://docs.yoyogames.com/source/dadiospice/002_reference/001_gml language overview/variables/index.html - w tym podartykuły instance variables oraz local variables.
  11. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    W kodzie Step nie masz ustawianej flagi `start = true` więc technicznie flaga nigdy się nie zmienia. Wstaw `start = true` zaraz pod `alarm[0] = room_speed * 5`. Dodatkowo w Step nie sprawdzasz czy `start == false` żeby uruchomić blok odpowiedzialny za skok. Np. `if start == false && place_meeting(x,y,par_entity) {`.
  12. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    Tak, jest to jak najbardziej poprawne.
     
    obj_trampolina zmienia grawitację tylko wyłącznie kiedy dotknie par_entity, imo najlepiej byłoby przywrócić wartość w Step par_entity kiedy opadnie już na ziemię.
     
  13. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    Ale nie dziedziczą tych samych stanów, każda instancja tworzy własną wersję zmiennej `g` (jedynie na podstawie obiektu par_entity).
  14. Przykro (+0)
    pankracy otrzymał(a) reputację od gnysek w Trampolina paraboliczna   
    Tylko że ja używam starszej wersji gms 1.4 
  15. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    W takim razie musisz dodać Alarm w obiekcie obj_trampolina, np. dodaj zdarzenie Alarm[0] i w nim wstaw blok kodu resetujący flagę `start = false`. Generalnie polega to na tym, że teraz Animation End nas nie interesuje, tylko czas, więc w Animation End możesz zatrzymać animację `image_speed = 0` ale nie zmieniaj flagi `start` - to zrobi Alarm[0] po 5 sekundach.
     
    No ok, ale teraz ustawiasz zmienną `g = 0.5` w instancji obj_trampolina, zamiast w par_entity, dlatego to nie zadziała. Ustaw grawitację w instancji par_entity, przecież od tego masz blok `with instance_place(x,y,par_entity)` który tak jak hspd i vspd ustawi również zmienną `g` tylko wyłącznie w instancji par_entity dotykającej trampoliny. Natomiast resetować grawitację musisz w kodzie par_entity, bo obj_trampolina nie ma pojęcia o stanie obiektu par_entity po X czasie, jak np. czy po dwóch sekundach par_entity stoi na ziemi, czy jeszcze fruwa.

    Dodatkowo w bloku `if place_meeting(x,y,par_entity)` (ale nie w `with instance_place(x,y,par_entity)`) ustawiaj Alarm, jeżeli cooldown ma trwać 5 sekund - `alarm[0] = room_speed * 5`. Mnożymy room_speed (1 sekunda) z wartością 5, to otrzymamy 5 sekund.
  16. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    Przejrzałem dokumentację i faktycznie nie ma tego zdarzenia, to musisz w takim razie ustawiać flagę w miejscu, gdzie uruchamiasz animację.
     
    To już zależy jak będzie działać w tym wypadku, w if z place_meeting możesz ustawiać grawitację i resetować ją w kodzie Step par_entity jak "stoi" na ziemii.
     
    return nie musi przyjmować wartości, w tym wypadku przerwie całe zdarzenie Step. Jeżeli masz więcej bloków ze skryptami, to możesz użyć break, to powinno przerwać pojedynczy blok.
  17. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    Kod w Step obj_trampolina zostaw, dodaj flagę `start` w Create trampoliny, ustaw ją na `true` w zdarzeniu Animation Start a `false` po zakończeniu animacji (w zdarzeniu Animation End). Dodatkowo kod w Step wzbogać o sprawdzanie flagi start np. dodając na początku `if (start == false) return;`.
     
    Jeżeli ma wolniej opadać, to tak, pozostaje modyfikacja grawitacji. Możesz też np. zresetować grawitację (z np. 0.5 do 1.0) po dotknięciu podłoża.
  18. Lubię (+1)
    pankracy przyznał(a) reputację dla Konrad-GM w Trampolina paraboliczna   
    Zachowuj stan trampoliny w zmiennej, np. jakąś flagę i steruj nią podczas animacji w zdarzeniach Animation Start oraz Animation End. W kodzie odbicia przed place_meeting sprawdzaj, czy flaga jest True i tyle.
     
    Możesz odpalić dźwięk w zdarzeniu Animation Start.
     
  19. Lubię (+1)
    pankracy przyznał(a) reputację dla gnysek w Problem z konturem przy czcionce   
    Na pewno zgubiłeś gdzieś spację, prawidłowo funkcja powinna wyglądać tak:
    font_main = font_add_sprite_ext(font_test, "!\" $%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^+`abcdefghijklmnopqrstuvwxyz{|}~€ąćęłńóśżźĄĆĘŁŃÓŚŻŹ", true, 0); (Zwróć uwagę na backslash przed ", a potem na spację po " i przed $ ).
    Moja strona obsłuży każdy font który masz zainstalowany (jakby coś).
     
    Wydajność - to zależy co innego dzieje się w grze. Ja już robiłem takie, gdzie każda literka jest rysowana osobno i jakoś dawało radę.
  20. Lubię (+1)
    pankracy przyznał(a) reputację dla gnysek w Problem z konturem przy czcionce   
    Jeśli chcesz ładny kontur, to zrób z czcionki sprite. Podstawowy sprite możesz zrobić korzystając z mojego generatora: https://gnysek.github.io/gms-font-creator/ . Potem w dowolnym programie dodaj sobie ulubioną ramkę i dodaj font przez font_add_sprite_ext (mój generator daje od razu listę znaków która będzie drugim argumentem).
  21. Lubię (+1)
    pankracy przyznał(a) reputację dla Pogromca_kodu77 w Problem z konturem przy czcionce   
    Może to być problem tu
     
    argument1+argument7, ale sam nie wiem.Musiałbyś pokombinować.
    Łączysz argument7 który jest alpha z argumentem1 który jest y.
    Może ktoś bardziej doświadczony będzie Ci wstanie pomóc.
     
     
     
  22. Lubię (+1)
    pankracy przyznał(a) reputację dla SimianVirus7 w Problem z konturem przy czcionce   
    Tak, tam jest błąd. Ten argument7 przeszkadza.

    Plus, ten kod działa w miarę ok tylko wtedy, kiedy grubość konturu nie przekracza liczby 2. Po przekroczeniu tej wartości kontur ma braki w rogach, bo rysuje on tylko góra/dół, lewo/prawo. Niemniej plusem jest wydajność, bo zawiera tylko 5 kroków kodu. 

    Najprościej będzie to zrobić for'em, z rysowaniem 360 stopni. Nie wiem jak z wydajnością tego, tutaj starzy wyjadacze mogą się wypowiedzieć. Jakby nie było, jest tutaj 361 kroków do wykonania. Myślę, że jeśli chodzi o optymalizacje, to najlepiej shadery, ale tego jeszcze nie potrafię. 

     
    for(var i=0; i<360; i++) { draw_set_colour(_coloroutline); draw_text_ext_transformed(_x + lengthdir_x(_strong, i), _y + lengthdir_y(_strong, i), _text, _sep, _w, _xscale, _yscale, _angle); } draw_set_colour(_colortext); draw_text_ext_transformed(_x, _y, _text, _sep, _w, _xscale, _yscale, _angle);  
  23. Lubię (+1)
    pankracy przyznał(a) reputację dla gnysek w Problemy z rozmiarem GUI   
    Ale jak uniesz tą linijkę, to sie nie wykonuje reszta kodu. Zatem display_set_gui_maximize nie musisz uzywać, tak by wychodziło. Co do application_surface i viewów... no to tak jak sobie chcesz zrobić, tak musisz to ustawić, ja nie będę za Ciebie zgadywał. Musisz sam ustalić, czy na pełnym ekranie gra ma być powiększona czy 1:1, tak samo w trybie okienkowym. I samemu przeskalować to, przeliczyć proporcje itd. Nie jestem wróżką, żeby wiedzieć co chcesz osiągnąć, a application_surface, viewy i gui to trzy różne warstwy które mogą mieć różne rozmiary. Do tego application surface samemu powinno sie w jakimś post_draw rysować i wtedy też można to robić z innym rozmiarem niż 1:1, więc za dużo tu jest czynników i trzeba pod siebie wszystko ustawić po prostu, spokojnie to rozrysowując i przeliczając na kartce papieru.
  24. Lubię (+1)
    pankracy przyznał(a) reputację dla SimianVirus7 w Intro obrazkowe+wyświetlający się pod obrazkiem tekst   
    if (index == sprite_get_number(spr_ilustracja4)) { // Slajd kończy się, gdy osiągnie numer obrazu spr_ilustracja4 lub długość tablicy msg // to koniec } Pomyśl, jakie są wartości ukryte pod tymi nazwami:
    Index = zainicjowałeś go w postaci liczby "0" i domyślam się, że wcisnąłeś enter 3 razy, żeby przejść do msg[3]. Teraz index = 3;
    Sprite_get_number(spr_ilustracja4)) - ta funkcja, tak jak napisał Konrad, zwraca ilość klatek w obrazie. Domyślam się (znowu :V), że jest tam tylko JEDNA klatka, więc Sprite_get_number(spr_ilustracja4)) = 1 i zawsze tam będzie jeden, jeśli obrazek nie jest animacją.
    Tak więc, warunek zawsze będzie prawdziwy, kiedy po raz pierwszy naciśniesz enter, bo wtedy index = 1;

    Możesz to zrobić poprzez array_length_1d a jakże, bądź, w taki oto fajny sposób (coś może się nie zgadzać, bo piszę z pamięci):
    1) Robisz jeden sprite, o nazwie np. spr_intro1
    2) W tym sprite dodajesz spr_ilustracja1, spr_ilustracja2, spr_ilustracja3, spr_ilustracja4 itd. tak, żeby powstała Ci animacja. 
    3) Create masz dobrze, a w Stepie coś takiego:
     
    if (keyboard_check_pressed(vk_enter))//Zwiększyć ten indeks o jeden, jeśli naciśne Enter index+=1; if (index == sprite_get_number(spr_intro1)) //teraz możesz tego używać, bo spr_intro1 zawiera cztery klatki { // Slajd kończy się, gdy osiągnie ostanią klatkę spr_intro1 // to koniec } 4) Draw:
    //Rysuj tekst msg[i] oraz ilustracje //Wskaźnikiem jaki ma być teraz rysowany tekst/obraz, jest zmienna "index", która zmienia się wraz z przyciskiem ENTER draw_text(x+200, y+750, msg[index]); draw_sprite(spr_intro1, index, x+640, y+360);
    Pamiętaj, że msg[] i ilość klatek w spr_intro1 musi być taka sama, bo inaczej indeksowanie tablicy Ci się wysypie, ale możesz to zabezpieczyć, np za pomocą funkcji clamp() albo po prostu jak masz więcej obrazków niż tekstu, to daj pustą tablicę, czyli msg[42] = "";
  25. Lubię (+1)
    pankracy przyznał(a) reputację dla SimianVirus7 w Intro obrazkowe+wyświetlający się pod obrazkiem tekst   
    1. No to zrób if'a :V Znaczy masz już tam jednego co to sprawdza, wystarczy go przerobić pod siebie, nie będzie to trudne. Jedynym minusem tej metody jest to, że masz jedną sprawdzającą "index" na dwie sytuacje, czyli tekst i obrazki. Dlatego zawsze i tekst i obraz musi mieć taką samą pulę, czyli np. 5 obrazków to 5 tekstów (msg[5]). Ale jak masz np. więcej tekstu, to dajesz puste obrazki png, a jak masz więcej obrazków niż tekstu to dajesz pusty tekst msg[] = "";

    2. Zamień kolejność rysowania w draw xD głupol ze mnie. Najpierw niech rysuje obraz, a później tekst. 

    PS: W sumie możesz jeszcze założyć blokadę w draw przy użyciu zmiennej "index", żeby nie wyleciała poza tablice, to wtedy nie będziesz musiał dawać pustych obrazków/tekstu

    DRAW
     
    //Rysuj tekst msg[i] oraz ilustracje z blokadą na tablice //Wskaźnikiem jaki ma być teraz rysowany tekst/obraz, jest zmienna "index", która zmienia się wraz z przyciskiem ENTER draw_sprite(spr_intro1, min(index, sprite_get_number(spr_intro1)-1), x+640, y+360); //najpierw (pod spodem) rysuj obrazek var dl_tablicy = array_length_1d(msg); //zobacz jaka jest dlugosc tablicy, aby zaznaczyc końcową wartosc przy rysowaniu draw_text(x+200, y+750, msg[min(index, dl_tablicy-1)]); //później (nad obrazkiem) rysuj tekst)
    a w stepie zobaczysz czego jest więcej i do tego się odwołać w ifie
     
    var czego_wiecej = max(array_length_1d(msg), sprite_get_number(spr_intro1)); if (index == czego_wiecej) // możliwe, że będziesz musiał dać też -1, czyli index == czego_wiecej-1 { // Slajd kończy się, gdy osiągnie ostanią klatkę spr_intro1 // to koniec }  
×
×
  • Dodaj nową pozycję...