Skocz do zawartości

SimianVirus7

Użytkownicy
  • Postów

    249
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    24

Treść opublikowana przez SimianVirus7

  1. Potrząśnie się słabo i zatrzyma. Generalnie miało to tak wyglądać ale teraz wpadłem na pomysł, że w sumie mogę zrobić X na kursorze i uniemożliwić wyrzucenie.
  2. Tzn ja już kolizję mam zrobioną. W pierwszej fazie lotu jej nie ma, tak aby można było przerzucić granat nad ścianami. Dopiero przy pierwszym odbiciu kolizja jest włączona i wtedy granat może odbić się od solidu. (cień nie zrobiony, nie tykałem tego jeszcze, tylko patrzyłem czy ogólnie działa) Untitled Project.mp4
  3. Tak 😆Dziękuje bardzo, wszystko działa 😆
  4. No witam, a ja znowu z tymi granatami. Zrobiłem lot granatu po zakrzywionej linii, tak jak @Uzjel narysował. Teraz mam zagwozdkę jak zrobić do niego cień. Gdyby to była platformówka, to bym sobie pewnie poradził, ale tu już wchodzi większa matematyka. Kod kiedyś ogarnął mi @Konrad-GM i to jest cała mechanika lotu: CREATE: ghost_x = x; ghost_y = y; target_x = x + lengthdir_x(15+speed, dir) + lengthdir_x(10, dir-90); target_y = y + lengthdir_y(15+speed, dir) + lengthdir_y(10, dir-90); start_distance = point_distance(ghost_x, ghost_y, target_x, target_y); STEP: // poruszamy obiektem w kierunku celu var angle = point_direction(ghost_x, ghost_y, target_x, target_y); var spd = 5; ghost_x += lengthdir_x(spd, angle); ghost_y += lengthdir_y(spd, angle); // liczymy aktualna odleglosc var distance = point_distance(ghost_x, ghost_y, target_x, target_y); var angle90 = angle + 90 * image_yscale; // glowna funkcja przesuniecia var factor = sin((distance / start_distance) * pi); var maxlen = sqr(log2(start_distance)); var offx = lengthdir_x(maxlen * factor, angle90); var offy = lengthdir_y(maxlen * factor, angle90); // dodajemy przesuniecie do realnej pozyci obiektu x = ghost_x + offx; y = ghost_y + offy; Wynik: granade_cien.mp4 Jakieś nakierowania, pomysły? Znam początkową pozycje granatu, miejsce gdzie wyląduje oraz x/y aktualnej pozycji i nie wiem jak to posklejać, żeby cień rysował się mniej więcej tak: Problem mam w tym, że granat może lecieć w 360º a nie tylko na boki, w osi X
  5. Wykrywane były poprzez bbox prostokątny, dlatego czasem strzelając w jedno miejsce, kolizja występowała ale ściana i tak była za daleko, żeby cokolwiek się "oderwało" - już naprawione. Em, co robić? 😆 Są jakieś funkcje do tego, czy tu chodzi o "buffer_create" itp? Checked ✓ oh, stop it you 😆 Dźwięków jeszcze nie dawałem, no i nie wiem jak zrobić, żeby rzucanie granatu było bardziej... fajne. Untitled Project.mp4 (Mam nadzieje, że te posty nie będą brane jako spam)
  6. nie nie nie, nie tak. Tutaj tworzysz spritea o wymiarach pokoju, a ja mówiłem o surface. Hymm... czyli coś takiego, nie pamiętam dokładnie Osobny obiekt dla ścian, np. oWallController Create: surface_wall = surface_create(room_width, room_height); i teraz w bloku ściany, coś takiego: Draw: draw_self(); if(HIT) { surface_set_target(oWallController.surface_wall); //Ustaw surface do edycji draw_sprite(sprite_index, image_index, x, y) //narysuj obiekt który oberwał od pocisku gpu_set_blendmode(bm_subtract) //zmień tryb na wycinanie draw_set_color(c_white) //c_white wycina sprite (u Ciebie to może być c_black, to chyba spowodowane niedawnym przejściem kolorów na rgb w gms) draw_rectangle(damage_x -8, damage_y -8, damage_x +7, damage_y +7, false); //wytnij kawałek bloku gpu_set_blendmode(bm_normal)// ustaw tryb na normalny surface_reset_target(); // wróć na domyślny surface //Odświerz sprite sprite_delete(sprite) sprite = sprite_create_from_surface(oWallController.surface_wall, x, y, 32, 32, false, true, 0, 0) //utwórz nowy sprite z pozycji x/y obiektu trafionego, o wymiarach 32x32 sprite_collision_mask(sprite, 1, 0, 0, 0, 0, 0, bboxkind_precise, 0) //tu bboxkind_rectangle może być w twoim przypadku, tak myślę. sprite_index = sprite; //podmień stary sprite na nowy HIT = false; } Mniej więcej coś takiego, choć może będziesz to nadal musiał dopasować do siebie. Pamiętaj, że jak robisz surface o małych wymiarach np. 32x32 i umieszczasz je w pokoju na współrzędnych x/y, to poruszając się po niej, zaczynasz od x: 0 y: 0 a nie po x/y pokoju.
  7. Ten kod musisz dopasować do swojego, podałem Ci tylko część odpowiedzialną za główną funkcję. Czyli jeszcze gdzieś musisz mieć choćby draw_self() oraz co ważniejsze dopasować tą linijkę sprite = sprite_create_from_surface(oGame.surface_wall, x, y, 32, 32, false, true, 0, 0) //przypisuje nowy sprite z surface Z tego co widzę, kolosalną różnicą jest to, że Ty robisz surface dopasowany do wysokości/szerokości sprite'a i tak dla każdego bloku jest osobny surface. Ja natomiast mam jeden o wielkości room'u, a wszystkie moje bloki ściany odwołują się do tego jednego surface i tylko wycinam odpowiednie fragmenty z których tworzę nowe sprite'y
  8. Swoją destrukcję ścian robię w bardzo podobny sposób i też zauważyłem, że zjada mi to ramu. Na początku się tym nie przejmowałem, bo to 1mb na odświeżenie ale w końcu musiałem to ogarnąć. Po mozolnym klepaniu doszedłem do ładu i robię to w następujący sposób. Create: sprite = sprite_duplicate(sprite_index); //duplikuje przypisany sprite, aby na nim przeprowadzać operacje. Ważne! (dlatego, że nie przypisuje ścieżki do pamięci, tylko tworzę osobny sprite, tak, żeby każdy obiekt miał swój własny, a przy restartowaniu gry, nie pokazuje błędu o nieistniejącym zasobie. Draw: sprite_delete(sprite) //usuwam aktualny sprite z pamięci sprite = sprite_create_from_surface(oGame.surface_wall, x, y, 32, 32, false, true, 0, 0) //przypisuje nowy sprite z surface sprite_collision_mask(sprite, 1, 0, 0, 0, 0, 0, bboxkind_precise, 0) //tworzę do niego maskę sprite_index = sprite; //przypisuje ścieżkę do sprite_index - nie muszę pamiętać, żeby pisać sprite zamiast sprite_index w reszcie kodu. Bardzo długo próbowałem to skrócić, tak, żeby nie musieć tworzyć nowej zmiennej sprite, ale zawsze było jakieś "ale". (zwiększający się stopniowo RAM, są wywołane przez tworzenie pocisków a nie tą sytuacją z surface) Untitled Project.mp4
  9. Dodałem trochę efektów i jak dla mnie spoko. Chociaż z kolizjami nadal jakoś tak nie do końca mi pasuje 😕 DUG5.mp4
  10. Ja pierwszy raz (jak często w gmie...) ruszyłem surface. Próbuje zrobić coś na podobieństwo destrukcji z wormsów. Trzy-cztery dni już to robię ;-; w końcu coś się ruszyło, że w miarę to działa (pierwsze dwa dni spędziłem na tym, że do substract muszę używać c_white, a używałem c_black) Dino_wall_destroy1.mp4
  11. Dokładnie, ale nie pomyślałbym, żeby dać dwa razy lengthdira 😄 kozacki sprite i kozacka animacja idle B) Dziękuje, ale przyznaje się bez bicia, że to nie moje 😆 dino to jakieś darmówki z itcha, a bronie były za 2$
  12. No tak... to po prostu działa, dziękuje 😄 Co prawda będę musiał operować sprite_set_offset() przy np. skalowaniu ale chyba damy radę.
  13. Nie mogę dopasować pocisku do lufy. Dodaje, odejmuje od x/y i wszystko się rozjeżdża. Z tego co rozumiem, to lengthdir_x/y to punkt styku linii x/y. Chyba, że jest jakiś sposób, dzięki któremu mogę ustawić punkt spawnu pocisków relatywnie do położenia i kąta broni. Na razie mam tak: oPistol - STEP dir = point_direction(oPlayer.x, oPlayer.y, mouse_x, mouse_y) x = oPlayer.x-2 + lengthdir_x(10, dir); y = oPlayer.y-20 + lengthdir_y(10, dir); //zmieniaj strony if(digit_between(dir, 90, 270)) image_yscale = -abs(image_yscale); else image_yscale = abs(image_yscale); image_angle = dir; i obliczenia do pocisku lx = x + lengthdir_x(40, dir); ly = y + lengthdir_y(40, dir); //rysuj gdzie powstanie pocisk draw_sprite_ext(sBullet, 0, lx , ly, 1, 1, dir, c_white, 1) //rysuj broń draw_sprite_ext(sprite_index, image_index, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha); Origin broni (chyba ważne do tego): Co daje mi to:
  14. Patrzyłeś lerp()? Czyli coś w stylu aktualne = lerp(aktualne, docelowe, 0.5) //0.5 - siła z jaką ma obracać
  15. Faktycznie pierwszy filmik wyjaśnił nieco zasadę działania, z dalszych mniej rozumiem ale sprawdzałem na szybko. Jak przysiądę w weekend to dam znać co ogarnąłem.
  16. Dzień Dobry, Robiąc prototyp użyłem wbudowanego w gm algorytmu a* i działa świetnie ale chciałbym dodać do gry drogi, które przyspieszają poruszanie się. Wyczytałem, że do tego najlepiej wykorzystać algorytm dijkstry ale nie potrafię nic z tego zrozumieć. Znaczy, zamysł i ogólną mechanikę tak, ale jak już zakodować to średnio. Jestem na samym początku, czyli tworzę grid (16x16) i przypisuje w komórki wartości. Wartości są minusowe, bo ma wybierać drogę o najmniejszej ilości ruchu (punktów). Trawa: -1 Droga: -3 Kamień: 100 Generalnie ma to wyglądać tak, że ma wybierać, czy iść drogą, czy szybciej będzie "na szage" przez trawę, czy może kawałek przez trawę, żeby dojść do drogi i po niej kontynuować do celu. Wiem tyle, że każda kratka ma porównywać punkty z kratką sąsiednią i wybierać najmniejszą wagę. Nie studiowałem, więc takie algorytmy są mi kompletnie obce, a w technikum mieliśmy tylko graf który łączył kilka punktów, a nie cały macierz. (Wiem, że na necie jest kilka poradników, ale też nie bardzo się w nich odnajduje)
  17. To może mieć zmienną np. doJump = false; i zrobić collision_line na te kilka pixeli w dół od gracza i jeśli wykrywa podłoże oraz vspd > 0 to daje doJump = true; a w kodzie zamieścić coś takiego if (PresskeyJump or doJump) && jumps>0 { image_index=0; if jumps>1 vspd = -jspd;else vspd = -jspd*.8; jumps-=1; // doJump = false; }
  18. Nigdy nie grałem w gry typu Visual Novel, nigdy nie miałem zamiaru zagrać w gry typu Visual Novel, bo po prostu mnie nie pociągały, tym bardziej nigdy bym nie pomyślał, że tego typu gra może mnie wciągnąć, a wciągnęła 😮 Serio, nawet dzisiaj w robocie o niej myślałem 😄 Początek był nudny i chciałem już wyłączyć (pewnie przez moje sceptyczne podejście), ale później główna bohaterka zasiadła na tronie i gra dopiero się zaczęła. To może zapiszę w postaci plusów i minusów, tak będzie szybciej i klarowniej. + Charyzmatyczna bohaterka (zdziwiłem się, że po tak krótkim czasie, postać z gry indie, może zyskać sympatie w oczach gracza) + udźwiękowienie, efekty dźwiękowe w dialogach (nie wiem, czy to reguła w grach VN, ale spodobała mi się ta koncepcja) + fabuła (zawsze myślałem, że VN kręci się wokół romansów, a tu proszę, intryga i do tego ciekawa) + postać Erica(?) 😛 +- grafika (nad wyraz prosta ale spójna i ta spójność do mnie przemawia) - mam wrażenie, że interfejs jest trochę surowy - brak trybu pełnoekranowego w wersji Windows (no chyba, że ctrl + caps lock + enter, ale to takie trochę "wymuszone" rozwiązanie 😛) - nie wiedziałem, że można grę zapisać przez większość czasu, później odkryłem, że jest w opcjach, więc może gdzieś ten przycisk dać na widoku. Ogólnie, rewelacja!
  19. SimianVirus7

    Opera GX Game Jam

    Mnie osobiście podobało się "Nettie & Settie Save The Internet", ale tak jak Gnysek mówi, to ma za długie intro. Gdyby to wyrzucić i dać samą rozgrywkę to całkiem całkiem. Mnie generalnie już nie pasowały gry które miały menu, powinny startować od razu w trybie jednego gracza, a drugi powinien mieć możliwość dołączenia w każdej chwili.
  20. Kod na pierwszy rzut oka wygląda dobrze. Dwie sprawy: 1) Prawdopodobnie twój pierwszy dźwięk po prostu ma cisze na końcu i pomimo, że nic nie słychać to on wciąż jest odtwarzany - dlatego słyszysz to opóźnienie. Albo w drugą stronę, twój drugi dźwięk ma cisze na samym początku. Możesz swój plik dźwiękowy wrzucić w darmowy program Audacity i zobaczyć długość utworu i jaka jest jego "budowa". 2) Z tego co pamiętam game maker nie potrafi odtwarzać dwóch dźwięków mp3 na raz. Jedynie w formacie ogg i wav jest taka możliwość. Aczkolwiek to nie powinno być problemem akurat w tej konkretnej sytuacji, napisałem to tak żebyś wiedział na przyszłość. Ps: = przypisuje wartość do zmiennej == porównuje wartości (stosowane w if'ach) Wiem, że tak czy siak będzie działać ale fajnie wyuczyć się dobrego nawyku
  21. Zależnie od sytuacji, rozwiązań jest kilka. Ja np. do odtwarzania muzyki w tle wykorzystywałem kolejki. // ------------ CREATE ------------ // sounds = ds_queue_create(); //Stwórz kolejke z utworami mediaplayer = noone; //Stwórz odtwarzacz tej kolejki ds_queue_enqueue(sounds, Sound1, Sound2); //Przypisz dźwięki do kolejki // ------------ STEP ------------ // //jeśli mediaplayer nie odtwarza muzyki oraz kolejka posiada elementów więcej niż zero if(!audio_is_playing(mediaplayer) and ds_queue_size(sounds)>0) { //przypisz mediaplayer dźwięk i jednocześnie usuń go z kolejki mediaplayer = ds_queue_dequeue(sounds); //odtwórz przypisany dźwięk audio_play_sound(mediaplayer, true, false); } // (Opcjonalnie) // jeśli kolejka odegra wszystkie przypisane dźwięki, przypisz jej nowe if(ds_queue_size(sounds) == 0) { ds_queue_enqueue(sounds, Sound3, Sound4); //Przypisz dźwięki do kolejki } // ------------ DESTROY ------------ // //Zwolnij pamięć gdy obiekt zostanie zniszczony ds_queue_destroy(sounds);
  22. SimianVirus7

    Opera GX Game Jam

    Zaskakujące jak niektórzy są kreatywni. Tyle gier, jeden temat, a tyle możliwości.
  23. Porozrzucałem wszędzie te granaty, kombinowałem z nimi, wrzucałem je tam gdzie ten błąd mi wcześniej wystąpił i... no i git, nic się złego nie dzieje (tzn. ludzie umierają od wybuchu, a tak to wszystko w porządku). Czy można jakoś restartować grę oprócz alt+f4? strasznie to uciążliwe jest
  24. Gtx 970, i7-8600 (z ciekawych rzeczy to mam dx12 ready ale żadna gra z dx12 mi nie odpala)
  25. Zrobiłem dzisiaj swój pierwszy system cząsteczek (tak wiem, tyle lat w gm'ie a ja dopiero cząsteczki tknąłem :P). Mam pytanie. Przy pewnej zmiennej cząsteczki mają zmienić swój kierunek lotu. Czy można już istniejącym cząsteczkom cokolwiek modyfikować? Z tego co czytałem, to nie. Na razie pasuje mi rozwiązanie typu part_particles_clear(pSystem) i zastąpienie ich nowymi ale cząsteczki znikają momentalnie, a chciałbym, żeby alpha najpierw zleciała do zera, coś jakby funkcja miała nazywać się part_particles_clear_with_alpha(pSystem) Ktoś ma na to radę?
×
×
  • Dodaj nową pozycję...