RaistlinBlackRobe
-
Postów
579 -
Dołączył
-
Ostatnia wizyta
Typ zawartości
Profile
Forum
Wydarzenia
Odpowiedzi opublikowane przez RaistlinBlackRobe
-
-
Taa. Teraz zawody, kto szybciej przeczyta. No tak jakoś wyszło.
-
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:
GMLdraw_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:
GMLdraw_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:
GMLdirection+=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:
GMLdraw_primitive_begin(kind)Przy czym to kind, to rodzaj rysowania, a są one następujące:
GMLpr_pointlist //rusyjemy osobne punktyAby narysować wierzchołek używamy funckji:
GMLdraw_vertex(x,y); //zwykły wierzchołekAby zakończyć rysowanie i tym samym wyświetlić efekt używamy funkcji:
GMLdraw_primitive_end();Na początek stwórzmy sobie nowy skrypt o nazwie draw_figure i dajmy mu kod:
GML/*argument0=xargument1=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=xargument1=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:
GMLimage_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:
GMLmiesiace=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:
GMLdraw_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=xargument1=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:
GMLtexture_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:
GMLtx=background_get_texture(tex);Noi dodaj do drawu obiektu:
GMLdraw_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ć:
GMLfor(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
-
@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
-
Ojojoj nie wiem za co ta ranga xd masz:GMLif 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.
-
DO D**Y Wykastrować tą grę!! 1/5
-
Zostawić, tylko trzeba zresocjalizować rady. xD
-
@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).
-
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)
-
Lol, ale Raistlin cię wkręcił >XD
Czemu? Według mnie wsadzanie kogoś jeśli ktoś się nie chce zgodzić byłoby chamstwem. A tak wogule, to jak chcesz, to możesz mnie wsadzić.
-
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.
Pozdrawiam :]
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.
-
Kryniak. Weź dodaj na poczatku węgiel jeszcze.
-
;]
Chyba wodorem, bo wodór to H, a poza tym Hel jest ustawiony korzystnie pod względem energetycznym, więc się nie łączy.
-
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.
-
Jak na twórcę Crime Life(:lol2:) to się zawiodłem. :mellow: :unsure: :huh: :blink: :boxed: :crying: Kolejne stadium odczuć o grze. xD Zgodnie z kamracizmem: DO D**Y 1/5 xD
-
Mam nadzieję, że liczysz się z tym, że osoby wykorzystane muszą dać ci zgodę(wprawdzić nicki nie są zarejestrowanymi znakami handlowymi, ale jakaś etyka musi panować). No i dlaczego stickmany?
-
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.
-
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).
-
Chodzi mi o to. Jak zrobić, że view jest na środku roomu, i powoli idzie do bohatera, taki efekt?
Z góry dziękuje.
Ustawić speedy inne niż -1?
-
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?
-
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.
-
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. :)
-
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!
-
Kurde na gmclanie narodziła się nowa ideologia. Hmm nazwalbym to Kamracizmem. Chyba też ulegam już temu, a mianowicie:
DO D**Y 1/5
A gatunek tej gry to nie strzelanka, a catch the soldier
-
no a jak zrobić żeby ten global.dmg był odejmowany od Hp?
Jak już to Hp odejmowane od global.dmg.GMLHp-=global.dmg;@down: Mój błąd. Coś dzisiaj myśle za bardzo liniowo.
XenoN Core EnvSys
w Valhalla
Opublikowano
U mnie niestety dalej 12-13 fps.