Skocz do zawartości

Ice Cube

Użytkownicy
  • Postów

    208
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    2

Aktywność reputacji

  1. Lubię (+1)
    Ice Cube przyznał(a) reputację dla Konrad-GM w Boki budynków migotają   
    Na moje oko wygląda to na z-fighting, precyzji z-buffera w GM nie można zmienić, ale zakładam, że i tak jest ustawiony na 24bity. Niestety pozostaje zmniejszenie maksymalnej odległości rysowania na mniejszą, albo zrobić niewielką przestrzeń między nakładającymi się teksturami, bądź w ogóle nie rysować nakładających się ścian.
  2. Lubię (+1)
    Ice Cube przyznał(a) reputację dla Konrad-GM w Boki budynków migotają   
    Niestety to jest związane z precyzją depth buffera, oddalone "piksele" nie mają dostatecznej precyzji aby nałożone na siebie elementy rysowały się w odpowiedniej kolejności, tzw. z-fighting https://en.wikipedia.org/wiki/Z-fighting i nie ma to żadnego związku z rozmiarem tekstur
     
    Jednym ze sposobów (i chyba najprostszym) może być przesunięcie elementów o niewielką wartość, aby tekstury rysowane d3d_draw_wall nie nachodziły idealnie na siebie.
  3. Super (+1)
    Ice Cube przyznał(a) reputację dla Konrad-GM w Pytanie matematyczne   
    Jeżeli chcesz zamienić bieguny wartości 0.0 - 1.0 oraz 1.0 - 0.0 w oparciu o jedną zmienną, to najprościej użyć odejmowania, np.:
     
    // W zdarzeniu Create inicjujemy potrzebne nam zmienne // Licznik czasu oraz czas w jaki ma zmienić się alpha np. w 2 sekundy sekunda = 0.0; fade_time = 2.0; // Przy aktualizacji klatki dodajemy kolejne wartości zmiennej sekunda w zdarzeniu Step // Ale uwaga! Liczymy cząstkową sekundy na daną klatkę rysowania (tzw. delta time) var delta = 1.0 / room_speed; sekunda += delta; // Teraz możemy policzyć przezroczystość sprite'ów w zdarzeniu Step // Dodatkowo wartość clampujemy do maksymalnej 1.0 var alpha = min(1.0, sekunda / fade_time) // Pierwszy sprite z przezroczystością 0.0 - 1.0 ustawiamy w zdarzeniu Step // PS. draw_set_alpha służy do ustawiania alphy dla komend draw_*, zamiast tego użyjemy image_alpha image_alpha = alpha // Dugi sprite z przezroczystością 1.0 - 0.0 ustawiamy w zdarzeniu Step // Z racji, że wartośc alpha rośnie od 0.0 do 1.0, musimy zamienić bieguny używając odejmowania image_alpha = 1.0 - alpha  
  4. Super (+1)
    Ice Cube przyznał(a) reputację dla adam014 w Odtwarzanie muzyki z katalogu   
    sound_play działa tylko na referencje zasobu a nie na plik  Więc albo dodasz sobie pliki przez sound_add i potem je odtworzysz albo zrobisz odtwarzanie z dysku jakąś dllką  
  5. Super (+1)
    Ice Cube przyznał(a) reputację dla gnysek w Odtwarzanie muzyki z katalogu   
    sound_delete po odtworzeniu
  6. Wow! (+1)
    Ice Cube otrzymał(a) reputację od SimianVirus7 w Odtwarzanie muzyki z katalogu   
    Stworzyłem małego rpg-a ,ala Gothic są w nim postacie , mają sporo do powiedzenia więc  będą przemawiać XD,
    dlatego potrzeba ładowania plików. Pozostanie chyba if ze względu na ilość plików , a będą to w miare krótkie zdania  
  7. Super (+1)
    Ice Cube przyznał(a) reputację dla adam014 w room_goto   
    Views?
  8. Super (+1)
    Ice Cube przyznał(a) reputację dla adam014 w strzal do najblizszego wroga   
    najmniejsza = min(argument1, argument2, argument3, argument4, argument5); najmniejsza = min(3, 5, 12, 2, 6); // zwroci 2 Żeby takie proste rzeczy wyjaśniać  
     
    Edit:
    Nie pamiętam ile w GMie jest max argumentów dla tej funkcji ale chyba 16.
  9. Super (+1)
    Ice Cube przyznał(a) reputację dla gnysek w strzal do najblizszego wroga   
    Ustaw wszystkim wspólnego rodzica (parent) i wtedy najbliższy jest instance_nearest(player.x, player.y, obj_rodzic);
  10. Lubię (+1)
    Ice Cube przyznał(a) reputację dla gnysek w STEAM sprzedaż własnych produkcji   
    - to taki problem założyć konto paypal ? wyrób osobną kartę do płatności internetowych (w banku, albo np. Revoluta) którą doładowujesz tylko przed płatnością, jak się boisz wycieku danych i kradzieży pieniędzy
     
    - jeśli przy teksturze nie są opisane prawa autorskie, to zakładałbym, ze jest chroniona prawami autorskimi, bądź napisał do właściciela strony. To nie torrent że sie dzielisz czym chcesz.
     
    Przypominam też, że w naszym kraju wypada płacić podatek, co najmniej dochodowy (nie trzeba do 8000zł zarobków ŁĄCZNIE z wszystkich źródeł w roku), a przychód (nie dochód) z gry dłużej niż miesiąc powyżej połowy średniej krajowej oznacza, ze trzeba założyć działalność gospodarczą (do połowy najniższej krajowej masz nierejestrowaną działalność - nadal płacisz dochodowy). W przypadku steam trzeba też z tego co kojarzę zgłosić działalność w USA (nie założyć, tylko ich poinformować, że prowadzimy handel z USA).
  11. Lubię (+1)
    Ice Cube przyznał(a) reputację dla ANtY w STEAM sprzedaż własnych produkcji   
    1. Co do płatności za możliwość dodania aplikacji na Steama:
    "The Steam App Fee may be paid with any payment method that Steam supports in your country, excluding Steam wallet funds."
     
    2. Tak, można założyć kartę dla gry kiedy jeszcze nie jest skończona - to raczej łatwo wywnioskowac przeglądając karty innych gier na Steamie.
     
    3. Steam bierze 30%, do tego musisz odjąć refundy oraz później zapłacić od kwoty którą ci prześlą podatek dochodowy. Średnio można liczyć, że dostaniesz około 50-60% pełnej kwoty.
     
    4. Tak ale nie są to jakieś bardzo intensywne testy.
     
    5. Nie. (again, łatwe do wywnioskowania przeglądając dostepne gry na Steamie)
     
    6. To już nie jest w żaden sposób Steam-specific pytanie, ale ogólnie jeśli autor takiej grafiki by się dowiedział, że korzystasz z niej bezprawnie to może cię pociągnąć do odpowiedzialności.
     
    7. Itch.io 
  12. Wow! (+1)
    Ice Cube przyznał(a) reputację dla I am Lord w Obracające się drzwi 3d   
    To tylko zalążek macierzy. Dużo bardziej rozbudowali to dopiero w GMS2
  13. Super (+1)
    Ice Cube przyznał(a) reputację dla Konrad-GM w Obracające się drzwi 3d   
    1. Źle używasz trygonometrii do obracania wektorów, potrzebne są 2 funkcje trygonometryczne, cos i sin, coś takiego:
    // x' = x * cos α - y * sin α // y' = x * sin α + y * cos α var angle = degtorad(ruchdrzwi); var rx = cos(angle); var ry = sin(angle); d3d_draw_wall( x - 4 * rx, y - 4 * ry, 25, x + 4 * rx, y + 4 * ry, 10, sprite_get_texture(spr_drzwi,1), 1, 1 ) 2. Użyj macierzy, macierze są super
    // Wersja powyższego rozwiązania, ale przedstawione jako macierz: // [cos α -sin α] // [sin α cos α] var angle = degtorad(ruchdzwi); d3d_transform_set_rotation_z(angle); d3d_transform_add_translation(x, y); d3d_draw_wall(-4, 0, 25, 4, 0, 10, sprite_get_texture(spr_drzwi, 1), 1, 1) d3d_transform_set_identity();  
  14. Lubię (+1)
    Ice Cube przyznał(a) reputację dla I am Lord w Obracające się drzwi 3d   
    A tak po za tym to "ruchdrzwi" zdefiniowałeś jako stopnie a funckja sin() za parametr kąta przyjmuje radiany. funkcja dsin() przyjmuje stopnie
  15. Lubię (+1)
    Ice Cube przyznał(a) reputację dla Threef w Animacje mp4-gif   
    Najlepszy konwerter jaki używam to serwis do gifów gfycat
  16. Lubię (+1)
    Ice Cube przyznał(a) reputację dla gnysek w GM Studio 1,konwersja z gm8.0   
    https://help.yoyogames.com/hc/en-us/articles/230330328-GameMaker-Studio-2-FAQ
     
    Gm 8 > 1.4 > 2.x
  17. Przykro (+0)
    Ice Cube przyznał(a) reputację dla gnysek w Animacje mp4-gif   
    Jest, tylko grafików brak.
  18. Super (+1)
    Ice Cube przyznał(a) reputację dla Konrad-GM w Animacje mp4-gif   
    Nikt raczej nie bawi się w takie rzeczy, bo jest to po prostu nieopłacalne/mega brzydkie w rozwiązaniu. Ale zawsze możesz nagrać filmik chociażby GifCamem i zapisać sobie jako gif - http://blog.bahraniapps.com/gifcam/
  19. Super (+1)
    Ice Cube przyznał(a) reputację dla Konrad-GM w Pytanie graficzne   
    Zgodnie ze sztuką, to powinieneś zacząć od:
    1. Rysowania wszystkich obiektów które nie są w żaden sposób przezroczyste-półprzezroczyste.
    2. Rysujesz przezroczyste/pół-przezroczyste obiekty względem ich odległości od kamery, od najdalszego sprite do najbliższego.

    Możesz manipulować zmienną depth, żeby otrzymać dość zadowalający efekt. Co prawda problem będziesz miał z ogrodzeniem np., bo może być szersze niż sprite wroga a wtedy mogą i tak nachodzić na siebie bo będziesz liczył odległości od ich środka. Więc możesz podzielić to dodatkowo aby postacie rysować zawsze na końcu, ale też względem odległości od kamery.

    Tutaj zaczyna się zabawa  Dla nie-przezroczystych ścian rysuj je na początku, daj im wysoki depth, np. `depth = 10000`. Następnie rysując pół-przezroczyste ogrodzenie odlicz im depth od odległości od kamery i dodaj jakieś przesunięcie (żeby jednak rysować postacie na końcu), cos a'la `depth = point_distance(camera.x, camera.y, self.x, self.y) + 5000`, a na końcu rysując postacie ustaw im depth już bez przesunięcia `depth=point_distance(camera.x, camera.y, self.x, self.y)`
     
    E: Chociaż nie, jak będziesz ogrodzenie rysować to Ci i tak zasłoni bohaterów, może jednak przydzielaj depth każdemu pół-przezroczystemu obiektowi w ten sam sposób: `depth=point_distance(camera.x, camera.y, self.x, self.y)` i nie rób za dużych ogrodzeń.
  20. Lubię (+1)
    Ice Cube przyznał(a) reputację dla Konrad-GM w Pytanie graficzne   
    Usunąć kanał alpha ze spritów. Ale wtedy będą to kloce a nie kształtne babeczki.
     
    Źle przydzielasz depth, bo gdybyś odwrócił kolejność rysowania to powinno działać.
     
    To naucz się żyć z blendingiem brzegów z przezroczystymi pikselami.
     
    Dokładnie, to jest ten sam problem co z blendingiem i interpolacją pikseli. Możesz spróbować shader napisać, który discardowałby Ci półprzezroczyste piksele. Ale żaden program do obróbki grafiki Ci tego nie naprawi, bo to nie w tym problem.
     
    E: GameMaker też ma opcję usuwania półprzezroczystych pikseli, opisane jest to tutaj:
    https://help.yoyogames.com/hc/en-us/articles/216754778-Optimizing-Your-Games
    Dokładniej chodzi o funkcje tj. draw_set_alpha_test, draw_set_alpha_test_ref_value
     
  21. Lubię (+1)
    Ice Cube przyznał(a) reputację dla gnysek w Wyśrodkowanie textu   
    Ma łamać nawet w pół słowa?
     
    var stack = '', result = '', text = 'Lorem ipsum dolor sit amet', len = 40; // 40px; for(i=1; i<=string_length(text); i++) {   var c = string_char_at(text, i);   if (string_width(stack + c) > len {     result += stack + '#';     stack = '';   } else {     stack += c;   } }   result += stack; return stack;  
    Jakoś tak, ale to się na pewno wywali, jak len będzie mniejsze niż najszersza litera.
  22. Lubię (+1)
    Ice Cube przyznał(a) reputację dla gnysek w Draw_set_font -problem   
    Jakiś inny event draw zmienia font. Funkcje draw powinny być w evencie draw, nigdy step, a już na pewno a nie w eventach jednorazowych - bo po prostu w tej samej klatce obrazu coś zdąży je nadpisać kolejny raz.
  23. Przykro (+0)
    Ice Cube przyznał(a) reputację dla I am Lord w Zatrzymanie gry   
    Ale to jest coś hardcodowanego w runnerze GMa więc tego nie odtworzysz. 
  24. Wow! (+1)
    Ice Cube przyznał(a) reputację dla Konrad-GM w texture_set_interpolation   
    Cześć, problem z interpolacją tekstur jest jak najbardziej "normalną" odpowiedzią od karty graficznej, generalnie ten problem występuje od zawsze, odkąd istnieje interpolacja sampli. Jednym z rozwiązań jest wyłączenie powtarzalności tekstur np. w OpenGL jest to ustawienie w teksturze flagi GL_TEXTURE_WRAP_S/T na GL_CLAMP_TO_EDGE, jednak GameMaker nie udostępnia takowych funkcji  
     
    Przykładowe ustawienia wrap-owania tekstur w OpenGL (opcje te występują również w DirectX);

     
    W Twoim przypadku GameMaker prawdopodobnie ustawia teksturom odpowiednik GL_REPEAT w DirectX, dlatego pojawiają Ci się te "artefakty" na krańcach tekstury. 
     
    Dodatkowo każda tekstura musiałaby być "stworzona" jako oddzielna tekstura w VRAM, atlas tekstur nie zadziała, jak to się dzieje w przypadku GMS1.4+ (tzw. grupy obrazków w ustawieniach GMa, ale da się to akurat ominąć).
     
    Więc w skrócie problem polega na tym, że interpolacja sampli w fragment shaderze miesza sąsiadujące kolory, tworząc tzw. texel, jak się pewnie domyślasz, artefakty które pojawiają Ci się na krańcach modelu podłogi to po prostu zmieszane kolory z drugiego krańca tekstury, dlatego też warto czasami używać tekstur seamless  Po więcej teorii dot. tekstur i metod samplowania odsyłam do https://cglearn.eu/pub/computer-graphics/textures-and-sampling
     
    Jako, że nie możemy wyłączyć powtarzalności tekstur, można za to wykluczyć krańce tekstury z samplowania, efekt nie jest idealny, ale nie ma tak oczojebnych artefaktów. Przykład poniżej:

     
     
    Jednak aby wykluczyć krańce tekstury w GMie, trzeba stworzyć własny model podłogi, bo draw_floor nie udostępnia funkcji do modyfikacji UV per vertex, ani GameMaker 8.0 nie wspiera shaderów.

    Kod obj_floor w Create Event u mnie wygląda tak:
    // tworzymy model podlogi tylko raz i przypisujemy model do zmiennej globalnej if (!variable_global_exists("model_floor")) { // obliczamy polowe texela tekstury do wykluczenia go z sampla // teraz kazdy kafelek Twojej podlogi musi miec taka sama wielkosc var u, v; u = (1.0 / background_get_width(texTile)) * 0.5; v = (1.0 / background_get_height(texTile)) * 0.5; // szerokosc i dlugosc podlogi var w, h; w = 64; h = 64; // tworzymy model podlogi (tylko raz) global.model_floor = d3d_model_create() d3d_model_primitive_begin(global.model_floor, pr_trianglefan); d3d_model_vertex_texture(global.model_floor, 0, 0, 0, 0.0 + u, 0.0 + v); d3d_model_vertex_texture(global.model_floor, w, 0, 0, 1.0 - u, 0.0 + v); d3d_model_vertex_texture(global.model_floor, w, h, 0, 1.0 - u, 1.0 - v); d3d_model_vertex_texture(global.model_floor, 0, h, 0, 0.0 + u, 1.0 - v); d3d_model_primitive_end(global.model_floor); } // tekstura podlogi texid = background_get_texture(texTile);  
    Natomiast obj_floor i Draw Event:
    d3d_model_draw(global.model_floor, x, y, 0, texid);  
    Można też poprawić wygląd łączeń, ale tutaj jest trochę więcej roboty - musiałbyś zeskalować tekstury powiedzmy z 2048 do 2046 na środek i te wolne piksele na krańcach przekopiować z sąsiadujących ze sobą tekstur (tekstura nadal musi mieć 2048px).
  25. Lubię (+1)
    Ice Cube przyznał(a) reputację dla Konrad-GM w FPS zwalnia!   
    Pomysł @gnysek może się sprawdzić, ale zamiast with i place_meeting spróbuj użyć collision_circle w step event obj_pocisk:
    var potwor = collision_circle(x, y, 8, obj_potwor, true, true); if (potwor != noone) { if (z < 24) { with (potwor) { instance_destroy(); } } } Wartość parametru rad = 8 możesz modyfikować wedle uznania, żeby dostosować promień kolizji.
×
×
  • Dodaj nową pozycję...