Skocz do zawartości

SimianVirus7

Użytkownicy
  • Postów

    253
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    24

Ostatnia wygrana SimianVirus7 w dniu 26 Marca

Użytkownicy przyznają SimianVirus7 punkty reputacji!

1 obserwujący

O SimianVirus7

  • Urodziny 15.11.1997

Informacje

  • Użytkownik GameMaker Studio 2
    Tak
  • Użytkownik GameMaker Studio
    Tak
  • Użytkownik GameMaker 8
    Tak
  • Użytkownik GameMaker 7 i wcześniejszych wersji
    Nie
  • Użytkownik Unity
    Nie
  • Użytkownik Godot
    Nie

O mnie

Ostatnie wizyty

8137 wyświetleń profilu

Osiągnięcia 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
×
×
  • Dodaj nową pozycję...