Skocz do zawartości

SimianVirus7

Użytkownicy
  • Postów

    253
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    24

Treść opublikowana przez SimianVirus7

  1. Wróciłem do robienia dinozaura z bronią po dłuższej przerwie. Chciałem najpierw zrobić krótkie zestawienie co od tamtej pory zakodowałem, ale dzisiaj zrobiłem możliwość podpalenia dosłownie każdego obiektu w grze i jestem na tyle zadowolony, że się pochwalę (tak, wiem o dropie fpsów) DUG_iseeworlonfire.mp4
  2. tak tak, problem mam z tym, że ja w funkcji nie wiem jaka jest nazwa tej zmiennej w instancji. Niektóre mają sndPlayer a inne inaczej, dlatego chciałbym przesyłać odwołanie do zmiennej. Odwołanie, a nie przypisanie, bo chciałby też wiedzieć kiedy ta zmienna jest wykorzystywana (audio_is_playing). No nie potrafię tłumaczyć albo za dużo wymyślam
  3. O! Bardzo prawdopodobnie, że tego właśnie szukałem. Robiłem też return sound_player zamiast true, ale to nic nie dało. Na razie zrobiłem to po normalnemu, czyli tak jak Gnysek napisał, ale chciałem to sobie zrobić bardziej elastycznie. Prościej mówiąc, chcę uniknąć pisania za każdym razem if(!audio_is_playing(sndPlayer)) a dodatkowo kiedyś też miałem problem właśnie z tym przesyłaniem zmiennych, gdzie zmienna w funkcji i instancji miała być tą samą.
  4. Nie wiem jak o to zapytać w googlach po angielsku, więc zapytam na gmclanie po polsku. Jak przesłać odwołanie do adresu zmiennej w pamięci a nie przypisanej wartości do funkcji. np. mam w obiekcie create: sndPlayer = 1; //to ma robić coś w deseń Sound Instance ID step: play_sound(sndSound1, 1, 1, sndPlayer); a w funkcji: function play_sound(snd, gain = 1, pitch = 1, sound_player = -1) { if(sound_player != -1) if(!audio_is_playing(sound_player)) {sound_player = audio_play_sound(snd, 1, false, gain,0, pitch); return true;} } No to i tak odtwarza dźwięk co klatkę, zamiast czekać aż się zakończy, bo pewnie przesyła wartość zmiennej czyli 1. Jak zrobię na sztywno, czyli tak: function play_sound(snd, gain = 1, pitch = 1) { if(!audio_is_playing(sndPlayer)) {sndPlayer = audio_play_sound(snd, 1, false, gain,0, pitch); return true;} } No to działa elegancko. Chyba, że gmlu czegoś takiego nie ma, bo z tego co kojarzę to jakieś pointery to w c++ są Nie chce robić zmiennych globalnych, bo wiele obiektów ma zmienną sndPlayer. Szukam czegoś w stylu get_variable_address(sndPlayer)
  5. draw_set_halign(fa_left) // wypisuje od lewej, nie będzie rozjeżdżania ewentualnie var _offset = string_width(Global.local_question)/2 //pobierz szerokość wypisanego tekstu draw_set_halign(fa_center) draw_text(x + _offset, y, Global.local_question);
  6. 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.
  7. 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
  8. 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
  9. 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)
  10. 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.
  11. 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
  12. 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
  13. Dodałem trochę efektów i jak dla mnie spoko. Chociaż z kolizjami nadal jakoś tak nie do końca mi pasuje ? DUG5.mp4
  14. 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
  15. 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$
  16. 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ę.
  17. 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:
  18. Patrzyłeś lerp()? Czyli coś w stylu aktualne = lerp(aktualne, docelowe, 0.5) //0.5 - siła z jaką ma obracać
  19. 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.
  20. 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)
  21. 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; }
  22. 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!
  23. 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.
  24. 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
×
×
  • Dodaj nową pozycję...