-
Postów
214 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
1
Typ zawartości
Profile
Forum
Wydarzenia
Treść opublikowana przez -[PhariseuS]-
-
Utrzymywanie odległości image_angle w stepie
-[PhariseuS]- odpowiedział(a) na odex temat w Pytania początkujących
No więc od początku. Nie ma sensu, byś coś powielał bez zrozumienia. GML //jezeli jest tylko jeden pocisk, to nie tworzy zadnego kata. jego odleglosc //wynosi wiec 0, tak samo jak suma. if global.iloscpociskow==1 { odleglosc_katowa=0; suma_katow=0; } else //ale jezeli jest wiecej niz 1 pocisk { odleglosc_katowa=10; //pociski co 10 stopni, niech bedzie suma_katow=odleglosc_katowa*(global.iloscpociskow-1); //mając tylko jeden pocisk, suma wynosi 0. mając dwa - 15, itp. } for (ktorypocisk=0; ktorypocisk<global.iloscpociskow; ktorypocisk++) //ktorypocisk++ to to samo co ktorypocisk+=1 //najlatwiej zapamietac tak: zmienna ktorypocisk bedzie wzrastala o 1 //w kazdej iteracji, czyli wykonaniu petli. w pierwszej iteracji wynosi ona //0. gdy warunek ktorypocisk<global.iloscpociskow w koncu nie zostanie //spelniony, gdyz zmienna ktorypocisk bedzie wieksza niz iloscpociskow. //Latwo wiec wywnioskowac, ze petla wykona sie cztery razy - i wartosc //zmiennej ktorypocisk bedzie wynosila kolejno 0, 1, 2, i 3 - dla czterech //pociskow, az sie zatrzyma. { //delta to przesuniecie katowe wzgledem lini strzalu - czyli relatywna //wartosc, jakiej obj_laser bedzie sie trzymal obliczajac nowy kat. //tak wiec jezeli jest tylko jeden pocisk, tak jak poprzednio - jest //przesuniety o 0. if global.iloscpociskow==1 delta=0; else //jednakze jezeli pociskow jest wiecej, dajmy na to 4 //to delta, czyli indywidualne przesuniecie kazdego pocisku, //obliczane jest nastepujaco: delta = -(suma_katow/2)+(ktorypocisk*odleglosc_katowa); /* Najpierw brana pod uwage jest suma katow. Dla 4 pociskow wynosi ona global.iloscpociskow-1, czyli 3*15°=45°. Kazdy pocisk zaczyna z delta wynoszaca polowe sumy katow - tak, aby srodek tego kata znalazl sie na linii strzalu. stad -(suma_katow/2) - minus stad, ze od kata lini strzalu (zaraz sie dowiesz, jak go obliczac) odejmujemy polowe sumy. W naszym przypadku jest to 45°/2=-22.5°. Nastepnie dodajemy (ktorypocisk*odleglosc_katowa) - czyli lecimy w druga strone, w strone lini strzalu. Pamietaj, ze zmienna ktorypocisk wzrasta za kazdym rozpatrywanym przypadkiem. Dla pierwszego (a wlasciwie zerowego) lasera jest to (0*15), czyli 0. Dla drugiego(1*15), dla trzeciego 30°, a dla czwartego 45°. I teraz wiedzac, ze "rysowanie" katow tworzonych przez lasery zaczynamy od -22.5°, dodajac kolejno wzrastajace wielokrot- nosci liczby 15, lasery ladnie i rowno sie ukladaja w, kolejno: -22.5°,-22.5°+15°=-7.5°,-22.5°+30°=7.5°,-22.5°+45=22.5° */ kat_pocisku=direction+delta; //i teraz ostateczny kat pocisku to kat tworzony przez linie strzalu //PLUS delta. Gdyz dodajac liczby ujemne, jak wiadomo, odejmu- //jemy. Gdybysmy delte zrobili dodatnia, teraz bysmy ja odejmowali, //zamiast dodawac. //mam nadzieje ze tutaj wszystko jasne. Wiesz, jak sie uzywa tablic? //jesli nie, poczytaj w dokumentacji o arrays. Generalnie prosta //sprawa. Tablica to zmienne tego samego typu i tej samej nazwy - //a kazda ma unikalny indeks. W tym wypadku wzrastajaca za kazda //iteracja zmienna ktorypocisk sluzy za indeks tablicy - chociaz //jezeli nie odwolujesz sie do konkretnych pociskow z poziomu //obiektu gracza, rownie dobrze moglibysmy napisac //pocisk=instance_create(... //pocisk.direction=kat_po... //itp. W kazdej iteracji zmienna pocisk bylaby nadpisywana wartoscia //nowoutworzonego lasera. Tak czy siak. //Tutaj mysle ze prosta sprawa - nadajemy laserom odpowiednie //wartosci. Kazdy laser "wie", o ile katow powinien byc przesuniety //wzgledem linii strzalu, dzieki zmiennej delta, indywidualnej //dla kazdej iteracji. pocisk[ktorypocisk]=instance_create(x,y,aktualnabron); pocisk[ktorypocisk].direction=kat_pocisku; pocisk[ktorypocisk].image_angle=kat_pocisku; pocisk[ktorypocisk].delta=delta; canshoot = 0; alarm[0] = global.szybkoscstrzalu; } I teraz w obiekcie obj_laser, w Step Event, następujący kod (zakładając że obiekt gracza nazywa się obj_character): GML x=obj_character.x; y=obj_character.y; //no to chyba wiadome image_angle=point_direction(obj_character.x,obj_character.y,mouse_x,mouse_y)+delta; //okej. funkcja point_direction jest bardzo uzyteczna, tak samo jak jej brat - point_distance, //i odwrotnosci - lengthdir_x i lengthdir_y - poczytaj koniecznie. //funkcja ta, na podstawie par wspolrzednych, wyznacza kierunek linii przecinajacy oba //punkty. Czyli de facto oblicza kat od gracza do celownika, ktory nastepnie, po dodaniu //indywidualnej delty lasera, przyznawany jest laserowi jako kat, pod ktorym powinien //sie ustawic - jego nowy image_angle. point_direction zwraca ilosc stopni. Jezeli walisz //laserem centralnie w prawo, jest to 0. W gore - 90, w lewo - 180, w dol - 270, itp. //Ale to pewnie wiesz.</span> Mam nadzieję że teraz wszystko jasne -
Utrzymywanie odległości image_angle w stepie
-[PhariseuS]- odpowiedział(a) na odex temat w Pytania początkujących
W drugiej części kodu dokonałbym paru poprawek. Przede wszystkim, skorzystaj z pętli for i tablicy pocisk, zamiast 4 różnych zmiennych. Dzięki temu niezależnie od ilości pocisków, zawsze wystrzeliwane są w równej odległości od siebie i środka linii strzału. Nie kminię trochę, czemu pocisk laserowy ma jednocześnie zmieniane wartości direction i image_angle. W końcu jest stacjonarny względem gracza, tzn nie ma fizycznej prędkości, więc jego kierunek nie ma znaczenia. Ale ok. Inne rodzaje broni mają prędkość, a tworzone są jednym kodem, więc niech zostanie. Wywal wszystko po pętli switch, a zamiast tego proponuję GML if global.iloscpociskow==1 { odleglosc_katowa=0; suma_katow=0; } else { odleglosc_katowa=15; //pociski co 15 stopni suma_katow=odleglosc_katowa*(global.iloscpociskow-1); //mając tylko jeden pocisk, suma wynosi 0. mając dwa - 15, itp. } for (ktorypocisk=0; ktorypocisk<global.iloscpociskow; ktorypocisk++) { if global.iloscpociskow==1 delta=0; else delta = -(suma_katow/2)+(ktorypocisk*odleglosc_katowa); kat_pocisku=direction+delta; pocisk[ktorypocisk]=instance_create(x,y,aktualnabron); pocisk[ktorypocisk].direction=kat_pocisku; pocisk[ktorypocisk].image_angle=kat_pocisku; pocisk[ktorypocisk].delta=delta; canshoot = 0; alarm[0] = global.szybkoscstrzalu; } I teraz w obiekcie obj_laser, w Step Event, następujący kod (zakładając że obiekt gracza nazywa się obj_character): GML x=obj_character.x; y=obj_character.y; image_angle=point_direction(obj_character.x,obj_character.y,mouse_x,mouse_y)+delta; Nie sprawdzałem czy działa, skompilowałem sobie w głowie, i teoretycznie powinno - ale sprawdź :) Jak czegoś nie rozumiesz, daj znać. Nie mam pojęcia, na ile poznałeś GML. EDIT: Ups. Poprawiłem, bom spartolił. Teraz powinno działać. -
Być może są tu tacy, którzy mnie pamiętają. Ja w każdym razie kojarzę parę ksywek.Ostatnio ponownie zainteresowałem się GM. I kojarzę tę trzecią odsłonę GMClan-owego forum. I kojarzę, że pamiętam jeszcze hasło. Nie lubię pożegnań ani powitań, więc z tym zapraszam ew. na PW. A wszystkich innych witam serdecznie po raz pierwszy. Koniec offtopa. Będzie rozlegle. <funkcja base91_init> GML /* basE91. Czyli system liczbowy oparty na podstawie 91. Tak się jakoś składa, że 91 znaków ASCII (litery, liczby i znaki specjalne - z pominięciem znaków ' \ - oraz znaków tzw. niedrukowalnych) mogą być świetnie użyte do reprezentacji danych binarnych. Dzięki temu można przesyłać tekst, muzykę, obrazy, pliki wykonywalne etc. bez obawy o utratę danych w przypadku, gdy obie strony używają różnych kodowań. W praktyce - oznacza to także możliwość wygenerowania binarnego pliku na serwerze dynamicznie, "karmiąc" skrypt zakodowanymi danymi poprzez HTTP - w tym także w Game Makerze. Innymi słowy - wysyłanie i odbieranie plików jedynie poprzez odpowiednie spreparowanie odnośnika. basE91 ma najwyższą efektywność - ok. 82% [źr. Wikipedia]. Oznacza to, że na 100 wysłanych bajtów jedynie 18 z nich stanowi nadwyżkę - będącą efektem zmiejszenia liczby dostępnych znaków do wyświetlenia. I tak... http://example.com/upload/dJR2LwoZ?Xx=nuH*!Bf!rvpa$iDu_8l*@E=C1]OCy$Fn:Eso:zYh>w^C}!n3B Sprawiłoby, by serwer example.com odebrał plik UTF-8 ze swojsko brzmiącą zawartością: Pchnąć w tę łódź jeża lub ośm skrzyń fig Dopóki przesyłany jest tekst w standardzie rozszerzo- nego ASCII (jeden znak zajmuje jeden bajt) - co wyklucza wszystkie języki poza angielskim, który składa się ze "standardowych" liter łacińskiego alfabetu, można bez obawy korzystać z konkurencyjnych metod konwersji danych binarnych na tekst, jak znany wielu base64 czy uuencode. Problemem jest jednak złe radzenie sobie z UTF-8 (standard kodowania wykorzystywany także przez GM Studio - i dziękujmy Morganowi Freemanowi, że tak się stało! Unicode bardzo wiele ułatwia) oraz nadmiar danych. Jeżeli nadal nie widzisz do czego przydaje się konwersja binarno-tekstowa, spróbuj kiedyś wysłać z GM zrzut ekranu z gry na serwer przy użyciu eventu z rodziny Asynchronous. Co do skryptu: nie jestem autorem samego algorytmu. Ba, nawet nie całkiem go rozumiem. Wydał mi się jednak na tyle interesujący i użyteczny, iż postanowiłem zaimplementować go w GM Studio. Autorem oryginalnego algorytmu jest Joachim Henke. Udostępnia go on na licencji BSD, pod adresem http://base91.sourceforge.net/ Autorem tej implementacji / tłumaczenia jest Phariseus. Nie włożył on w nią zbyt dużo wysiłku. Jest pewny, że wiele rzeczy możnaby zrobić lepiej, szybciej, tu zoptymizować, tam kokardkę nakleić. Jest też pewny, że znajdą się ludzie, którym się zechce to zrobić. W związku z tym i powyższym, ta implementacja również udostępniona jest na licencji BSD. Wykonana została dla portalu GMClan.org - Game Maker Polska, do którego autor implementacji żywi ponad 10-letni sentyment - mimo bardzo, bardzo długiego okresu bezczynności. basE91 nie jest standardem ISO, lecz jest implementowany na wielu platformach. Stanowi także wolne oprogramowanie. A za każdym razem, gdy nabywasz, modyfikujesz i udostępniasz wolne oprogramowanie, Richardowi Stallmanowi rośnie jeden włos na brodzie. GMowa implementacja jest dosyć prosta, na chwilę obecną przyjmuje na wejściu ciągi znaków. (wkrótce: pliki). Do adremu, jak to mawiają. - Nicodemus "Phariseus" J. Bernards, 2015 PS: Skrypt jest wybitnie nie-idiotoodporny. Karmisz nieoczekiwanymi / pustymi / nieprawidłowymi wartościami na własną odpowiedzialność. */ /* Zacznijmy od zainicjowania funkcyi. Ta funkcja powinna być wywołana przed pierwszym zakodowaniem lub zdekodowaniem. Definiujemy dwie globalne tablice. Pierwsza, b91_enc, zawiera znaki systemu dziewięćdziesięciojedynkowego (zgadzam się, idiotyczna nazwa), które posłużą za "cyfry". Jeżeli intryguje cię to zagadnienie, polecam http://pl.wikipedia.org/wiki/System_liczbowy Druga tablica tłumaczy z owego egzotycznego systemu na ludzki, czyli dziesiętny. Nic nie stoi na przeszkodzie, by wykorzystać ds_list. Ja byłem na to zbyt leniwy. */ global.b91_enc[0]='A'; global.b91_enc[1]='B'; global.b91_enc[2]='C'; global.b91_enc[3]='D'; global.b91_enc[4]='E'; global.b91_enc[5]='F'; global.b91_enc[6]='G'; global.b91_enc[7]='H'; global.b91_enc[8]='I'; global.b91_enc[9]='J'; global.b91_enc[10]='K'; global.b91_enc[11]='L'; global.b91_enc[12]='M'; global.b91_enc[13]='N'; global.b91_enc[14]='O'; global.b91_enc[15]='P'; global.b91_enc[16]='Q'; global.b91_enc[17]='R'; global.b91_enc[18]='S'; global.b91_enc[19]='T'; global.b91_enc[20]='U'; global.b91_enc[21]='V'; global.b91_enc[22]='W'; global.b91_enc[23]='X'; global.b91_enc[24]='Y'; global.b91_enc[25]='Z'; global.b91_enc[26]='a'; global.b91_enc[27]='b'; global.b91_enc[28]='c'; global.b91_enc[29]='d'; global.b91_enc[30]='e'; global.b91_enc[31]='f'; global.b91_enc[32]='g'; global.b91_enc[33]='h'; global.b91_enc[34]='i'; global.b91_enc[35]='j'; global.b91_enc[36]='k'; global.b91_enc[37]='l'; global.b91_enc[38]='m'; global.b91_enc[39]='n'; global.b91_enc[40]='o'; global.b91_enc[41]='p'; global.b91_enc[42]='q'; global.b91_enc[43]='r'; global.b91_enc[44]='s'; global.b91_enc[45]='t'; global.b91_enc[46]='u'; global.b91_enc[47]='v'; global.b91_enc[48]='w'; global.b91_enc[49]='x'; global.b91_enc[50]='y'; global.b91_enc[51]='z'; global.b91_enc[52]='0'; global.b91_enc[53]='1'; global.b91_enc[54]='2'; global.b91_enc[55]='3'; global.b91_enc[56]='4'; global.b91_enc[57]='5'; global.b91_enc[58]='6'; global.b91_enc[59]='7'; global.b91_enc[60]='8'; global.b91_enc[61]='9'; global.b91_enc[62]='!'; global.b91_enc[63]='#'; global.b91_enc[64]='$'; global.b91_enc[65]='%'; global.b91_enc[66]='&'; global.b91_enc[67]='('; global.b91_enc[68]=')'; global.b91_enc[69]='*'; global.b91_enc[70]='+'; global.b91_enc[71]=','; global.b91_enc[72]='.'; global.b91_enc[73]='/'; global.b91_enc[74]=':'; global.b91_enc[75]=';'; global.b91_enc[76]='<'; global.b91_enc[77]='='; global.b91_enc[78]='>'; global.b91_enc[79]='?'; global.b91_enc[80]='@'; global.b91_enc[81]='['; global.b91_enc[82]=']'; global.b91_enc[83]='^'; global.b91_enc[84]='_'; global.b91_enc[85]='`'; global.b91_enc[86]='{'; global.b91_enc[87]='|'; global.b91_enc[88]='}'; global.b91_enc[89]='~'; global.b91_enc[90]='"'; global.b91_dec[ord('A')]=0; global.b91_dec[ord('B')]=1; global.b91_dec[ord('C')]=2; global.b91_dec[ord('D')]=3; global.b91_dec[ord('E')]=4; global.b91_dec[ord('F')]=5; global.b91_dec[ord('G')]=6; global.b91_dec[ord('H')]=7; global.b91_dec[ord('I')]=8; global.b91_dec[ord('J')]=9; global.b91_dec[ord('K')]=10; global.b91_dec[ord('L')]=11; global.b91_dec[ord('M')]=12; global.b91_dec[ord('N')]=13; global.b91_dec[ord('O')]=14; global.b91_dec[ord('P')]=15; global.b91_dec[ord('Q')]=16; global.b91_dec[ord('R')]=17; global.b91_dec[ord('S')]=18; global.b91_dec[ord('T')]=19; global.b91_dec[ord('U')]=20; global.b91_dec[ord('V')]=21; global.b91_dec[ord('W')]=22; global.b91_dec[ord('X')]=23; global.b91_dec[ord('Y')]=24; global.b91_dec[ord('Z')]=25; global.b91_dec[ord('a')]=26; global.b91_dec[ord('b')]=27; global.b91_dec[ord('c')]=28; global.b91_dec[ord('d')]=29; global.b91_dec[ord('e')]=30; global.b91_dec[ord('f')]=31; global.b91_dec[ord('g')]=32; global.b91_dec[ord('h')]=33; global.b91_dec[ord('i')]=34; global.b91_dec[ord('j')]=35; global.b91_dec[ord('k')]=36; global.b91_dec[ord('l')]=37; global.b91_dec[ord('m')]=38; global.b91_dec[ord('n')]=39; global.b91_dec[ord('o')]=40; global.b91_dec[ord('p')]=41; global.b91_dec[ord('q')]=42; global.b91_dec[ord('r')]=43; global.b91_dec[ord('s')]=44; global.b91_dec[ord('t')]=45; global.b91_dec[ord('u')]=46; global.b91_dec[ord('v')]=47; global.b91_dec[ord('w')]=48; global.b91_dec[ord('x')]=49; global.b91_dec[ord('y')]=50; global.b91_dec[ord('z')]=51; global.b91_dec[ord('0')]=52; global.b91_dec[ord('1')]=53; global.b91_dec[ord('2')]=54; global.b91_dec[ord('3')]=55; global.b91_dec[ord('4')]=56; global.b91_dec[ord('5')]=57; global.b91_dec[ord('6')]=58; global.b91_dec[ord('7')]=59; global.b91_dec[ord('8')]=60; global.b91_dec[ord('9')]=61; global.b91_dec[ord('!')]=62; global.b91_dec[ord('#')]=63; global.b91_dec[ord('$')]=64; global.b91_dec[ord('%')]=65; global.b91_dec[ord('&')]=66; global.b91_dec[ord('(')]=67; global.b91_dec[ord(')')]=68; global.b91_dec[ord('*')]=69; global.b91_dec[ord('+')]=70; global.b91_dec[ord(',')]=71; global.b91_dec[ord('.')]=72; global.b91_dec[ord('/')]=73; global.b91_dec[ord(':')]=74; global.b91_dec[ord(';')]=75; global.b91_dec[ord('<')]=76; global.b91_dec[ord('=')]=77; global.b91_dec[ord('>')]=78; global.b91_dec[ord('?')]=79; global.b91_dec[ord('@')]=80; global.b91_dec[ord('[')]=81; global.b91_dec[ord(']')]=82; global.b91_dec[ord('^')]=83; global.b91_dec[ord('_')]=84; global.b91_dec[ord('`')]=85; global.b91_dec[ord('{')]=86; global.b91_dec[ord('|')]=87; global.b91_dec[ord('}')]=88; global.b91_dec[ord('~')]=89; global.b91_dec[ord('"')]=90; <función base91_encode> GML //Funkcja przyjmuje jeden argument - ciąg znaków. //Zwraca ona także jeden argument. I także ciąg znaków. d=argument[0]; //łańcuch znaków do zakodowania l = string_length(d); //liczba znaków łańcucha b=0; //tajemnicza zmienna numer 1 n=0; //tajemnicza zmienna number b (co, że niby powinno być 2?) o=''; //łańcuch znaków do zwrócenia /* Teraz stworzymy plik, na którym będziemy pracować. Tak, funkcja tworzy tymczasowy plik. Bardzo tymczasowy. Tak tymczasowy, że usuwany jest on jeszcze podczas wykonywania funkcji. Za chwilę dowiemy się, dlaczego. Oto co musimy zrobić: Otwieramy plik w trybie tekstowym do zapisu. Wpisujemy wartość łańcucha wejściowego do pliku. Zamykamy plik. Otwieramy plik w trybie binarnym do odczytu. Zapamiętujemy rozmiar pliku w bajtach. Wartość każdego bajta zapamiętujemy w tablicy bajtów. I dopiero wtedy przechodzimy do głównej pętli funkcji. Jej pierwsza linia odczytuje i-ty bajt z tablicy bajtów, przesunięty bitowo w lewo o wartość n. Dobra, chwila. Ale właściwie po co tyle zachodu? Czy nie łatwiejsze byłoby użycie gołej funkcji ord, zwracającej kod ascii danego znaku, zamiast wielokrotne operowanie na plikach? Problemem są polskie litery. I nie tylko polskie. I nie tylko litery. Właściwie wszystko, co przekracza zakres 8 bitów, czyli rozszerzone ASCII. Jako że ta implementacja funkcji operuje na pojedynczych bajtach - a na przykład polskie litery kodowane w utf8 składają się z dwóch bajtów - więcej patyczkowania byłoby z "rozstrzeliwaniem" znaków na bajty poprzez funkcję. O wiele łatwiej jest najpierw zapisać łańcuch wejściowy tekstowo, a odczytać bajt po bajcie - wtedy dzieje się to automatycznie. Poniżej moja implementacja basE91. Jest to niemalże dosłowne tłumaczenie z PHP4, z kilkoma niezbędnymi zmianami. Oryginalnym autorem algorytmu jest Joachim Henke. Udostępnia on pliki źródłowe pod adresem http://base91.sourceforge.net/ jako wolne oprogramowanie na licencji BSD. Wyobraźmy sobie Portugalczyka, który nauczył się hiszpańskiego. Nie było to szczególnie trudne. I ten oto Portugalczyk znalazł hiszpański wiersz, który chciał przetłumaczyć na ojczysty język. No więc przetłumaczył. Dosłownie lub używając najbliższych odpowiedników. Nie zgłębiał się w analizę treści. Nie domyślał się ukrytych znaczeń parafraz, anafor, metafor i kalafior. To tylko ciąg słów, które brzmią podobnie w obu językach. Nie było takiej potrzeby. Porównał oryginał i tłumaczenie i po prostu stwierdził: "Działa? No to działa. Nie próbuję się nawet zgadywać co podmiot liryczny miał na myśli". I ja jestem tym Portugalczykiem. Przyznaję się bez bicia, że BARDZO powierzchownie rozumiem logikę stojącą za tym algorytmem. Uważam, że nie ma sensu wyważać otwartych drzwi. Ważne, że działa jak powinno działać. OK, koniec tego dobrego. Oto główna pętla. */ temp=file_text_open_write(".encodetemp"); file_text_write_string(temp,d); file_text_close(temp); btemp=file_bin_open(".encodetemp",0); encsize=file_bin_size(btemp); for (bi=1; bi<=encsize; bi++) { byte[bi]=file_bin_read_byte(btemp); } for (i=1; i<=encsize; i++) { b |= byte << n; n+=8; if (n>13) { v = b & 8191; if (v > 88) { b = b >> 13; n-=13; } else { v = b & 16383; b = b >> 14; n -= 14; } o = o + global.b91_enc[v%91] + global.b91_enc[v/91]; } } if (n) { o = o + global.b91_enc[b%91]; if (n > 7 || b > 90) o = o + global.b91_enc[b/91]; } //Czas na zamknięcie i skaskowanie bardzo tymczasowego pliku file_bin_close(btemp); file_delete(".encodetemp"); return o; <funç?o base91_decode> GML /* Jeżeli w miarę ogarniasz mechanizm kodowania, spodoba ci się dekodowanie. Obie funkcje mają dość podobną strukturę. Jedyna różnica to to, że podczas dekodowania wszystko dzieje się w drugą stronę. Poniżej cała masa mądrze wyglądających zmiennych. Wydają się znajome. */ d=argument[0]; l = string_length(d); b=0; n=0; o=""; v=-1; /* Otwieramy bardzo tymczasowy plik binarny do zapisu. */ btemp=file_bin_open(".encodetemp",1); /* Autorem oryginalnego algorytmu jest Joachim Henke. Udostępnia on basE91 na licencji BSD, pod adresem http://base91.sourceforge.net. W pętli znajdują się niezbędne zmiany naniesione przeze mnie w tej implementacji. */ for (i = 1; i<=l; i++) { c=global.b91_dec[ord(string_char_at(d,i))]; if (v < 0) v = c; else { v+=c*91; b |= v << n; if (v & 8191 > 88) n+=13; else n+=14; while (n > 7) do { file_bin_write_byte(btemp,(b & 255)); b = b >> 8; n-=8; } v = -1; } } if (v + 1) file_bin_write_byte(btemp,chr((b | v << n) & 255)); /* Zamkykamy plik otwarty binarnie i otwieramy go tekstowo do odczytu. */ file_bin_close(btemp); temp=file_text_open_read(".encodetemp"); ret=file_text_read_string(temp); /* Ponownie zamykamy plik otwarty tekstowo. Zamykamy go na dobre i kasujemy. */ file_text_close(temp); file_delete(".encodetemp"); return ret; Plik gmx (LINK) Powyższy przykład pozwoli kontynuować zaplanowany przeze mnie cykl dotyczący komunikacji pomiędzy GM Studio a serwerem HTTP. Dzięki temu stworzymy działającą grę, do której będzie można się zarejestrować, zalogować, uczestniczyć w rankinkach z innymi użytkownikami - a wszystko dzięki GML, językowi PHP oraz bazom danych MySQL. I tutaj pojawia się moje pytanie: czy w związku z obecnością w przykładzie innych języków programowania niż GML - jednakże jedynie w stopniu umożliwiającym zobrazowanie przykładu - kontynuacja powinna odbywać się w dziale Inne języki? Sugestie/poprawki/pytania/dyskusje/żale - zapraszam.
-
DevC++ polecam. To nie kompilator, to środowisko. Z tego co się orientuję dołączony jest do niego jakiś darmowy kompilator. Jeśli masz zbyt ciężki portfel, kup Borland C++
-
Po pierwsze, nie rozumiem stosowania procentowego dystansu. Jak coś, co jest ciągiem zmierzającym od zera do nieskończoności, może być procentem? Doprowadziłoby to do sytuacji, w której dystans wynosiłby np 7157%... albo 0%. Procentowo można przedstawiać coś, co jest całością, wartość pomiędzy 0 a 100. Wskazałem ci absurdalność, ty mi wskaż odpowiedź, a przyjrzę się kodowi. EDIT: chyba wiem o co chodzi. W deklaracji zmiennej XX i YY sa to zmienne globalne pokaz.XX i pokaz.YY, a w obiekcie wojo, w wydarzeniu Step - odwołujesz się do jakichś nieistniejących zmiennych lokalnych XX i YY.
-
Fizyka Jazdy 3D
-[PhariseuS]- odpowiedział(a) na pawcio3018 temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Czytając takie wypowiedzi zaczynam żałować, że na GMC nie ma ograniczeń wiekowych. I że administracja nie wymaga papiera z Mensy. Chłopie: czy ty robisz gry tylko po to żeby się chwalić kumplom "Ej ziomy zlookaycie opcję zrobiłem grę w czyde! ale jestem joł, taaaa, respekt elo"? Jeśli chcesz zrobić coś naprawdę dobrego, po pierwsze musi być twój pomysł, twoje wykonanie i duuuużo czasu poświęconego na dopieszczenie - od ogółu do szczegółu, jak to mawiała moja plastyczka. Rada: najpierw poeksperymentuj z 3D, porób parę próbnych gierek, i NIE DZIEL się z nimi na forum. Dopiero gdy pojmiesz zagadnienie trójwymiarowości zacznij się brać za ambitne projekty. -
Czy gnysek powinien kontynować Farmera Frana ?
-[PhariseuS]- odpowiedział(a) na gnysek temat w Valhalla
Jestem tak wielkim fanem serii HM (pierwszy raz gralem w To na SNESie jakos w polowie lat 90', taa, wtedy kiedy wiekszosc dzisiejszego GMClanu wchodzila pod szafe na stojaco), iz powinienem uznac Gnyskowe wypociny za swietokradztwo. Jednakze projekt Farmera Frana jest ciekawym eksperymentem przeniesienia HM do bardziej polskich czy tez polskojezycznych realiow. Kilka lat temu, kiedy Game Maker nie byl jeszcze tak popularny, a znajomosc GML dawala przepustke pod spodnice wiekszosci dziolch z mat-infu, projekt moglby odniesc jako-taki sukces, szczegolnie, iz byly przymiarki do wykorzystania 3D w jego tworzeniu. Patrzac jednak pod katem wymagan dzisiejszych graczy, nie ma sensu jego kontynuowania. Wedlug mnie, oczywiscie. PS: I przepraszam za uzycie spojnika "i" na poczatku tego zdania, oraz za brak polskich znakow (nie mam tu dostepu do polskiej klawiatury) -
Animacja szkieletowa
-[PhariseuS]- odpowiedział(a) na Yoda temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Ciekawy przykład, ale widzę tu chyba inspirację filmem Egzorcysta - głowa obraca się dookoła osi :) powinieneś zaimplementować coś, co ogranicza ruchomość głowy lub po przekroczeniu jakiegoś kąta obraca całe ciało (tak samo jak człowiek, który chce się obejrzeć za siebie, najpierw porusza głową, a potem całym korpusem) -
Jeśli chcesz największego bezpieczeństwa, samemu napisz algorytm szyfrowania i odszyfrowywania. Klucz można łatwo scrackować.
-
PROFESJONALNY PROJEKTANT SZUKA PROGRAMISTY
-[PhariseuS]- odpowiedział(a) na design-apocalypse temat w C, C++
Jak dla mnie to ten temat do zamknięcia, chłopak widocznie się popłakał, zabrał pożyczone zabawki z piaskownicy i sobie poszedł. -
konkurs
-[PhariseuS]- odpowiedział(a) na GMcliker temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Dlaczego sam nie zrobisz menu? Sam w końcu najlepiej wiesz, jakie by pasowało najbardziej. Żal. -
Oczywiście że się da, za pomocą GML. Musisz tylko określić warunek, w którym obj1 wyprzedza obj2 - czy na przykład obj1.y>obj2.y, albo co tam masz, bo nawet nie wiem, jak to jest skonstruowane. Jednakowoż, będzie to wyglądało tak if (obj1 wyprzedza obj2 - jak mówię, warunek sam skonstruuj) view_object[numer widoku, prawdopodobnie 0]=obj1; else view_object[jak wyżej, wpisz tu numer widoku, którego sprawa dotyczy]=obj2; powinno pomóc.
-
Ale jak to... za dwoma? Nie rozumiem, czy chodzi ci może o tzw. split screen, czyli dwa widoki obok siebie i każdy pokazuje co innego? Był gdzieś chyba przykład na GMClanie, radzę poszukać.
-
multiplayer w gm
-[PhariseuS]- odpowiedział(a) na RPGCreator temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
No przyznam że jestem zaskoczony postawą GMClanowiczów odnośnie nowego użytkownika który chce zrobić kolejną tibiopodobną grę o_O Już się przygotowywałem na ogólnoforumową z**bę, a tu proszę, miłe zaskoczenie. A ty, drogi mój RPGCreatorze, zanim wyskoczysz z jakimś zapytaniem, poszukaj w artykułąch/tutorialach/przykładach. -
Oj Fallord, bo się zaraz pogniewamy. Jakie znowu "byle jak"? Jakie znowu "bity"? Jeżeli coś mu świetnie wychodzi, to chyba nie jest to wkładanie byle jak, hm? Ludzix ma coś, czego brakuje wielu domorosłym żiżejom: słuch muzyczny
-
Dzieci neo? Zapomniał Owyn, jak Brucem D. był :P Szanowny kolego, ja jednak pamiętam jak lamiłeś i nubiłeś, jeszcze kilka lat temu, więc nie czepaij się innych :P Zamiast biadolić, sam coś napisz.
-
Tak na prawdę opanowany na fest mam tylko język angielski i polski. W podstawówce uczyłem się francuskiego przez 3 lata, a ledwo mogę wydukać "Je suis Phar". Teraz trzeci rok uczę się niemieckiego, a i tak nic z tego nie rozumiem. Z języków mniej ludzkich to praktycznie tylko GML, obecnie znam podstawy c++, jednak za obiekty się jeszcze nie zabierałem (przeraża mnie ta dziwna składnia). Html to rzecz oczywista i nawet nie ma co o niej wspominać. JavaScript? Nie, dziękuję, jak dla mnie to już przeżytek na rzecz języków serwerowych. Znam również podstawy PHP, ale jakoś nie przejawiałem motywacji, by się dalej w to zagłębiać.
-
Na litość, wystarczyło wklepanie w Jedynej Słusznej Przeglądarce frazy "game maker old version" i już mam źródło do pobrania archaicznych edycji - a mianowicie OFICJALNA STRONA GM. @ Shocker51374: SŁUCHAM?! ŻE CO?! Nie nie, powtórz, bo chyba mam problemy ze wzrokiem. Oczywiście że GM w wersji np. 3.3, po uruchomienu opcji Create stand-alone, tworzył EXE, folder game_data i plik gmf, chyba jeszcze pamięć mnie nie szwankuje. Z tym, że inaczej się miała sprawa z funkcjami poszczególnych plików.
-
Zawsze lepsze ciasne, ale własne. A żeby zrobić w końcu dobrą grafikę, należy ćwiczyć, ćwiczyć i jeszcze raz ćwiczyć. "Zzrzynanie" z innych gier nie tylko jest łamaniem praw autorskich, lecz także aktem desperacji.
-
AD 1) Ależ ja nie mówię, że takich programów były na tym forum miliardy. Chodzi mi o to, że jeżeli program, który niczym się nie wyróżnia, raczej nie przebije się z tłumu setek innych tego typu produkcji, skryptów i apletów w internecie. AD 2) http://pl.wikipedia.org/wiki/Średnia (konsipracyjny szept) psst, młody, tam nie sprawdzają twojego obecnego wykształcenia ;) Zanim się za cokolwiek chcesz zabierać, normalnym jest dla mnie zdobycie przynajmniej jako takiego pojęcia o tym, co masz zamiar zrobić. AD 3) Jak dla mnie to nie jest dobre usprawiedliwienie dla twojego lenistwa. A co, jeżeli użytkownik się rozmyśli i postanowi zmienić wcześniej wprowadzone dane albo postanowi zmienić liczę uśrednianych liczb? Nie ma rady, musi wklepywać jakieś bzdurne rzeczy do końca, wyłączyć program, włączyć go ponownie, i modlić się, by tym razem nie musiał niczego zmieniać. AD 4) Problem w tym, że ten obrazek wcale nie jest fajny. PAL SZEŚĆ iż nie jest fajny, przede wszystkim nie jest twój. AD 5) Polecam ci oglądać więcej reklam piwa, o, na przykład tę ze skazańcem na krześle elektrycznym i dowcipnymi klawiszami. Jak to szło? Ah, "nie odbierajmy życia zbyt poważnie" EDIT: Właśnie zauważyłem ten temat. I dziwnym zbiegiem okoliczności, ostatni post jest w nim na dwie godziny przed opublikowaniem twojego programu. Patrząc na ów temat, mam bardzo uzasadnione podejrzenia, iż większość roboty w Liczniku średniej odwalili inni użytkownicy GMClanu, nawet sami o tym nie wiedząc. Szkoda więc, że asekurancko nie umieściłeś Licznika średniej w formie *.gm6 lub *.gmk. Ojoj, bo ktoś by jeszcze zobaczył, że nadużywasz klawiszy ctrl+c i ctrl+v, nie analizując nawet fragmentów kodu?
-
- Panowie, panowie, panowie, i gdzie tu oryginalność, a przede wszystkim wartość użytkowa? - Nie napisałeś że program wylicza jedynie średnią arytmetyczną. A gdzie średnia geometryczna, harmoniczna itp? - System wklepywania liczb leży na całej linii (pomylisz się raz, i tego nie poprawisz, może to bardzo wnerwić jeżeli masz wiele liczb do uśrednienia) - I CO TO ZA OBRAZEK? Pomijam to, że jest to jakieś chore furry, ale jaki ma on związek z wyliczaniem średniej? - Na pytanie, czy chcę obliczyć jeszcze jedną średnią, odpowiedziałem "nie, do ciężkiej choroby, wyłącz się w cholerę i na zawsze zniknij z mojego twardego dysku". Program nie posłuchał i musiałem dalej oglądać dzieło jakiegoś furfaga Podsumowując: zero oryginalności, zero włożonego wysiłku, zero, zero, po prostu totalne zero, dlatego moja jedna gwiazdka do tematu jest już i tak grubą przesadą. Ah, i nie bierz tego wszystkiego osobiście, po prostu jestem o tej porze bardzo krytyczny :P Pozdro EDIT: Dopiero teraz zauważyłem, że jesteś z Krakowa (Grzegórzki pozdrawiają!). A szkoda, dostałbyś tę jedną gwiazdkę więcej :D
-
Ludzix, ty skurczybyku, niezły jesteś. Jeżeli nie zarabiasz na swojej twórczości, pomyśl o tym. I mówię to całkowicie serio.
-
Moja największa szkolna wpadka: poszedłem do mat-infu, a i tak nie zdaję na tegorocznej maturze niczego ścisłego. Bo po prostu nie jest mi to potrzebne. "Dzięki" temu już trzeci rok będę miał problemy z przejściem z matematyki. Co ja sobie do jasnej cholery myślałem? Możecie się już śmiać, mi i tak jest wszystko jedno
-
PROFESJONALNY PROJEKTANT SZUKA PROGRAMISTY
-[PhariseuS]- odpowiedział(a) na design-apocalypse temat w C, C++
Cześć A ja się nie nazywam Sebastian Płóciennik i zdobyłem dwukrotny tytuł Webmastera Miesiąca - jeden wczoraj, drugi w zeszłym tygodniu, nie pamiętam tylko kto mi go nadał, bo ten świat taki ogromny. Oczywiście mam bardzo dużo próbek mojej pracy, lecz ich tu nie zaprezentuję, bo coś mi się popsuło a poza tym to pewnie i tak by mi ktoś ukradł. Mam pomysł: zostaniesz moim tańczącym krasnalem i będziesz na każde moje skinienie. Oczywiście to ja ustalam co tańczysz, zapomnij o tym, że kiedykolwiek miałeś własny styl. Obiecuję Ci grube miliardy, sławę, trawę i panienki... lecz większość zysków pójdzie do mnie, no bo w końcu to ja dałem pomysł, nie? I bardzo mnóstwo ludzi będzie tańczyć mój... UPS! NASZ taniec, i wszyscy będą żyli długo i szczęśliwie, potrzebuję tylko niewolnika-wolontariusza, gdyż jestem zbyt leniwy, by samemu się czegokolwiek nauczyć. Czy wspomniałem także, ż pracowałem w Zakładach Przetwórstwa Mięsnego w Parzymiechach? Pozostaw swoje CV, list motywacyjny i numer karty kredytowej w tym temacie, a mój br... tzn seksowna blond sekretarka wybierze najlepszą z tych tysięcy ofert. EDIT: No dobra, żeby nie było, że nic nie wnoszę do tematu, teraz już serio: Człowieku, oprzytomniej. Popatrz na siebie z naszej perspektywy. Przychodzi ktoś, o kim w ogóle nic nie wiemy, i nawet nie możemy się dowiedzieć, gdyż temu komuś nie zależy na podzieleniu się swoimi dziełami. Szafujesz nam tu z d*** wziętymi referencjami. Umieszczasz swój temat tam, gdzie nie trzeba, a na dodatek kompletnie ignorujesz zasady forum oraz ogólnie przyjętych norm międzyludzkich. Żegnam, bo nie sądzę, byś po tak "ciepłym" przyjęciu kiedykolwiek zechciał coś tu napisać z obecnie używanego przez ciebie konta. -
Rysowanie wielokątów (skrypt+przykład)
-[PhariseuS]- odpowiedział(a) na -[PhariseuS]- temat w Gotowe Skrypty, przykłady, dodatki, silniki 3D dla GM
Nie bardzo rozumiem o co chodzi z tymi skrajnościami o_O No ale dobra. Czy ktoś z redakcji mógłby umieścić ów *.gmk w sekcji Przykłady działu Download? Bo albo nie umiem sam tego zrobić, albo nie mam uprawnień.