Skocz do zawartości

RaistlinBlackRobe

Użytkownicy
  • Postów

    579
  • Dołączył

  • Ostatnia wizyta

Odpowiedzi opublikowane przez RaistlinBlackRobe

  1. Oto kurs tłumaczączy funkcje lengthdir_x i lengthdir_y oraz pokazujący jak można używać rysowania primitiveów.

    A więc na początek stwórzmy sobie jakiś obiekt. Ja nazwałem go obj_shape. W jego drawie wklejmy taki kod:

    GML
    draw_line_color(190,80,190,140,c_yellow,c_orange);

    draw_line_color(190,110,550,110,c_yellow,c_orange);

    for(i=0;i<360;i+=1)

    {

    draw_point_color(190+i,110-cos(degtorad(i))*30,c_green);

    draw_point_color(190+i,110-sin(degtorad(i))*30,c_red);

    };

    Włącz grę i obserwuj przepiękny widok. Widzimy Kartezjański układ współrzędnych, a na nim dwie takie falowate linie. Tytułem wyjaśnień są to wykresy dwóch funkcji trygonometrycznych: sinusa(czerwony) i cosinusa(zielony). Przejdźmy do analizy kodu. pierwsze dwie linijki rysują układ współrzędnych. Następnie mamy pętlę for(od 0 do 360, co 1), a w niej:

    190+i oznacza, że rysujemy punkt o x 190(która jest wartością przykładową, w której cały układ umieściłem)+i, czyli wartość postępu pętli(można by to tak ująć). 110-cos(degtorad(i))*30 sprawia już więcej problemu do zrozumienia. 110 to przykładowe y, na którym umieściłem układ. Hmm, dlaczego pętla for kończy się na 360? Zapala się lampka i już wiesz, że 360 stopni to kąt pełny. A więc stopnie. Funkcja cos przyjmuje argument, który jest kątem podanym w radianach(przedstawienie kąta w postaci ilości T\, przy czym T\=180 stopni), więc, aby zamienić stopnie na radiany używamy funkcji degtorad. No dobrze, teraz dlaczego minus? Dlatego, że w Kartezjańskim układzie współrzędnych y rośnie w góręm, a w GMie w dół(zastosowałem - tylko dla efektu wizualnego). No i na koniec *30 jest dlatego, że cosinus zwraca wartość od 1 do -1, więc trzeba dla czytelności trzeba tą wartość powiększyć(30 to przykładowa wartość). Z następną linijką jest dokładnie tak samo, tylko, że używamy funkcji sin.

    Osoby spostrzegawcze powinny zauważyć, że wartość cosinusa przy danym kącie pomnożona przez jakąś wartość dystansu i dodana do danego x oraz wartość sinusa przy tym samym kącie pomnożona przez tą samą wartość dystansu i dodana do danego y daje współrzędne punktu położonego w danej odległości i pod danym kątem od danego x i y

    Dla dodatkowego wyjaśnienia tej sprawy doklejmy kod:

    GML
    draw_text_color(500,43,'cos(degtorad(x))=y',c_green,c_green,c_green,c_green,1);

    draw_text_color(500,59,'sin(degtorad(x))=y',c_red,c_red,c_red,c_red,1);

    draw_text(170,64,'y=to co funkcja zwraca');

    draw_text(530,120,'x=podany kat');

    draw_text(190,150,'cos(degtorad(x))*dist=lengthdir_x(dist,x)');

    draw_text(190,166,'sin(degtorad(x))*dist=lengthdir_y(dist,x)');

    I uruchommy grę.

    No i tu pojawiają się lengthdir_x i lengthdir_y, które jak widać są uproszczeniem stworzonym przez GMa. Zobrazujemy to rysując obracającą się linię. Dodajmy kod:

    GML
    direction+=1;

    draw_line_color(500,300,500+lengthdir_x(80,direction),300+lengthdir_y(80,direction),c_navy,c_maroon);

    Punkt 1 to ten od którego wychodzi kolor niebieski, a punkt 2(do którego dodaliśmy wartość lengthdirów) to ten z którego wychodzi kolor czerowny.

    No cóż, skoro przez to przebrnęliśmy, to zapraszam do następnej części kursu.

    Aby rozpocząć rysowanie prymitywów musimy użyć funkcji:

    GML
    draw_primitive_begin(kind)

    Przy czym to kind, to rodzaj rysowania, a są one następujące:

    GML
    pr_pointlist //rusyjemy osobne punkty

    pr_linelist //rysujemy linie, stworzone z każdych kolejnych dwóch wierzchołków, więc ich liczba musi być wielokrotnością dwójki

    pr_linestrip //rysujemy linię, przy czym każdy nastepny wierzchołek jest połączony ze swoim poprzednikiem

    pr_trianglelist //rysujemy trójkąty, stworzone z każdych następnych trzech wierzchołków, więc ich liczba musi być wielokrotnością trojki

    pr_trianglestrip //rysujemy trójkąty połączone ze sobą, przy czym każdy następny wierzchołek tworzy trójkąt z dwoma poprzednikami

    pr_trianglefan //rysujemy trójkąty, przy czym każde kolejne dwa wierzchołki łączą się z pierwszym narysowanym

    Aby narysować wierzchołek używamy funckji:

    GML
    draw_vertex(x,y); //zwykły wierzchołek

    draw_vertex_color(x,y,kolor,przezroczystość); //i kolorowy wierzchołek;)

    Aby zakończyć rysowanie i tym samym wyświetlić efekt używamy funkcji:

    GML
    draw_primitive_end();

    Na początek stwórzmy sobie nowy skrypt o nazwie draw_figure i dajmy mu kod:

    GML
    /*argument0=x

    argument1=y

    argument2=promien

    argument3=liczba wierzcholkow

    argument4=rotacja

    argument5=color1

    argument6=color2

    argument7=alpha*/

    draw_primitive_begin(pr_trianglefan);

    draw_vertex_color(argument0,argument1,argument5,argument7);

    for(i=0;i<argument3;i+=1)

    {

    draw_vertex_color(argument0+lengthdir_x(argument2,argument4+i*360/argument3),argument1+lengthdir_y(argument2,argument4+i*360/argument3),argument6,argument7); draw_vertex_color(argument0+lengthdir_x(argument2,argument4+(i+1)*360/argument3),argument1+lengthdir_y(argument2,argument4++(i+1)*360/argument3),argument6,argument7);

    };

    draw_primitive_end();

    Ta funkcja rysuje dowolny wielokąt foremny. Już tłumaczę. Rysujemy trianglefana, więc najpierw dajemy wierzchołek bazowy, a potem za pomocą pętli for rysujemy kolejne zestawy dwóch wierzchołków o podanym promieniu i kącie będącym iloczynem kąta rozchyłu pomiędzy kolejnymi wierzchołkami figury i postępu pętli(i). W przypadku drugiego wierzchołka wybieamy w przód apropo postępu pętli(wyrażenie i+1). Noi mamy wymarzony wielokąt foremny, którym możemy obracać, jest gradientowy i możemy mu nadać przezroczystość. Przejdźmy teraz do czegoś trudniejszego. Spróbujemy narysować gwiazdę!

    Hehe. tak, mam dla was gotowca, ale nie ominie was analiza. xD

    Gwiazda jest figurą, która bazuje się na wierzchołkach wielokąta foremnego. Połączenia każdego kolejnego wierchołka jest z dwoma najbliższymi wierzcholkami na boki od kąta przeciwnego w odległości względem środka wielokąta.

    Załóżmy sobie skrypt o nazwie draw_star i dajmy mu kod:

    GML
    /*argument0=x

    argument1=y

    argument2=promien

    argument3=liczba wierzcholkow

    argument4=rotacja

    argument5=color1

    argument6=color2

    argument7=alpha*/

    var parzyste;

    if argument3/2=argument3 div 2 then parzyste=1 else parzyste=0.5;

    draw_primitive_begin(pr_trianglefan);

    draw_vertex_color(argument0,argument1,argument5,argument7);

    for(i=0;i<argument3;i+=1)

    { draw_vertex_color(argument0+lengthdir_x(argument2,argument4+i*360/argument3+180+(360/argument3)/parzyste),argument1+lengthdir_y(argument2,argument4+i*360/argument3+180+(360/argument3)/parzyste),argument6,argument7);

    draw_vertex_color(argument0+lengthdir_x(argument2,argument4+i*360/argument3+180-(360/argument3)/parzyste),argument1+lengthdir_y(argument2,argument4+i*360/argument3+180-(360/argument3)/parzyste),argument6,argument7);

    };

    draw_primitive_end();

    Niestety zaobserwowałem niekomfortowe zjawisko. Kiedy na wierzchołkach z definicji rysujemy trójkąty, to gwiazdy są poprzycinane. Na szczęście problem został załatwiony poprzez przeniesienie pierwszego wierzchołka do środka okręgu, a skoro tak to mamy wspólny punkt więc trianglefan i zaczynamy. Jeden vertex w środku, a potem pętla for. Zauważamy skomplikowane obliczenia uzyskujące kąt. +180 oznacza kąt przeciwny, a (360/argument3)/parzyste) pozwala obliczyć rozrzut kąta. Zmienna parzyste ma wartość 1, gdy liczba wierzchołków jest parzysta, a gdy nieparzysta to 0.5. No to powróćmy do naszego obiektu i dodajmuy mu w drawie:

    GML
    image_angle+=1;

    draw_figure(70,50,30,7,image_angle,c_white,c_blue,0.8);

    draw_star(70,130,50,8,image_angle,c_blue,c_aqua,0.7);

    Tadam!

    Dam wam jeszcze jeden przykład na zastosowanie primitive.

    W create obiektu dodajmy:

    GML
    miesiace=12;

    zarobki[1]=200;

    zarobki[2]=430;

    zarobki[3]=140;

    zarobki[4]=700;

    zarobki[5]=340;

    zarobki[6]=620;

    zarobki[7]=243;

    zarobki[8]=650;

    zarobki[9]=1000;

    zarobki[10]=820;

    zarobki[11]=110;

    zarobki[12]=60;

    odstep=30;

    skala=5;

    Zdradzę wam, że namalujemy wykres niestałych zarobków.

    Miesiące to ilość miesięcy, z których chcemy porównywać swoje zarobki. Tablica zarobki określa ile zarobiliśmy, w kolejnych miesiącach. odstep to odstęp w pixelach pomiędzy kolejnymi miesiącami. skala za to to wartość, przez którą będziemy dzielić, aby wysokość wykresu nie była zbyt wielka(no bo inaczej to 1000 złotych=1000 pixeli, a tako tylko 200).

    No dobra. Teraz do drawu dodajmy to:

    GML
    draw_line(20,200,20,400);

    draw_line(20,400,20+miesiace*odstep,400);

    draw_primitive_begin(pr_linestrip)

    draw_vertex(20,400)

    for(i=1;i<=miesiace;i+=1)

    {

    draw_vertex(20+i*odstep,400-zarobki/skala)

    };

    draw_primitive_end();

    I oto naszym oczom ukazuje się wykres zarobków. Widać, że najwięcej zarobiłeś we wrześniu(xD).

    Wiem, że pojawią się pytania o texturowanie, więc uprzedzę was. Załóżmy sobie skrypcik draw_figure_texture i dajmy ten kod:

    GML
    *argument0=x

    argument1=y

    argument2=promien

    argument3=liczba wierzcholkow

    argument4=rotacja

    argument5=color1

    argument6=color2

    argument7=alpha

    argument8=textura*/

    var txx,txy;

    txx=texture_get_width(argument8);

    txy=texture_get_height(argument8);

    texture_set_interpolation(true);

    texture_set_repeat(true);

    draw_primitive_begin_texture(pr_trianglefan,argument8);

    draw_vertex_texture_color(argument0,argument1,txx,txy,argument5,argument7);

    for(i=0;i<argument3;i+=1)

    {

    draw_vertex_texture_color(argument0+lengthdir_x(argument2,argument4+i*360/argument3),argument1+lengthdir_y(argument2,argument4+i*360/argument3),txx*lengthdir_x(argument2,argument4+i*360/argument3),txy*lengthdir_y(argument2,argument4+i*360/argument3),argument6,argument7);

    draw_vertex_texture_color(argument0+lengthdir_x(argument2,argument4+(i+1)*360/argument3),argument1+lengthdir_y(argument2,argument4++(i+1)*360/argument3),txx*lengthdir_x(argument2,argument4+(i+1)*360/argument3),txy*lengthdir_y(argument2,argument4++(i+1)*360/argument3),argument6,argument7);

    };

    draw_primitive_end();

    Widzimy dwie nowe zmienne txx i txy, które mają wartość zwróconą przez dwie funkcje. Przy dobrych wymiarach textury powinne one zwracać wartość 1. Następnie widzimy funckje:

    GML
    texture_set_interpolation(true);

    texture_set_repeat(true);

    Dzięki temu texturowanie działa(pierwsze odpowiada za nie pobieranie tylko pierwszego pixela textury, a drugie za hmm nakładanie textury).

    Widzimy, że funkcja rozpoczynający prymityw dostała na końcu _texture i dostała argument, którym notabene jest textura. Funkcje rysowania vertexów też się zmieniły. Przed kolorem i przezroczystością są dwa argumenty, które przymą wartość:

    -pierwszy(czyli xtex): txx*rzeczy_dodane_do_do_wpsolrzednej_x

    -drugi(czyli ytex): txy*rzeczy_dodane_do_do_wpsolrzednej_y

    Kończymy rysowanie normalnie draw_primitive_end().

    Teraz dodaj sobie jakiś background i nazwij go tex, a następnie dodaj do create obiektu:

    GML
    tx=background_get_texture(tex);

    Noi dodaj do drawu obiektu:

    GML
    draw_figure_texture(500,420,35,9,image_angle,c_yellow,c_white,0.6,tx);

    Ćwiczenia i pytania:

    1.Przerób funkcję draw_figure tak, aby była trójkolorowa(zamiast dwu)

    2.Funkcji draw_star zmień kind rysowania na pr_linestrip i przenieś pierwszy vertex do śrdoka pętli for. Zaobserwuj zmiany.

    3.Przepuść rysowanie sinusoidy i cosinusoidy(wykresów funkcji cos i sin) dalej niż do 360 stopni. Zaobserwuj zależność wobec wartości 360 stopni.

    4.Stwórz skrypt rysowania lini(krzywej) łączącej wszystkie instancje w roomie. podpowiadam, że należy użyć:

    GML
    for(i=0;i<instance_count;i+=1)

     

    Oczywiście załączam przykład

    :) Wyraźcie swą opinię o tym.

    EDIT: A właśnie. Zapomniałem napisać, że nie wiem dlaczego, ale pentagram nie wychodzi. xD

  2. @Marmot itd.: No przecież już sprostowałem, że to po prostu byłoby chamstwem, jeśli ktoś ewidentnie nie chce być. Jak narazie prawie wszycy(xD oprócz Yody) się zgodzili, więc nie rozumiem w czym problem.

     

    A tak wogule to np. moge być jakimś mentalistą, że np. mogę przez tcp/ip połączyć się umysłem z kompem i pisać na nim to co myślę albo sterować postacią w gierkach. xD

  3. Ojojoj nie wiem za co ta ranga xd masz:

    GML
    if keyboard_check(vk_control)

    {

    if (image_index=spr_up)

    {instance_create(x,y-32,obj_strzal.direction=90)} // od "y" naszego hero trzeba odjac troche pozycje...

    if (image_index=spr_down)

    {instance_create(x,y+32,obj_strzal.direction=270)}

    if (image_index=spr_left)

    {instance_create(x-32,y,obj_strzal.direction=180)}

    if (image_index=spr_right)

    {instance_create(x+32,y,obj_strzal.direction=0)}

    }

    I w obj_strzal nie dodawaj y czy x tylko speed!

    Jak coś będzie źle, to proszę o poprawkę!

    O jezus! Po pierwsze image_index to zmienna określająca klatkę animacji i przyjmuje wartość liczbową. Po drugie nie możesz dać obj_strzal.direction=90 jako argument dla instance create, bo to jest bez sensu. Po trzecie hudy przecież dał kod, który mu kiedyś podałem i on działa dobrze. A apropo rangi, to on ma ją za spam.

  4. @Yoda:

    Tak, chcesz żeby odepchnąć ludzi od strony. Przez to, GMCLAN stanie się mało popularnym serwisem, nikt tu nie będzie wchodzić i będzie tylko towarzystwo wzajemnej adoracji, które będzie sobie pisać posty na wszelakie tematy, tylko nie o GM...

    Aż w końcu będzie tu jak w więziennych prysznicach. Najgorszy koszmar, to to, że ci mydło upadnie(metafora taka sarkastyczna).

  5. Raczej nie dużo czasu by to zajęło. Kilka zmiennych, timerów, jakaś formatka, troche grafiki, obsługa klawiszy noi operacje na left i top. Ja, chociaż niewiele pamiętam już z VB(uczyłem się go mając 9-10 lat), to po zerknięciu do jakiejś dokumentacji też bym to zrobił. Dam te 2/5, niech masz.

    (oo coś dzisiaj łagodnie oceniam)

  6. Witam! Chciałem pokazać Wam (oddać do ocenki) wstępny system środowiska 2d, jaki oferuje fizyka punktowa XenoN Core. Do ukończenia systemu pozostała zmiana grafiki natury (copoconaco ją wykonuje, z czego jestem baaardzo zadowolony :D ) oraz poprawienie sił kowalencyjnych, bo po dłuższej pracy robią się widoczne małe artefakty. System po tej przeróbce zostanie wykorzystany w grze Sythia (autorstwa PablooGM). Chciałbym dodać, że gra ta będzie w większości korzystała z modułów XenoN Core, ja zaś będę sprawował pieczę nad ich odpowiednim wykorzystaniem, co za tym idzie, gra będzie wykonana na wysokim poziomie.

     

    EnvSys

     

    Pozdrawiam :]

    logo_mini.png

    No cóż. FPS wychodzi mi 14, co raczej nie zachwyca. Poza tym często ruch natury jest zbyt gwałtowny(np czasami wygląda to jakby ktoś spadł na drzewo i złamał gałąź, która samoczynnie się podnosi).

    Ale wygląda ładnie.

  7. Według mnie pomysł może być, ale nowo dodana gra nie może być potencjalnie shitem. Tj. w dobrych grach są gry wyróżnione(znacznie ponadprzeciętne), ale to nie oznacza, że w zwykłym dziale są same shity. Tak wogule, to dodałbym do tego kastrację gier o kulkach.

  8. Witam. Potrzebuję kilka grafik do interfaceu mojego projektu.

    Tło interfaceu 1024*160 Klimaty typowo z cesarstwa rzymskiego, daję dowolność, chętnie przyjmę każdą inwencję. Kolorystyka najlepiej jasna, akcenty srebrne.

    Stosik Monet około 32*64 Niezbyt nowoczesne. Ogółem chodzi o to, że pod tym będzie napis oznajmiający graczowi ile ma funduszy. Kolorystyka żółta/złota/miedziana.

    Kursor z 32*32, ale może być inaczej. Najlepiej jakaś rękawica, bo miecz nie może być, żeby nie myliło(gra akcji xD). Kolorystyka najlepiej jakaś ciemniejsza(kombinacje z czernią) albo biel z jasnym szarym(żeby blendować można było).

    Z góry dzięki.

  9. Object fallowing :/

     

    Room properties / Object fallowing ...

     

    Zobacz to: klik

    Lol. Co to jest? Nie dość, że jak dojdzie do hera to zaczyna skakać, to jeszcze przecież wystarczy ustalić speed przewijania czyli hspd i vspd w zakładce view. Zamiast -1 szybkość w px/f pozioma(h) i pionowa(v).

  10. Głupie to. Zachowanie karygodne, bo co innego nie dać, a co innego zrobić komuś nadzieję i zabawić się czyimś kosztem. Jeszcze w rodzinie...

    @murda: Na świecie już równość i wolność, a jednak ten pogląd się utrzymał. Dlaczego? A jak wyjaśnisz to, że sporo religii Afrykańskiej rasy negroidalnej obiecuje niebo za stosunek z dziećmi?

  11. Nie ma to jak świetny poradnik. Po co C++, jak zamierzasz robić w .NETowym IDE? To już lepiej C# brać, który jest lepszym i nowocześniejszym językiem (a jak musi być kompilowany natywnie jak c++, to lepszym wyborem jest D). Poza tym, nie rozumiem o co ci chodzi z tą obsługą serwerów. Wiesz co to jest .NET a co to jest SDL chociaż? Poza tym, po co kupować Visuala, skoro jego darmowa wersja pozwala na stworzenie programu?

    DotNet czym jest wiem, a z sdl mi się coś popipcyło. O właśnie w wizardzie znalazłem coś. Może ATL? Poza tym wersje express m$vs chyba nie obejmują dotnet. A C++, bo według mnie ma fajną składnię. A tak wogule to who cares? Przecież to była satyra(już szykowałem odpowiedź, gdyby się zapytał, a czy coś łatwiejszego od c++, hehe asembler :twisted: ). Na mmorpg nie ma przepisu.

  12. Jeeeezu no co w tym niesmacznego. Normalnie baba przerobiona na chłopa, albo chłop na babę. Łatwo takich ludzi poznać, bo głos im zostaje, więc jak zobaczysz panienke, która mówi basem, to najprawdopodobniej transwestyta. :)

  13. Na historii pani mówi do gościa, który jest zagrożony:

    -Jak ja ci mam chłopie wystawić dwóję?

    A moejmu koledze się wyrmało:

    -Chłopie Pańszczyźniany

    Fajny rofl był na lekcji.

    Albo dzisiaj jeden cymbal poszedł do tablicy i nie wiedział co to samogłoska(serio), a jedna dziewczyna na caly głos ryknęła:

    -Nie rżnij głupa!

×
×
  • Dodaj nową pozycję...