Quetzalcoatl [ Konsul ]
Oby tylko kadra sie nie wypalia... czyli MUD-3D: odslona 3
Link do poprzedniej czesci obowiazkowo...

Quetzalcoatl [ Konsul ]
[no, to zaczal mi sie wlasnie nowy 30h limit :)] dzisiaj czas na system walki... a duzo o magii znajdziecie w czesci poprzedniej... gral ktos w JakąkolwiekGrę z serii FinalFantasy? niee, system nie bedzie taki, bo ów ATB do sieci sie nie nadaje raczej, ale mam zamiar sciagnac od nich menu czynnosci. walka przebiega w turach, kazda z nich podzielona jest na 2 fazy: ************************** 1 *********************************** W pierwszej z nich gracz moze ustalic co i w jakiej kolejnosci jego postac zrobi. Ma do dyspozycji 10 jednostek czasu (TP time points) ktore moze wydac na dowolna czynnosc z menu, czyli podstawowe Atak,Obrona,Przedmiot,Ruch pozniej dojda (jak sie kto nauczy:) ) takie jak Magia,Zdolnosci,Zdolnosci Przedmiotu itp. ***Pod wybraniu Ataku rozwinie sie menu z dostepnymi ciosami np. przy mieczu - cios z za glowy, z lewej, z prawej, (dostepne w 3 wersjach - miecz wyciagniety prosto "koszaco", pod katem "ślizg/siekanie", albo płazem czyli tępą plaszczyzna miecza) dźgnięcie, itp. kazdy z nich ma inne zniszczenia, charakterystyki wlasne, zuzycie broni etc oraz inne zuzycie TP. Np. kolejno: 4tp,2tp,2tp i 3tp dla dzgniecia. ***Pod Przedmiot bedzie mozna uzyc przedmiotu, przy czym kazdy bedzie mial inny koszt uzycia, inne zachowanie, a niektore byc moze beda miec wlasne menu, jak da sie je na kilka sposobow wykorzystac... ***Zas pod panelem Obrona bedzie mozna znalezc Blok,Unik itd. ale nie beda to czynnosci (!) ale hm.. "deklaracje"... blee.. jakosc nie moge sie wyslowic.. w kazdym badz razie w takim np. Bloku bedzie zaznaczyc +2tp. Zaznaczasz tym, ze chcesz byc "bardziej ostrozny" przy wykonywaniu czynnosci (beda cie one kosztowac wlasnie o 2tp wiecej) i miec wieksza szanse na zBlokowanie ciosu przeciwnika. W tym przykładzie po wybraniu bloku +2tp ataki beda mialy koszty 6,4,4,5tp ale bedzie ci sie czesciej udawalo blokowac ciosy w trakcie walki. Dodatkowy koszt dziala tak dlugo az sie go zmieni, np +1Blok potem Obrot i Ruch +0 Blok i Atak. ***Ruch - no coz, podczas walki tez mozna chodzic, skakac obracac sie itd, co nie? kazdy ruch/obrot to 0.5tp podskok 1tp, skok w kierunku 2tp ------------------------- Przyklad ---------------------------------------------- W 1) fazie wszyscy gracze wdani w bójkę mniejwiecej jednocześnie ustalali kolejki czynnosci dla swoich postaci. np. Jestem Ja i On. Ja robie tak: +1 Blok,obrot w lewo (1.5tp),obrot w lewo (1.5tp), cios sieczny z lewej w:On (3tp+3 na obrot 2xprawo) razem zuzylem 9tp ale wykonalem ~kombo~ tzn. zwiekszylem sile ciosu z boku dzieki obrotowi, nawet podwojnie, bo obrot podwojny... On zas: Dzgniecie (3tp),Podskok(1tp),+2 Unik,Cios z zaglowy(6tp), razem wiec zuzywa rowno 10tp, i wykonuje ~kombo~ tzn wali z za glowy z wyskoku **************************** 2 ********************************* O ile w fazie 1) byl limit czasu (15-30sekund) tak aby jedni gracze nie blokowali innych, o tyle faza druga go nie posiada - gracze nie maja i tak w niej nic do powiedzenia. W fazie 2) postacie poprostu wykonuja to co im sie zadalo w kolejnosci okreslonej przez graczy i przez szybkosc postaci. Szybkosc postaci objawiala sie zarowno w zmiejszonym koszcie czynnosci, jak i w rozstrzygnieciu, ktora postac ma dzialac pierwsza. -------------- Przyklad, czyli przebieg walki ---------------------------------------------- W 1) fazie juz ustawiono kolejki, teraz czas na odpalenie 'uplywu czasu' w przyblizeniu 1tp=1sek. [On jest szybsze niz Ja] *0) start *1) nic *1.5) Ja:obrot w lewo *2) nic *3) On:dzgniecie Ja: ew. blok (+1) lub ew. unik Ja: obrot w lewo [teraz Ja jest tyłem do On - ryzyko wiekszych obrazen] *4) On: <tu byłby podskok, ale jest on polaczony z ciosem z za glowy, wiec bedzie pozniej> *4.5) Ja: <tu powinien byc obrot, ale wchodzi on w kombo z ciosem siecznym...> *5) nic *6) Ja: <tu powinien byc drugi obrot, ale wchodzi on w kombo z ciosem siecznym...> *7) nic *8) ciagle nic *9) Ja: cios sieczny z lewej, spotegowany obrotem o 180 stopni (czyli szybko: obrot,obrot,cios) On: ew. unik (+2) lub ew. blok *10) On: cios z wyskoku, z za glowy (czyli podskok, i cios podczas upadku) Ja: ew. blok (+1) lub unik [oczywiscie zakladamy, ze zadna z postaci nie miala szczescia na tyle aby juz zabic druga w trakcie tej tury :))]

Quetzalcoatl [ Konsul ]
a, zapomnialbym o jeszcze jednej waznej sprawie: Gracz Ja nie wykorzystal limitu TP (zostal mu 1TP pod koniec) i ten 1TP przejdzie mu do nastepnej tury jako dodatkowy 'czas', maksymalnie mozna tak sobie przeniesc 3TP, reszta sie zmarnuje. Jednak moze i wart zostawiac sobie, jako ze w przyszlej turze twoje dodatkowe TP zostana wykorzystane pierwsze (oczywiscie przeciwnik tez moze, i wtedy ecyduje juz szybkosc postaci) Np. zostawiles sobie 3tp: czas: -3 | -2 | twoja(e) czynnosc(i) dodatkowa -1 | 0 (start wlasciwy) 1 | 2 | normalna kolejka ..| Zamiast zostawiac sobie ruch na nastepna ture co wiecej, mozesz tez w danej przekroczyc limit 10TP maksymalnie o 3TP (do 13), JEDNAK nie mozesz dokadac czynnosci powyzej 10-ego TP (poprostu jednak czynnosc moze 'wyjsc' poza limit 10tp, ale nie poza 13-tyTP) ORAZ analogicznie masz o 3tp mniej i zaczynasz od +3s: poprzednia kolejka: 8.. 9 | 10| 11|twoja czynnosc rozpoczeta w 9-ymTP trwala 5TP i przekroczyla limit 12| 13| NOWA TURA 0 || 1 ||tu On rzadzi 2 || 3 a tu dopiero Ja moze miec swoj nastepny ruch

Quetzalcoatl [ Konsul ]
no, to tyle na dzisiaj, jesli macie uwagi/komentarze/niezrozumienia co do systemów walki i magii to prosze pisac. Postaram sie odpowiedziec kolo 20.00 jesli cos sie uzbiera do tej pory:)) PS. system magii wiaze sie z Menu walki w prosty sposob: pod panelem Magia beda 2 opcje "Wpisz" oraz "Rzuc z pamieci" :)
Marcio [ Muchożerny Ścianołaz ]
jesli chcecie to znalazlem C++ buider

Quetzalcoatl [ Konsul ]
niepotrza, dziekujemy. co do c++ to jedynie silnik juz jest w nim pisany, a SC bedzie klepane poprzez klienta gry - tak wiec ani do enginu ani do tworzenia swiata nie bedzie on potrzebny. Mozesz najwyzej bigosowi linka mailem zarzucic, bo szukal jesli dobrze pamietam. Tu go nie umieszczaj, bo wparuje pare osob i zacznie gadac "a co w nim sie robi" "a jak to sie robi" etc :)
Marcio [ Muchożerny Ścianołaz ]
ok. kiedys cos (probowalem ale nie wyszlo ;-) napisac prosta przeglandarka graficzna

BIGos [ bigos?! ale głupie ]
Hm.. z tego co wiem z maili to jestem chyba przyjęty :) hurra :)) Walka zrobiona eXXXtra, magia też. W sumie co do magii to jeden pomysł - gracze zamieniali by się w większe zywiołaki po "przeładowaniu", a istaniałyby też zwykłe żywiołaki, o mniejszej mocy. Walka - hm.. tu myślę zeby troszke skrócić ilośc przechodzących do następnej rundy tp. Aktowka - jest pusta czy zeby sie zalogowac i ja przejrzec musze miec konto w Yahoo ? Aha.. i do Kojotki ---> masz już jakąś nazwę?

Quetzalcoatl [ Konsul ]
pomniejsze zywiolaki i polzywiolaki mile widziane, zapomnialem :) co do limitu przejscia to 3 jak raz sa moim zdaniem, ani za malo ani za duzo - pamietaj ze obaj gracze moga zostawic sobie (co jest b.prawdopodobne), i wtedy roznica sie deko niweluje... poza tym zmienilem troche, aby bylo sensowniej: CZYNNOSC KTORA PRZEKROCZYLA LIMIT (maksymalnie o 3tp) zostanie wykonana NA POCZATKU NASTEPNEJ KOLEJKI!!! tzn: jak dasz +5 blok +2unik i cios z gory, to cios ma koszt 11, cala kolejka mija bezczynnie na obronie (+5/+2 !) zas w 1 sekundzie nastepnej kolejki postac uderza. zwroccie uwage ze to ma podobny efekt, jakby w tej 'nastepnej' kolejce cios z gory kosztowal 1tp a nie 4! - czesc 'kosztu' zostala zaplacona w poprzedniej. ja optuje za (V) rozwiniecie akronimu zaliczyc jako ciekawostke/dowcip/reklame :) V.A.I.N.: VAST ACME INDUE NOUS albo tez pisane VAIN [wszystkie slowa z angielskiego oczywiscie...] [wychodzilem z zalozenia ze nazwa powinna byc krotka, dowcipna i trafiajaca w efekt. VAIN to czesc dowcipna mam nadzieje :) ]
Quetzalcoatl [ Konsul ]
Ah, skleroza: Kojotka: wakacje juz skonczylas, czy jeszcze nie? :) BIGOS: na razie zostales wstepnie przyjety, jak na studia :))

BIGos [ bigos?! ale głupie ]
Quetazlcoatl --> no to jestem hepi :) 3d s max się załatwia, a co do potworka (miałem rysowac) to jakoś miernie wychodzi, jak uda sie zrobić wersję która by mnie zadowoliła i w której dałoby się odróżnić co jest co, to wyślę na maila. co do VAIN to zaraz sięgam po słownik :) Marx, kojotka - udało się mapke przemalować? i ponawiam pytanie o aktówkę - pusta czy muszę mieć konto?
Quetzalcoatl [ Konsul ]
kojotka: ale beka, wlasnie PRV.PL stalo sie platne... tzn. nie CALE a jedynie aliasy sa platne 9zl za... dzien. eee zartuje za ROK. tak wiec w tym roku ja za to zaplace, kurcze wezme sie i poswiece :) przez dzien lub dwa emaile admin i [email protected] moga nie dzialac ze wzgledu na to, czy forsa dojdzie szybko czy wolniej :) kojotka+bigos: sprobuje przekratkowac moja mapke na kompa, bo skanera miec raczej nie bede... w sensownym czasie. jakos nie bedzie az tak dobra, jak ta naszkicowana olowkiem na kartce A4 w kratke ( z cieniowaniem wypuklosci.... ) ale za to dolacze propozycje wszystkich nazw rzek,gor, krain geogr. etc, ktorymi nie odwazylem sie zniszczyc mojego dziela sztuki :P ETA: 3 dni dla leni: VAIN: hmm.. przeceniany/przechwalony VAST: wielki, ogromny (polac ziemi zwlaszcza) ACME: szczyt doskonalosci w jakiejs dziedzinie) INDUE: nadac doskonala jakosc (inaczej endue) NOUS: inteligencja (w robieniu/dzialaniu)

Quetzalcoatl [ Konsul ]
kojotka: powiem ci szczerze ze ta aktowka na Yahoo jest chyba tylko dla wtajemniczonych w tajemnice panstwowe :) zalozylem kiedys prostsze i duzo szybsze, acz mniejsze bo 25mb konto na EDYSK.PL login QUETZALCOATL haslo <to samo co u kojotki, wszystko male litery> wrzucilem tam juz kawalek (dokladnie 2/36) mapy terenu. UPDATE: do konca kopiowania mapy: ETA 5dni ee, ja wiem ze jest SZKOLA ale kurka mozna tutaj wpasc CO DZIEN NA 5 MINUT zeby sie zaladowalo i 5 MINUT na wklejenie/wyslanie przygotowanego posta z notatnika. KOJOTKA - autentycznie, nie zajmie ci to wiecej niz 10 minut..............

BIGos [ bigos?! ale głupie ]
IMO to nazwa jest wspaniała po prostu :))) no i w sumie szkoła troszkę mnie hamuje, jeszcze nie dorwałem 3d studio maxa, a bez większych szczegółów Planu to pomysłami też was nie zarzucę... Ale entuzjazm nie spadł, jak tylko dostane coś czym będę się umiał posłużyć to... :)

Quetzalcoatl [ Konsul ]
updatcik na edysku teraz jest juz ponad 4/36 mapy. zapraszam do txt.txt oczywiscie :)
kojotka [ Centurion ]
Czesc i wybaczcie, ze mnie tak dlugo nie bylo... Zaraz przeczytam wszystkie posty i cos odpisze. Ale duzo tego :)

BIGos [ bigos?! ale głupie ]
Kojotka ---> wolno czytasz... :) Quetzalcoatl ---> cosik sie pieprzy ten edysk.. loguje sie ładnie jak kodeks każe, klikam na pliczek mapka.zip i daje ściągnij i... (przerwa na reklamy) ZONK wyskakuje małe okienko, zaraz znika i tyle... jeszcze popóbuję, mam starą wersje javy, ale z tego co widzę to edysk robiony jest we flashu. ew. poślij to na maila jeśli możesz...

kojotka [ Centurion ]
No i po kolei: Quetzalkoatl --> twoj system RZADZI! :) Nazwa tez fajna :)) Wakacje skonczylam :( Nie pisalam bo nie mialam modemu :(( Ale juz mam :) PRV.PL PLATNE?!! %( Jesli projekt sie przez rok utrzyma, to nastepnym razem ja place. Bigos --> aktowka - u mnie dzialala... ale edysk jednak lepszy. Mapka - nie wiem, Marx mi jeszcze nic nie odeslal. Z czestotliwoscia wchodzenia na siec nie wiem jak u mnie bedzie, ale na 100% w poniedzialki bede zagladac i poscic. Zrobilam kawalek tekstu - pare lokacji, questow, postaci - nic wielkiego. Takie mapki dwoch miast - podobna metoda, jak te Quetza, tylko nie wiedzialam, czy moge robic ulice na ukos. Wrzuce na dysk jak tylko uczynie to wszystko troche bardziej zrozumialym, bo na razie ja ledwo sie w tym lapie.
LUser [ Pretorianin ]
Od razu przeproszę, że wtrącam się do projektu. Co dopiero zauważyłem cokolwiek o nim, za rzadko tu bywam. Zamiast 3d studio max moglibyście użyć 3d studio gmax, jest darmowy no i to właściwie to samo co zwykły max oprócz kilku opcji. Sam z niego korzystam, nie profesjonalnie oczywiście. Ot, takie hobby. A 3d studio gmax można znależć tu:

BIGos [ bigos?! ale głupie ]
Człowieku! Spadasz mi z Nieba/Allach Akbar/Co moje to i Twoje/Wybierz sobie/Whatever. No więc, po pierwszysm zachwycie muszę od razu cię skarcić za to iż przepraszasz że się wtrącasz... Jeżeli to jest jedynie troszkę orkojona wersja 3ds max to BARDZO mi pomogłeś... Jeśli to bardzo okrojona wersja #ds max to BARDZO DUŻO mi pomogłeś... A właśnie mi się przypomniało że mam jakiś stary programik do grafy 3d z CD Action :)
Marcio [ Muchożerny Ścianołaz ]
moglby ktos podac pelnego linka to tego 3d maxa bo znalezc nie moge

BIGos [ bigos?! ale głupie ]
As you wish...

LUser [ Pretorianin ]
---> BIGos Heh, nie ma sprawy :). Ta wasza giera miałaby być freeware, czy normalna za kasę? Z tymi od gmaxa w sprawie sprzedaży gier na tym programie można pogadać, mają gdzieś tam nawet dokument z wyjaśnieniami. A tak przy okazji... potrzebujecie grafika 3d? :) Może mógłbym spróbować. Muszę koniecznie przeczytać oprzednie topici o tym projekcie :).
Marcio [ Muchożerny Ścianołaz ]
thx

BIGos [ bigos?! ale głupie ]
LUser ---> Z tego co wiem to freeware, zresztą obluknij quet-kojo.prv.pl A co do grafika 3d to ... NIE WIEM, ja tu tylko sprzątam :) A poważnie to musisz gadać z Quetzalcoatlem i Kojotką bo sam jestem na próbnym :) IMHO to grafik 3D by się przydał, ale wiesz, już 3 panów zwątpiło i se poszło (liczę marxa), no i chyba czaisz baze o co chodzi, no nie ziomal? <guje żume> ? :)))

Quetzalcoatl [ Konsul ]
freeware? zanic w swiecie nie nadam temu programowi zadnego statusu freeware, shareware, abandonware :) ani hardware :P poczytaj lepiej definicje freeware'a. tutaj za darmo mozesz jedynie sciagnac klienta i na nim grac za darmo. za darmo mozesz tez podlaczyc sie do naszego (przyszlego) serwera i za darmo bedzisz mial na nim konto+jego utrzymanie (czas utrzymania zalezy od poziomu gracza i nieobecnosci). w ZADNYM razie nie dostaniesz do łapy progrmau serwera ani zadnej czesci czegokolwiek zwiazanego z serwerem. status freeware narzucalby mi udostepnienie plików serwera tuż obok klienta. [wara :)) ] tyle zjebki. EDYSK bedzie mial update'a jutro bo dzis zapozno sie na inet wpakowalem.... co do grafy - potem. co do mapy - kojotka - po co ci marx??? jutro po 16:00 wysle na edysk nastepna czesc mastermapy juz z zaznaczonym miejscem gdzie umiescimy twoj wycinek (ten ktory juz nam pokazywalas) bedziesz miec na to okolo 4800 pokoi terenu (teren 4x3 pola po 400 pokoi, czyli prostokat 800m x 600m co wcale nie jest tak malo w brew pozorom. sprobuj sobie wyobrazic taki prostokacik i ile bys przez niego szla piechota, jak gracz musialby....) do jurta wam
Quetzalcoatl [ Konsul ]
umh.. jutra

BIGos [ bigos?! ale głupie ]
Ah.. prawda, Quetzalcoatl, pomyłka i "niedomyślenie" z mojej strony... :) LUser -> dopsze, mam, dorwałem tego edytora :) Fajnie wszystko rozumiem na razie, stadard jak w wiwlu innych edytorach, tylko jak tworzyć bardziej zaawansowane projekty? A nie jakies prostaciki, cylindry, kule itp. ? I czy jest gdzies tam teksturowanie? Bo renderowania nie ma, już wyczytałem :)

Marx [ Legionista ]
siemanko ostatnio cosik mnie nie było z powodu budy Również przez szkołe mapa niskończona
kojotka [ Centurion ]
^^UP Quetzalcoatl --> Jesli chodzi o mapke to wiem, ze bedzie u ciebie, ale myslalam o jakims czyms ladnym do umieszczenia na stronie. Zeby byly tez jakies obrazki, a nie tylko suchy tekst.

BIGos [ bigos?! ale głupie ]
kojotka --> jak na mój gust to przerób te mapkę Quetza z edysku na barzdiej "artystyczną" przynajmniej dopóki Quetzalcoatl nie zeskanuje swojego dzieła... LUser--> jestes mi potrzebny :) chono tu :)
Marcio [ Muchożerny Ścianołaz ]
sciangnolem 3d studio gmax ale przed odpaleniem programu trzeba sie zarerejstrowac a myslalem ze to jest freeware tylko strasznie okrojone

Jeckyl [ Pretorianin ]
Kojotko, Quetz ---> Przykro mi bardzo wiem, że miałem zrobić dla was muzę pod tą grę ale niestety nie mogę. Dla mojej kobiety zaczęła się szkoła, dla mnie praca więc nie będziemy mieli czasu na coś takiego a szkoda bo naprawdę chciałbym. :(((((((((((((((((((((((((((((((((((((((((((( Pszepraszam
Quetzalcoatl [ Konsul ]
dzisiaj krotko: ogolnie 1) ten upadte z wczoraj jest juz :) [etherlords mnie od internetu odciagnal na moment ;) ] ogolnie 2) bigos,kojotka - czy ja dobrze zrozumialem ze mapa na stronie? w zyciu! chcecie graczom cala frajde z robienia mapy zabrac? grafiki pomieszczen, przedmiotow, stworow oki, ale nie mapy zlitujcie sie. jak damy im mapy to co oni beda mieli do odkrycia? no, procz questow i itemow??? marcio: spoko, mala zwala :) Jeckyl: spoko, standard :)

BIGos [ bigos?! ale głupie ]
No więc (nie zaczynamy zdania od więc :) ) : na edysk jutro (dzisiaj) wrzuce moją pierwszą pracę 3D, buławe czyli kolczasta kulke na kijku bez łańcucha :) Nie wiem tylko czy nie za dużo szczegółów. moze te kulke jakąś kwadratową? :) heh, słabo myślę... :) oczywiście w kwestii mapy masz rację... we wszystkich innych też... :) Ale małe pytanie - ponoć gmax jest robiony na engine (?) 3ds max... Jutro zmieszcze screena z gmaxa (dzisiaj juz spiee... zieeeew), a Ty powiesz mi czy jest podobny to 3ds max, ok? :) jeśli tak to będe miał do Ciebie kiiiilka pytań :)
BIGos [ bigos?! ale głupie ]
oto i screen Powiedz mi czy jest to podobne do 3ds max? -------------->

Quetzalcoatl [ Konsul ]
primo: podobny jak 2 szklanki wody ;) secundo: zjebka. juz na wireframe widac ze uzyles przynajmniej 500 trojkatow na dosyc prosta bron. chlopie, jezeli kazdy obiekt bedzie mial po tyle punktow/trojkatow, to pozwole sobie cie oswiecic : kazdy wierzcholek trokata jest opisywany przez 6 wartosci kazda zajmuje 4bajty. 500x6x4=11kB. No coz sorry wyszlo mniej niz myslalem ale i tak za duzo. Taki model moze sie plasowac jedynie do kategorii LIGHT (jak poprawisz textury :) ). A niestety wiekszosc graczy bedzie siedziec na kat. MODEM lub CABLE. Sorry, odpada. Poprostu zbyt ladnie chciales zrobic. :P Zdrugiej strony to tez moja wina - nagadalem sie nagadalem, podalem 3 stopnie dokladnosci modeli (Modem,Cable,Light) a na smierc zapomnialem zrobic wam przyklady. Uh. Postaram sie je zrobic do jutra wieczora. Na razie wsztrzymaj sie z robota, bo szkoda wysilku - sam raczej sie nie domyslisz co jak brzydko ma byc :)) do jutra wiec...

Quetzalcoatl [ Konsul ]
ehhe zajrzalem na edysk po napisaniu posta i.... lipa. Gdzie ten model? zapomnialo ci sie co ? ;))
Quetzalcoatl [ Konsul ]
eeee omento - jak sie teraz moniej przyjrzalem i pogrzebalem w maxie to doszlo do mnie ze zeby otrzymac taka 'zakreskowana' sietke potrzeba conajmniej kilkuset trojkatow na sama kulę i przynajmniej z pol_setki na kazdy jeden kolec + setka na raczke jeeeja to wyjdzie duuzo wiecej niz 500 :) wez sprawdz zaznacz wszysko, narzedziem PolygonCount (ostatnia zakladka, jest ukryte w dodatkowych przyciskach zakladki (taka ikona z 4 przyciskami)), sprawdz ile ma to trojkatow i przyznaj sie oki? :)) tu dolaczylem widok siatki ktora chwile temu zrobilem (przyjrzyj sie ILE tam jest linii/trojkatow!) . Odrazu tez wysylam Modemowa wersje tej bulawy na edysk...

BIGos [ bigos?! ale głupie ]
Ogólnie to ba buława miała być tylko jako test umiejętności... Użyłem standardowych figur, i tyle, kilka klinięć, wybranie jakiejś pierwszej z brzegu tekstury i mała próba... Polygon Count jeszcze nie znalazłem, ale sam się zoirentowałem że cosik za dużo tam będzie trójkątków :) Wiadomo po zobaczeniu siatki nawet tego nie wrzucałem. Ew. mogę wrzucić tylko pamiętaj ze to moja pierwsza praca :) i jeszcze jedno - tą siatkę zrobiłes za pomocą narzędzia line? no to ja bym poprosił o jakiś opis tego narzędzi bo kompletnie nie kumam jak się nim posłużyć (a widziałem w tutorialach całkiem ładne obiekty wykonane właśnie linem. No, to się zabieram za szukanie polygon counta i nie omieszkam się pochwalić ile to moja pierwsza praca ich ma (wszak wiadomo że im wiecej trójkatków tym praca lepsza bo bardziej szczegółowa :) ) A na 8.45 do szkoły... :) P.S. pisz jak najwięcej "zjebek"! W sumie najwiecej o tym co robie wiem właśnie ze zjebek i bardzo mi się to podoba :) Z harcerskim pozdrowieniem
BIGos [ bigos?! ale głupie ]
o... znalazłem.. no więc.. A nie będziesz sie śmiał? no to 4632 i to bez wszystkich bolców. razem z nimi (leżą pokopiowane na boku :)) jakieś 6500. LoL, przeeesadziłem :)

Marx [ Legionista ]
Jezusicku wy mu wicie że to zjebka a ja nawet nie wiem jak trójkocik zrobic hehe

BIGos [ bigos?! ale głupie ]
ty się za mapę weź :)

Quetzalcoatl [ Konsul ]
6500?? różowo ;) zrobilem na poczatku kilka obiektow: walec ('dokladnosc' podstawy:5 lub6) kula ('dokladnosc': 5) oraz jeden kolec, czyli mały Prism teraz ustawilem walec pionowo, wybralem kule, wybralem narzedzie Align, potem klik na walec, (align=wyrownaj do...<walca>) zaznaczylem XorazY oraz center/center aby kula wycentrowala sie na walcu (środek do środka), potem align na kuli do walca z opcją Z:minimum/maximum -teraz kula jest na czubku walca, potem troche kulke obnizylem tak aby obejmowala walec. teraz kolce: ten sam zespol 2 alignow aby kolec dac na czubku kulki. (ZAZNACZ KOLEC) teraz trzeba zmienic srodek obrotu kolca - ze srodkowego panelu wybierz AFFECT PIVOT ONLY potem ALIGN do KULI z opcjami XYZ center/center klik OK i wylacz AFFECT PIVOT. osie XYZ w viewporcie przesuna sie na srodek kuli. teraz wybierz rotacje wg. X lub Y i trzymajac shift obroc tak o 1/5 obwodu kuli - otworzy sie okno kopiowania - wybierz 4 kopie. Utworza one taki łuk wokól kuli - ale ta kula nie jest dokladna i beda one wystawac. Bawiac sie przesuwaniem i rotacjami podosuwaj je ładnie do kuli tak aby lekko w nia weszly i zeby nie bylo widac ich podstaw bylo. teraz masz tylko jeden rzadek kolcow. zaznacz je wszystkie, potem shift i obrot o 1/5 wg osi Z. znow otworzy sie kopiowanie - daj znow 4. nowe kolce otocza kulke juz ładniej, bo pierwowzory byly ustalone. Niestety na czubku pewnie bedziesz mial w jednym miejscu kilka kolcow - wywal je i zostaw jeden. teraz czas na konczenie - zaznacz raczke, wybierz CREATE/COMPOUND->Boolean i zaznacz Union. Z opcja MOVE kliknij na PICK OPERAND B kliknij na kuli. Potem Boolean/MOVE/operandB i klik na kolcu, Boolean/MOVE/operandB i klik na kolcu, Boolean/MOVE/operandB i klik na kolcu, itd itd az wszystkie kolce podolaczasz. Po tej ostatniej serii wszystko bedzie jedna wielka siatka, bedzie jeden obiekt, niepotrzebne trojkaty i punkty Boolean usuwa automatycznie, zas gdy jakies sa potrzebne do polaczenia - dodaje je. W mojej buławie jest jeszcze taka skorzana obejma/chwytak na dole - to poprostu 2 szerokie plaskie cylindry i jeden dluzszy cienszy (ale grubszy troche od pałki) ustawione ALIGNEM center/center na pałke i poustawiane wg. osi Z odpowiednio. No i potem zUnionowane Booleanem :) #that's all :)
Quetzalcoatl [ Konsul ]
a jesli chcesz sie naprawde podszkolic sam w maxie polecam Helpa - wbrew pozorom duzo tam jest opisane. ah, i szczerze polecam ksiazke HELIONa "3dsmax w praktyce" TYLKO te, reszta z serii to powtorki. sam sie z tego uczylem i szczerze mowiac jak juz ja kupilem to 50% juz wiedzialem co pisali, ale pisali dosc wyraziście i prosto. naprawde polecam... o, albo odkup od kogos - taniej ci wyjdzie ;) PS. import w edytorze plików .3ds na pewno bedzie bo mi kumpel zalatwil kawalek importera - wystarczy go nagiac do mojego formatui juz siatki sie bedzie dalo zaimportowac. Materialow - nie.

BIGos [ bigos?! ale głupie ]
jak w moim gmaxie mogę zapisywać tylko w plikach gmax, ale kwestią czasu jest "załatwienie" sobie czy de esa :) ale jesli nie porzuciłeś pomysłu prościutkiego edytora 3d/teksturera w samym programie, to luzik guzik, bedzie kul :) i WIELKIE dzięki za kurs, przyda się BARDZO! Co do książki to zessam sobie z otchłani netu, jeśli oczywiście znajdę, ale z tym nie powinien byc kłopot... Wiesz co? Nie mogę się doczekać kiedy wyjdzie pierwsza uruchmialna beta alfy :) Come get some! :)

BIGos [ bigos?! ale głupie ]
w sumie zrobiłem tą maczuge wg intstrukcji ale nie mogę się chyba pozbyć nawyku 'wielopolygonowego' bo wyszło jakieś 1700 :) zaraz wrzucę na edysk tą buławkę, przy okazji ściągnę sobie mapkę + tą twoją macke(obadnieeeemy :) pozdr. May the force of rotfl'n'lol be with ya

Marx [ Legionista ]
Łeeeeeeeeeeee gdyby nie ta cholerna szkoła mapa była by skończona a tak musze z tego zrezygnować przykro mi nara wam koledzy i koleżanki...

BIGos [ bigos?! ale głupie ]
a nie mówiłem... następnym razem nie bierz się do czegoś czego nie skończysz... odechciało mu się...
Quetzalcoatl [ Konsul ]
Eee sorry ze mnie nie bylo :: przypomnialem sobie ze mam D2:LOD na dysku :P Dzieki temu tez zapomnialem o kopiowaniu mapy :3 ale jutro od rana wracam do roboty. zaraz tyz spojrze na twoje robotki...
Quetzalcoatl [ Konsul ]
Ooo kolejny odpadł ;)) a teraz wszyscy na melodię "Autobiografii" (chyba Perfektu..): [melodia ze słów "Mialem dziesiec lat..."] "Mial on swietny plan gdy tu pukal do tych bram lecz zbyt szybko znudzil sie... Chcialoby sie wejsc, wnet nam wszystkie mozgi zjesc lecz na razie poszedl precz... [teraz fragment "Stu różnych ról/czym ugasić mój ból"] Setki tych bzdur, wiele dziw i słów wór oddajemy Ci wiec jako cześć Abyś już tu Nigdy nie wrócił tu Dziękuję Ci [ostatnia zwrotka z melodii "W hotelu fan mowi na taśmie mam.."] W hotelu fan mówi 'Na taśmie mam Jak go kiedyś wylali na pysk' W pokoju tam, Pośród tych czterech ścian Nie kwikniesz nic...." Dziekuje za uwagę, jeśli uważacie to za dobry HymnPożegnalny to dziekuję, jeśli nie - sprobujcie sami cos mu ułożyć :))

Quetzalcoatl [ Konsul ]
[<<< zapomnialem o znaczku]

BIGos [ bigos?! ale głupie ]
D2:LOD powiadasz? a jakie konto? od razu cie do friendów dodam :) jakby co to wal na GG i idziemy na krowy :)

Quetzalcoatl [ Konsul ]
nie dodasz, ani nie pojdziemy bo moj CD-KEY nie dziala - chyba sie domyslasz dlaczego? :)))

Quetzalcoatl [ Konsul ]
###uwaga dlugi ale wazny post### oki, czas troche pomowic o tym, w jaki sposob napisane sa/beda pliki swiata. czas jest teraz mimo iz nie wszystko jeszcze gotowe, gdyz musze sie od was paru waznych rzeczy dowiedziec, dot. co mozecie za instrukcji potrzebowac przy danej strukturze jezyka... zakladam ze juz orientujecie sie minimalnie w skladni C++... generalna zasady: w C++ mozna definiowac sobie struktury/klasy/nowe_typy_danych - tutaj nie w C++ mozna przeciazac funkcje - tutaj nie w C++ mozna zmieniac_dzialanie/przeciazac operatory - tutaj nie w C++ istnieja wskazniki i referencje - tutaj nie. Co prawda referencyjne argumenty funkcji sa. w C++ w jednym pliku .cpp czy .hpp mozna bylo sobie zdefiniowac i okreslic dowolna liczbe obiektow - tutaj rzadzi zasada "jeden plik = jeden obiekt" innymi slowy kazdy obiekt ma swoj wlasny plik, oraz w danym pliku nie da rady zmiescic 2 lub wiecej obiektow. Co rozumiemy przez Obiekt? - obiekt to nic innego jak z gory ustawiona klasa C++, domyslnie polaczona z 3 plikami zrodlowymi np. objekt.c, objekt.o, objekt.m, zawierajaca 4 wazne rzeczy: PamiecDanych,PamiecProgramu,PamiecProgramówFunkcji oraz PamiecSiatki. Do wszystkich 4 ma sie posredni dostep. 1) objekt.c - tam trzyma sie caly kod SC tworzonego Obiektu. Jezyk SC jest strasznie podobny do C++, ale nie posiada wiekszosci standardowych funkcji (zamiast tego ma wlasne specyficzne). Jak mówi zasada 1' nie deklarujemy klas ani struktur. Kazda ~luzna~ zmienna, ktora w C++ stalaby sie zmienna globalna, tutaj staje sie zmienna wewnetrzna opisanego obiektu. Podobnie kazda funkcja zadeklarowana a'la ~C-globalna~ jest traktowana jako funkcja wewnetrzna obiektu. [wewnetrzna, czyli nie widoczna przez programy innych objektow]. Proces kompilacji ustawia odpowiednio zarowno PamiecDanych, PamiecProgramu jak i PamiecPFunkcji. Moze tez ustawiac PamiecSiatki. 2) objekt.o - ten plik to wynik kompilacji pliku objekt.c. Stara wersja silnika 'w locie' analizowala zapis z obiekt.c i od razu go wykonywala, byla wiec faktycznie interpreterem C++. I niestety miala jego wade - byla bardzo wolna. Terez najpierw sie objekt.c analizuje, wynik zapisuje do obiekt.o i dopiero wykonuje zapis z obiekt.o. Po kompilacji obiekt.c juz wlasciwie nie jest potrzebny, co najwyzej jako kopia bezpieczenstwa. 3) obiekt.m - ten plik jako jedyny moze nieistniec, a obiekt i tak bedzie dzialac. Plik ten przechowuje dane o siatce 3d i zwykle bedzie w calosci przygotowywany przez edytor. Jesli nie - mozna te dane wprowadzic recznie w pliku obiekt.c poprostu definiujac odpowiednio odpowiednie zmienne. (tyle ze to bedzie niezla jazda, np. wprowadzic 300 vertexow, kazdy ma 6 charakterystyk, potem N scian na nich zbudowanych (3 wartosci), nie mowiac o danych tekstur, materialow itd :) ). Albo tez moze ich w ogole nie byc. O tym potem. Albo juz teraz... 1) struktury Wspomnialem ze nie ma klas i nie ma struktur - ale w koncu czasem sa potrzebne jakies struktury danych, zeby nie ~lezalo~ tak wszystko luzem.. wtedy wlasnie wystarczy napisac taka strukture (:P) jako zwylky obiekt ...bez funkcji i bez grafiki. np. " int Temp; string Ciag; " i koniec pliku dajmy na to Temp.c . I juz mamy ~pojemnik~ na nasze dane, dzialajacy jak struktury typu "struct Temp int Temp; string Ciag; ;" 2) klasy Hmm. Domyslacie sie juz? Pewnie tak :) Otoz czymze jest klasa jak nie struktura z funkcjami? Chcac miec klase, nie piszemy "class Cos int Funkcja(int Arg, float Arg2); int BleBle;; int Cos::Funkcja(int Arg,float Arg2) return Arg+(int)Arg2;" tylko tworzymy plik Cos.o zawierajacy "int Funkcja(int Arg, float Arg2) return Arg+int(Arg2); int BleBle;" zwroccie uwage na 2 roznice - 1' omijamy wstepna deklaracje funkcji - deklaracji w ogole nie ma, 2' konwersja w C++ to (int)arg zas tutaj mamy int(arg), poprostu ulatwilem sobie zycie ;) innymi slowy - Obiekt to obiekt, dajacy sie wyswietlic. - Klasa to obiekt, ale niewidoczny dla gracza nigdy. - Struktura to tez obiekt, ale ani nie widoczny, ani nie wykonujacy nic. Jako ze z zalozenia nie istnieje Klasy/Struktury typu C++, nie istnieja rowniez operatory dostepu z ktorych one korzystaly: "->" oraz "." Ich role przy odczycie przejmuje funkcja "(?) call_other(object Obj, string Name, (?) arg, (?)arg, (?)arg...); " przy czym (?) mozne byc zarowno typem int,float,char,string jak i object, zas przy zapisie trzeba napisac sobie funkcje dostepowa, jak dla zmiennych private w klasach. Jak to dziala? Wyjasnie najpierw na zmiennych: kod w C++: [gdzies deklarujemy co nastepuje:] struct Cos int Dane; char*Ciag; ; [a gdzieindziej dajemy:] struct Cos; Cos x; x.Dane=1;strcpy(x.Ciag, "cokolwiek"); Wyswietl(x.Ciag); a u nas to wyglada tak: [tworzymy plik Cos.c :] int Dane; string Ciag; int UstawDane(int arg) Dane=arg; int UstawCiag(string arg) Ciag=arg; string PobierzCiag() return Ciag; [EOF] [i w innym pliku uzywamy struktury poprzez:] Object x=clone_object("Cos"); call_other( x , "UstawDane", 1); call_other( x , "UstawCiag", "cokolwiek"); Wyswietl( call_other(x, "PobierzCiag") ); //* takie samo dzialanie Wyswietl( call_other(x, "Ciag") ); //* takie samo dzialanie A wiec: call_other generalnie wywoluje funkcje z innego obiektu z argumentami lub bez nich i zwraca jej wynik. moze jednak tez wywolywac zmienna bez argumentow i wtedy zwraca jej wartosc. call_other nie wykonuje dzialan. Nie mozna wiec napisac "call_other( x , "Dane=1;"); " gdyz... otrzymamy blad "Nieprawidlowa nazwa zmiennej lub funkcji." jakoze w miejscu na nazwe pojawia sie znak-nie-alfanumeryk czyli '=' i ';' call_other SPRAWDZA co za zmienna/funkcje wywolujemy. I teraz: "Wyswietl(string)" wyrzuci blad dla instrukcji "Wyswietl( call_other(x, "Dane") );" gdyz call_other zwroci int a nie string. Jezeli funkcja/zmienna wywolywana nie istnieje call_other zwraca wartosc char rowna zeru, ktora ulega bezblednie konwersji do wszystkich typow. A wiec jesli wywolamy funkcje a potem wstawimy jej wynik do zmiennej np. int - i okaze sie ze funkcja nie istnieje - bledu nie bedzie, zas zmienna ustawi sie na zero. Jesli chcielibysmy zas pobrac poprzez nieistniejaca funkcje jakis obiekt i umiescic jego ID w zmiennej object to zmienna ta tez przyjmie wartosc zero, czyli <ID obiektu nieistniejacego>. Obiekty jak juz zauwazyliscie tworzy sie deklaracja i wypelnia funkcja, a nie sama deklaracja. Zamiast "Cos x;" trzeba napisac "Object x=clone_object("Cos");" przyczym "Cos" jest tu nazwa pliku obiektu BEZ rozszerzenia. [ Program sam wybierze czy skompiluje Cos.c od nowa czy skorzysta z gotowego Cos.o ] Wynika to z tad, ze jak juz wspomnialem typ Object to pewna klasa C++ ktora nie ma w sobie nic i dzieki temu moze miec w sobie wszystko ...ale trzeba to 'wszystko' najpierw wczytac z pliku :) I to by wlasciwie bylo na tyle. Nie mowie oczywiscie o funkcjach innych, jak call_out (wywolanie fkcji po x sekundach) bo oczywiscie jest ich troche jeszcze, ale mowie o roznicach miedzy SC a C++. Warto jeszcze wspomniec o tym ze najprawdopodobniej nie bedzie inicjalizacji agregatowych typu: " int Cos[3][4]= 0,0,0,0, 1,1,1,1, 2,2,2,2, ; gdyz ich kompilacja analiza jak na razie mnie poprostu przeraza zlozonoscia swa. Niebedzie rowniez zmiennych dynamicznych typu: " int*Cos; Cos=new int[50];" poniewaz poprostu nie ma pointerow (wskaznikow) ani int* ani zadnych... Oraz swego rodzaju nowosci w swiecie C++ - albo jak kto woli "substytucie zmiennych dynamicznych" - pseudo-dynamiczne ( PD- ) zmienne i ...funkcje. Otoz beda 4 specjalne funkcje: instert_variable(object Obj, string nazwa, char typ, char Nind, int I1, int I2, int I3... ); instert_function(object Obj, string nazwa, string plik); remove_variable(object Obj, string nazwa, char tryb); remove_function(object Obj, string nazwa, char tryb); Obydwie z nich dzialaja na obiekcie podanym, pierwsza dodaje zmienna o nazwie "nazwa", typie o kodzie "typ" (1-int,2-float, 3-char, 4-string, 5-object), oraz jesli to ma byc tablicowa zmienna to trzeba podac numer indeksów Nind, oraz te indeksy kolejno. Czyli chca dodac do obiektu zmienna float X[2][3][4][5] piszemy instert_variable(Obj,"X",2 /*typ*/ ,3 /*ilosc*/, 2, 3, 4,5); z kolei druga funkcja dodaje do obiektu Obj funkcje o nazwie "nazwa" zdefiniowana w pliku "plik". jesli nazwy pliku sie nie poda, to program szuka wskazanej funkcji w aktualnym obiekcie. remove_ obie funkcje usuwaja zmienna/funkcje z obiektu i w obu argument tryb nie jest wymagany. Zmienna/funkcja MUSI byc wczesniej oznaczona jako dodana! Nie mozna skasowac zmiennej/funkcji ktora wzieta byla z macierzystego pliku, a przynajmniej nie powinno sie tego robic. Jesli juz koniecznie w krytycznym przypadku trzeba - to do tego sluzy arg. "tryb" - jesli ma wartosc '1' to znaczy ze wiemy co robimy i program ma rzeczywiscie ~na chama~ skasowac te zmienna/funkcje. A po co tak w ogole te cztery funkcje? A po to zeby moc np. podczas walki jakis np. sztylet mogl dodac atakowanemu zmienna "Poison" zliczajaca punkty trucizny i funkcje "Poison_kill" zabijajaca gdy "Poison" dojdzie do np. 30, no i np. by po walce je usunac kompletnie... Jasne - przeciez obiekt gracza moze juz miec z gory wbudowana ta funkcje i zmienna, ale jezeli w trakcie juz dzialania serwera napiszesz nowa bron, ktora ma calkiem nowy efekt - np. czasowego paralizu - to przeciez mozesz zmienic plik Player.c aby zawieral nowa zmienna "int Paralyze_Time_Left;" i nastepne obiekty graczy juz beda ja mialy ....ale co z tymi co juz graja?? zastopujesz ich, rozlaczysz, stworzysz ich obiektu od nowa i skopiujesz ich dane/ekwipunki itd. do nowych obiektow?? e-e chyba lepiej im te funkcje/zmienna dodac w locie :) Oki, mam nadzieje ze to wszystko tutaj polaczone z wasza wiedza - jesli ja macie - o C++ juz wstepnie pozwoli wam sie zastanowic "jak powiniem/moze/musi wygaldac kod waszych obiektow". Jak zwykle jesli macie jakies pytania - problemy - jesli napisaliscie jakis kawalek kodu i nie jestescie pewni czy bedzie dzialac tak jak myslicie to wyslijcie mi je (lub to). Moze i sam program nie jest jeszcze na dostepny, ale zarowno ja, jak i jezyk SC sa w pelni na chodzie :) U mnie :))) ###uwaga dlugi ale wazny post###
Quetzalcoatl [ Konsul ]
1) sorry za literowki w stylu 'wygaldac' zamiast 'wygladac' 2) fiuuu cale 10.1kB tekstu mi sie napisalo... 3) kopia postu jest tez na edysku, jakbyscie chcieli miec a nie chcialoby wam sie kopiuj/wklej robic... 4) BIGos -> nie zapisuj do .gmax bo moj 3DSMAX4 tego nie rusza raczej EXPORT'uj do pliku .3ds - takie 3ds4 napewno zlapie, a i moj prog tylko takie bedzie przyjmowal...
BIGos [ bigos?! ale głupie ]
10 kb ! wow gratz :) więc ja moze omówie co zrozumiałem (będzie krócej :)) : do opisu jednego obiektu (rzeczy, gracza) będą uzywane 3 pliki i tylko w rozszerzeniach tych 3 plików bedzie można zapisywac dane. OK początek mam :) uwagi co do pliczków: można by było jakoś zawrzeć autmatyczne usuwanie objekt.c po stworzeniu objekt.o (chyba że to nie jednorazowo będzie edytowane, tylko nie denerwuj się że czegoś nie kumam bo się zatrzymałem w c++ w miejscu w którym nie chciało mi zadziałać głupie hello world :)) struktury i klasy: nie zrozumiałem nic, chińszczyzna :) "innymi slowy - Obiekt to obiekt, dajacy sie wyswietlic. - Klasa to obiekt, ale niewidoczny dla gracza nigdy. - Struktura to tez obiekt, ale ani nie widoczny, ani nie wykonujacy nic. " Chyba że to ma podobne znaczenie, wtedy rozumiem :) Co do kawałków kodu to troszkę kumam, ale nie wiem tylko co on robi :) wyjasnienia call_other dla mnie mogłoby nie byc bo i tak nic z tego nie rozumiem :)) 4 specjalne funkcje zrozumiałem i nie wiem jak je zrobiłes ale obmyślone świetnie :) next - skoro SC już chodzi to co stoi na przeszkodzie zbudować lokację wstępną, tzn zwykły kawałek ziemi? skoro kopia jest na edysku to ściągne to sobie o przy okazji nauki c++ i bedę po kolei sprzwdzał "czy już coś kumam" Zapis w gmax - ja w gmaxie exportować nie mogę do żadnego formatu - file/export i file/export selcted są nieaktywne :(( musze czekać aż sobie załatwię 3ds pozdr.

Aurelius [ Konsul ]
niezli jestescie, szkoda ze Wam pomoc nie moge, bo sie nie znam ani na grafie, ani na muzie, ani pisaniu programow... POWODZENIA :-)
mORfeOoSH [ NULL ]
piszcie, piszcie, fajnie sie czyta...:D
Quetzalcoatl [ Konsul ]
miodzio doslownie ;) wyglada na to ze bede musial wyjasnic wszystko lopatologicznie, z obrazkami :) zajmie mi to jakis dzien lub trzy... tymczasem juz teraz moge ci powiedziec ze pliki .c NIE moga zostac skasowane, poniewaz jak np. po zrobieniu obiektu i odpaleniu go TY nagle przypomnisz sobie ze 'a tam jeszcze cos mialem dac' to co? bedziesz rozgryzal skompilowany plik w stylu |03|19|01|00|00|00|00|04|03|05| czy tez wolalbys jednak miec taki .c w ktorym bedzie napisane "x=5;" ? (ten ciag cyfr to ta wlasnie instrukcja po przerobieniu ...) Morf->tia, na pewno :)))

BIGos [ bigos?! ale głupie ]
tłumacz, tylko pamiętaj że jeden obrazek na jeden post :) i pamiętaj - ja NAPRAWDĘ chce wiedziec co znaczy kazda linijka kodu :) i weź po uwagę że jestem 'głęboko niepełnoletni' :) morf - czytaj, może tez się czegoś nauczysz? :)
Quetzalcoatl [ Konsul ]
dobra, obrazek z lewej jest zipem - zapiszcie go sobie i zmiencie nazwe, bo nie bede na forum wklejał 15 stron textu :)

Quetzalcoatl [ Konsul ]
oki, z obrazko-zipem nie wyszlo... tak wiec dalej macie tone tekstu do poczytania, kopia jak zawsze na edysku :) ###uwaga dlugi ale wazny post### oki, czas troche pomowic o tym, w jaki sposob napisane sa/beda pliki swiata, przyczym pisze mam nadzieje dosc opisowo. zakladam juz ze NIE orientujecie sie nawet minimalnie w skladni C++, wiec nie bede omawial roznic pomiedzy C++ a SC a jedynie opisywal SC. jesli gdziekolwiek teoretycznie pomylę określenia (nazwy): deklaracja, implementacja, definicja itd. to nalezy to olac - pisze tak aby ludzie latwiej zakapowali wiec nie mam zamiaru nikogo zarzucac niepotrzebnymi terminami, chpcby tymi postawowymi :) //********************************************************************************* legenda+generalne info: SPECTRA lub spectra + odmiany rzeczownika - nazwa silnika gry <...> - oznaczenie "tu trzeba wstawic ..." ; - konczy KAZDA linie programu // - oznacza komentarz, od "//" az do konca linii (enteru/returnu) /* - poczatek komentarza */ - koniec komentarza //********************************************************************************* 1) W czym pisac i jak pisac. Pisac program mozna w dowolnym edytorze tekstu Word, Notepad, Vi, lub jakimkolwiek innym programie ktory potrafi zapisywac niesformatowany tekst. Chodzi tylko o to aby w pliku nie bylo zadnych smieci opisujacych czy tu ma byc kursywa, czcionka Times, rozmiar czcionki 60pkt itd. Pisac mozecie praktycznie w dowolnej szacie graficznej (na razie nie wnikajcie w sens linijek) np: int x; x=0; lub tak: int x;x=0; albo tak: int x ; x = 0 ; ostatni przyklad rowniez jest w pelni poprawny, ale jak widzicie kompletnie nieczytelny. Dla spectry wiekszosc bialych znakow (spacje, tabulatory etc) jest nieistotna i i tak bedzie wycieta. 2) Pliki. Spectra moze przyjac kazdy plik zawierajacy jakiekolwiek dane, jednak ponownie dla przejrzystosci przyjmujemy iż programy umieszczane sa w plikach o rozszerzeniu ".c", zas pliki zawierające dane o grafice - ".m". 3) Typy zmiennych. Jest jak na razie 5 podstawowych typow zmiennych, kolejno: char, int, float, string, object. char - jest to liczba calkowita z zakresu -128...127. Konce zakresu sa se soba 'sklejone' tak wiec jesli do zmiennej char zawierajacej liczbe 127 dodamy jeden - otrzymamy -128. Jesi chcecie wiedziec czemu tak jest poczytajcie o systemie dwojkowym i wezcie pod uwage ze typ char ma tylko 8 bitow (1 bajt). Typ char oprocz przechowywania liczb moze tez przechowywac znaki - nalezy taki znak wtedy oznaczac apostrofami np. 'a', '#' itd. Jak na razie typ bool nie istnieje, więc jest zastępowany typem char. Tak więc wartość char równa zero jest odpowiednikiem bool'owemu zeru czyli Fałszu, zaś dowolna niezerowa wartość char odpowiada bool'owej jedynce czyli Prawdzie. int - liczba calkowita z zakresu -2,147,483,648 do 2,147,483,647. Ja rowniez mozna 'przekrecic' podobnie jak typ char, lecz wymaga to wiekszych liczb - int zajmuje 32bity (4 bajty). float - liczba rzeczywista z zakresów od -3.4*10 ^ 38 do -3.4*10 ^ (-38) lub od 3.4*10 ^ (-38) do 3.4*10 ^ 38. Zwroccie uwage na ograniczenie w wykladnikach. Komentarza tez wymaga fakt, ze typ ten przechowuje jedynie 7 pierwszych cyfr liczby - dalsze sa tracone. Tak wiec nie dziwcie sie gdy dodajac jeden do zmiennej float zawierajacej 1*10^9 otrzymacie 1*10^9 bez owej jedynki na koncu. string - jest to ciag znakow o dlugosci teoretycznie nieograniczonej, lacznie z brakiem znakow. O ile pojedyncze znaki bralismy w apostrofy, ciagi znakow nalezy ujac w cudzyslow np. "aaa", "tata". Jest tak ze wzgledu na to iz ciagi moga zawierac jeden znak - "a" - i bylyby nie do odroznienia od pojedynczych znakow char 'a'. Ciag pusty czyli nie zawierajacy zadnych znakow oznacza sie poprzez "". object - jest to jedyny typ nie zawierajacy zadnej wartosci sensownej dla was - przechowuje on jedynie identyfikator (numer) obiektu uzywanego przez program. Czesto bedzie sie dalej mowic o "zmiennych zawierajacych obiekt" jednakze w rzeczywistosci beda one zawierac tylko jego numer. Jako ze numery sa 32bitowe maksymalna liczba obiektow w grze to 4,294,967,296. Przy aktualnej mocy komputerow PC raczej nie starajmy sie jej osiagac. Te typy zmiennych sa tak podstawowe, iz ich brak uniemozliwilby sensowne dzialanie spectry. Beda pozniej dodane takze inne typy, jednak z racji ze nie sa one krytyczne nie beda z poczatku aktywne. Byc moze okaza sie w ogolen nie potrzebne. 4) Deklaracja zmiennych. Jest bardzo prosta - wystarczy zanim sie zmiennej zacznie uzywac napisac: <typ zmiennej> <nazwa zmiennej>; np.: int x ; float F; object Coś; Spectra odroznia duze i male znaki tak wiec deklarujac zmienna o nazwie Coś nie bedziemy mogli uzywac nazw coś, coŚ, itd. Jak łatwo mozecie sie domyślic nie mozna zadeklarowac juz raz określonej nazwy. Ciąg instrukcji: int x; float x; wywola blad. Podobnie tez otrzymacie blad jesli sprobujecie wykorzystac nazwe zmiennej nie zadeklarowanej wczesniej. Mozna rowniez deklarowac tablice: int x[6]; //tworzymy tablice z 6 wartosci typu int, o numeraz\ch od 0 do 5 float z[2][4]; //tworzymy tablice 2 na 4 wartosci typu float o numerach [0..1][0..3] int X[0]; //błąd, tablica nie moze miec zero elementów Po ustawieniu tablicy mozemy "wziąć" z niej poszczególny element w ten sposób: x[0]; x[1]; z[5]; z[1][3]; ale: x[6];x[7]; z[2][1]; wywołają błędy, gdyz wprowadziliśmy numery indeksów większe niż te ktore zadeklarowaliśmy! przy "z[2][1]" pierwszy indeks jest za duzy i to wystarcza, zas przy "x" to chyba widać od razu. Uważać tu trzeba, gdyż maksymalny indeks ktorego możecie uzyć jest zawsze o jeden mniejszy niz zadeklarowany! 5) Funkcje. Jak kazdy przyzwoity jezyk programowania, SC pozwala rowniez na deklaracje funkcji. Wyglada to tak: <typ w.z. lub void> <nazwa funkcji>( <typ argumentu1> <nazwa zmiennej arg.1> , <typ argumentu2> <nazwa zmiennej arg.2>, .....) //otwieramy klamre //tutaj umieszczamy program funkcji //i zamykamy klamrą program funkcji usi byc objety klamra, inaczej funkcja go nie wykona. W deklaracji funkcji musimy jednoznacznie okreslic jaki typ wyniku bedzie ona zwracać - czy to bedzie char, int itd. - lub mozemy okreslic ze nie bedzie ona dawala zadnego wyniku z powrotem podajac za typ w.z. (wartosci zwracanej) "void". Do funkcji mozemy rowniez przekazac pewne dane - tzw. argumenty funkcji - jednak rowniez trzeba okreslic jakiego typu one beda. Dodatkowo nalezy jeszcze podac pod jaka nazwa zmiennej beda owe wartosci argumentow przechowywane np: void UstawPktŻycia(int HP) (...) spowoduje utworzenie funkcji o nazwie UstawPktŻycia, nic nie zwracajacej, pobierajacej jedną wartość typu int i umieszczającej ją w zmiennej int o nazwie HP. Funkcje wywoluje się zapisem: <nazwa funkcji>( <arg1> , <arg2> , .....); np.: UstawPktŻycia( 500 ); //wywoła funkcję UstawPktŻycia, ktora otrzyma wartosc 500 i wstawi ja do swojej zmiennej HP // (patrz deklaracja) Oczywiście typ argumentów i ich kolejność muszą się zgadzac z tymi okresonymi w deklaracji. Jesli typy sie nie beda zgadzac otrzymacie blad. Jesli typy beda sie zgadzac a jedynie wy przypadkiem zamienicie miejscami dane - macie problem. Np.: float WykonajPotęgę(float Podstawa, float Wykładnik) ............. a wy podacie: WykonajPotęgę( 2.0 , 2.45 ); majac na mysli podniesienie liczby 2.45 do kwadratu to oczywiscie program tego nie wychwyci - w koncu typy sie zgadzają, a spectra nie czyta jeszcze w myslach. 6) Do tej pory kod programy funkcji kropkowalem albo inaczej wycinałem, ponieważ nie znaliśmy właściwie zadnych działan. Czas to teraz zmienić. Wykonaniem podstawowych działań zajmują się tzw. operatory, pełną listę macie poniżej: +, -, *, /, %, @, ^, =, +=, -=, *=, /=, %=, @=, ^=, ==, !=, <, <=, >, >=, !, &&, ||, ++, --, oraz specjalne funkcje (glownie trygonometryczne) sprawujace podobne do operatorow zadania, wszystkie zwracajace jedynie zmienne typu float: log(), ln(), sin(), SIN(), asin(), ASIN(), cos(), COS(), acos(), ACOS(), tan(), TAN(), atan(), ATAN(), ctg(), CTG(), actg(), ACTG() Generalnie operatory pozwalają na działania tylko na 2 takich samych typach! Nie mozna normalnie np. dodac wartosci int do wartosci float, poniewaz jedna jest całkowita, a druga zmiennoprzecinkowa, w dodatku mają kompletnie inne zakresy! Skrocony opis dzilania i składni, według priorytetu wykonywania, od "najszybszych" do "najwolniejszych": (operator o wiekszym prio wykonany zostanie najpierw, np. 2+2*3 da wynik 8 a nie 12) <nazwa zmiennej>++ Zwiekszenie wartosci zmiennej char, int, float o jeden. <nazwa zmiennej>-- Zmniejszenie wartosci zmiennej char, int, float o jeden. !<wyrazenieLog> Negacja logiczna wartosci wyrazenia. Jesli wyrazenie bylo prawdą (lub mialo wartosc różną od zera) zwraca fałsz (zero) i na odwrot. -<wartosc> Zmiana znaku wyrazenia, pot. negacja. Jesli wartosc byla dodatnia, wynikiem jest ujemna o tej samej wielkosci i na odwrot. +<wartosc> Wartosc bezwzgledna. Jesli wartosc jest dodatnia, zostaje zwrocona jako wynik, jesli jest ujemna, zostaje zwrocona jej wartosc bez znaku. <podstawa>^<wykladnik> Wykonuje działanie potegi, obowiązują oczywiście wszelkie matematyczne restrykcje. <wartosc>*<wartosc> Mnozy wartosci przez siebie. <wartosc>/<wartosc> Wykonuje dzielenie rzeczywiste podanych wartosci. Zwraca zwykle wartosc typu float. <wartosc>@<wartosc> Dzielenie całkowite. Zwraca zwykle wartosc typu int. <wartosc>%<wartosc> Zwraca resztę z dzielenia całkowitego 2 liczb. Przyjmuje jedynie liczby całkowite. Zwraca zwykle wartosc typu int. <wartosc>+<wartosc> Zgadnijcie. Wykonuje działanie dodawania 2 liczb. <wartosc>-<wartosc> Zwraca wynik odjęcia drugiej liczby od pierwszej. <wartosc1> < <wartosc2> Zwraca prawde (1) jesli wartosc1 jest mniejsza od wartosci2. W przeciwnym wypadku zwraca fałsz (0). <wartosc1> <= <wartosc2> Zwraca prawde (1) jesli wartosc1 jest mniejsza lub równa wartosci2. W przeciwnym wypadku zwraca fałsz (0). <wartosc1> > <wartosc2> Zwraca prawde (1) jesli wartosc1 jest większa od wartosci2. W przeciwnym wypadku zwraca fałsz (0). <wartosc1> >= <wartosc2> Zwraca prawde (1) jesli wartosc1 jestwiększa lub równa wartosci2. W przeciwnym wypadku zwraca fałsz (0). <wartosc1> == <wartosc2> [Podwójne "równa się"] Zwraca prawde (1) jesli wartosc1 jest równa wartosci2. W przeciwnym wypadku zwraca fałsz (0). <wartosc1> != <wartosc2> Zwraca prawde (1) jesli wartosc1 jest różna od wartosci2. W przeciwnym wypadku (są równe) zwraca fałsz (0). <wyrazenieLog>&&<wyrazenieLog> Zwraca prawde (1) jesli oba wyrazenia sa prawdą. W przeciwnym wypadku zwraca fałsz (0). <wyrazenieLog>||<wyrazenieLog> Zwraca prawde (1) jesli przynajmniej jedno z wyrażeń jest prawdą. W przeciwnym wypadku zwraca fałsz (0). <zmienna> = <wartosc> Wstawia wartosc do zmiennej. Zwraca zmienna. <zmienna> ^= <wartosc> Podnosi wartosc zmiennej do potegi o wykldniku 'wartosc' i wynik wstawia do z powrotem do zmiennej. Zwraca zmienna. [dzialanie: <z>=<z>^<w> ] <zmienna> *= <wartosc> Mnoży wartosc zmiennej przez 'wartosc' i wynik wstawia do z powrotem do zmiennej. Zwraca zmienna. [dzialanie: <z>=<z>*<w> ] <zmienna> /= <wartosc> Dzieli wartosc zmiennej przez 'wartosc' i wynik wstawia do z powrotem do zmiennej. Zwraca zmienna. [dzialanie: <z>=<z>/<w> ] Jako ze jest to dzielenie rzeczywiste, zmienna musi byc typu float. <zmienna> @= <wartosc> Dzieli wartosc zmiennej przez 'wartosc' i wynik wstawia do z powrotem do zmiennej. Zwraca zmienna. [dzialanie: <z>=<z>@<w> ] <zmienna> %= <wartosc> Dzieli wartosc zmiennej przez 'wartosc' i resztę wstawia do z powrotem do zmiennej. Zwraca zmienna. [dzialanie: <z>=<z>%<w> ] Jako ze całkowitej mowa o reszczie z dzielenia całkowitego, zarówno zmienna jak i wartosc musza byc typu char lub int. <zmienna> += <wartosc> Dodaje do wartosci zmiennej 'wartosc' i wynik wstawia do z powrotem do zmiennej. Zwraca zmienna. [dzialanie: <z>=<z>+<w> ] <zmienna> -= <wartosc> Odejmuje od wartosci zmiennej 'wartosc' i wynik wstawia do z powrotem do zmiennej. Zwraca zmienna. [dzialanie: <z>=<z>-<w> ] [Operatory, a wlasciwie funkcje ponizej sa traktowane jako normalne funkcje i sa wykonywane zawsze na poczatku.] log(<wartosc1>, <wartosc2>) Oblicza logarytm o podstawie wartosc1 z wartosci2. Restrykcje matematyczne obowiazuja. Zwraca zwykle wartosc float. ln(<wartosc>) Oblicza logarytm naturalny [ log(e,wartosc) ] z wartosci. Restrykcje matematyczne obowiazuja jak zawsze. Zwraca zwykle typ float sin(<wartosc>) Oblicza sinus z podanej wartosci. Wartosc podaje sie w radianach, a nie w stopniach. Zwraca zwykle float. SIN(<wartosc>) Pobiera sinus z podanej wartosci z wczesniej przygotowanej tablicy, zaokragla wartosc do 0.1 . Wartosc podaje sie w radianach, a nie w stopniach. Zwraca zwykle float. asin(<wartosc>) Oblicza arcussinus z podanej wartosci. Wartosc zwraca w radianach, a nie w stopniach. Restrykcje matematyczne obowiazują. Zwraca zwykle float. ASIN(<wartosc>) Pobiera arcussinus (obcięty do 1 miejsca po przecinku) z podanej wartosci z wczesniej przygotowanej tablicy. Restrykcje matematyczne obowiązują. Wartosc zwraca w radianach, a nie w stopniach. Zwraca zwykle float. cos(<wartosc>) Oblicza cosinus z podanej wartosci. Wartosc podaje sie w radianach, a nie w stopniach. Zwraca zwykle float. COS(<wartosc>) Pobiera cosinus z podanej wartosci (obciętej do 1 miejsca po przecinku) z wczesniej przygotowanej tablicy. Wartosc podaje sie w radianach, a nie w stopniach. Zwraca zwykle float. acos(<wartosc>) Oblicza arcuscosinus z podanej wartosci. Restrykcje matematyczne obowiązuja. Wartosc zwraca w radianach, a nie w stopniach. Zwraca zwykle float. ACOS(<wartosc>) Pobiera arcuscosinus (obcięty do 1 miejsca po przecinku) z podanej wartosci z wczesniej przygotowanej tablicy. Restrykcje matematyczne obowiązują. Wartosc zwraca w radianach, a nie w stopniach. Zwraca zwykle float. tan(<wartosc>) Oblicza tangens z podanej wartosci. Restrykcje matematyczne obowiązują. Wartosc podaje sie w radianach, a nie w stopniach. Zwraca zwykle float. TAN(<wartosc>) Pobiera tangens z podanej wartosci (obciętej do 1 miejsca po przecinku) z wczesniej przygotowanej tablicy. Restrykcje matematyczne obowiązują. Wartosc podaje sie w radianach, a nie w stopniach. Zwraca zwykle float. atan(<wartosc>) Oblicza arcustangens z podanej wartosci. Wartosc zwraca w radianach, a nie w stopniach. Zwraca zwykle float. ATAN(<wartosc>) Pobiera arcustangens (obcięty do 1 miejsca po przecinku) z podanej wartosci z wczesniej przygotowanej tablicy. Wartosc zwraca w radianach, a nie w stopniach. Zwraca zwykle float. ctg(<wartosc>) Oblicza cotangens z podanej wartosci. Restrykcje matematyczne obowiązują. Wartosc podaje sie w radianach, a nie w stopniach. Zwraca zwykle float. CTG(<warosc>) Pobiera cotangens z podanej wartosci (obciętej do 1 miejsca po przecinku) z wczesniej przygotowanej tablicy. Restrykcje matematyczne obowiązują. Wartosc podaje sie w radianach, a nie w stopniach. Zwraca zwykle float. actg(<wartosc>) Oblicza arcuscotangens z podanej wartosci. Wartosc zwraca w radianach, a nie w stopniach. Zwraca zwykle float. ACTG(<wartosc>) Pobiera arcuscotangens (obcięty do 1 miejsca po przecinku) z podanej wartosci z wczesniej przygotowanej tablicy. Wartosc zwraca w radianach, a nie w stopniach. Zwraca zwykle float. Przyczym poprzez ... rozumiemy: <zmienna> - nazwa zmiennej <wartosc> - nazwa zmiennej, 'gotowa' wartosc lub wyrazenie zwracające dozwoloną wartość <wyrazenieLog> - dowolne wyrazenie (zazwyczaj logiczne), jezeli pojawi sie tu zmienna, wartosc lub wyrazenie dajace wynik nie-logiczny to zostana one potraktowane nastepujaco: warosci nie zerowe i ciagi niepuste to Prawda, wartosci zerowe i ciagi puste to Fałsz 7) Przykłady. Jednym z najważniejszych operatorów jest przypisanie (inaczej wstanienie, podstawienie): int x; x=1; float z; z=2.5; float z2; z2=z; Od razu przy nim pojawia sie najczestszy blad, jako ze jest ciagle mylony z operatorem ==: a==b; //tu porownujemy wartosci a i b a=b; //tu wstawiamy wartosc b do zmiennej a Również błędna jest próba zadeklarowania zmiennej o pewnym typie ktory podałem wcześniej: void a; jest to typ wyjątkowy, przydatny jedynie w funkcjach, ale o nim potem. W kazdym badz razie nie mozna tworzyc zmiennych tego typu. Ważne jest również aby każdą nową zmienną wypełniać jakąś wartością, np: int x; x=0; int y; y=0; gdyz jesli tego nie zrobimy przy jednej lub wiecej zmiennych: int x; x=1; int y; int z; z = x + y; to efekt takiego np. dodawania bedzie dokładnie mówiąc kompletnie nie przewidywalny, bo zmienna y moze miec w sobie kompletnie losowe "śmieci"! Kolejne operacje zwykle nie musza byc rozbijane na małe fragmenty, prawidłowe są zapisy: int x=0; float z=2.5; float z2=z; jak i rowniez: x = 25 + 32; x = x * 8; jest tak samo poprawny jak zapis: (x = 25+32) *= 8; Wartosc zwracaną z wywołania funkcji czesto chcemy zachować lub od razu wykorzystać: int x=0; int Dodaj( int A, int B)......; x=Dodaj(10, 20); x=35+Dodaj(10, 20); 8) Czemu znowu zakomentowałem program funkcji? Proste. Bo funkcje nadal wymagają komentarza. Szerokiego niestety. Przede wszystkim funkcje uzywaja "specjalnego operatora" "return" ktory sluzy im do zakańczania się i zwracania jakiejś wartości. Zorientowani pewnie juz wiedzą że "return" nie jest operatorem a "słowem kluczowym", ale o nich później. I tak, ostatnio pojawiła się funkcja Dodaj(), no to ją uzupełnimy: int Dodaj( int A, int B ) int Suma = A+B; return Suma; Proste? Super.Oczywiście funkcja ta jest bliżej bezsensownym trawieniem zasobów spectry, jako ze wystarczyłoby użyć poprostu operatora '+' zamiast pisac funkcję, ale to przykład. Jak widzimy funkcja pobiera 2 wartosci typu int i umieszcza je w zmiennych int A i int B. Dlatego też późniejsza deklaracja "int Suma = A+B;" nie wywoła błędu - A i B zostały już niejako automatycznie zadeklarowane. Potem wartosc zmiennej Suma zostaje zwrocona poleceniem "return Suma;" i funkcja kończy się. Oczywiście funkcję lepiej już byłoby zapisać w ten sposób: int Dodaj( int A, int B ) return A+B; jako ze przy takim zapisie oszczedzamy pamiec - w koncu uzylismy jednej zmiennej mniej. Jak ta funkcja bedzie dzialac, juz zapewne domyslacie sie. Przy: int x=0; int Dodaj( int A, int B ) return A+B; x=Dodaj(10,20); utworzona zostanie zmienna x (wyzerowana), deklaracja funkcji zostanie (prawie) pomienięta, potem zostanie wywolana funkcja Dodaj(10,20), do jej zmiennych wewnetrznych zostana wstawione odpowiednio wartosci: int A=10; int B=20; potem wykona się operacja "return A+B;" powodując zwrócenie wartości - a jakże - 30, i na końcu ta właśnie wartość (30) zostanie wstawiona do zmiennej x. Oczywiscie mozemy za argumenty funkcji podawac nie tylko gotowe wartosci, ale rowniez i zmienne. Po wykonaniu: int x=0; int y=5; int z=10; int Dodaj( int A, int B ) return A+B; x=Dodaj(y, z); otrzymamy w zmiennej x wartosc 15, poniewaz do funkcji Dodaj() przekazaliśmy wartości zmiennych y i z zamiast liczb. Specjalnej uwagi wygama stwierdzenie "przekazaliśmy wartości zmiennych". Jeszcze raz - Do funkcji nie przekazalismy samych zmiennych, ale ich wartosci. Oznacza to ze jezeli napiszemy program (dla ulatwienia oznacze z boku znaczace linijki): int x = 1 ; int y = 4; int z = 0; int Funkcja( int A, int B ) 1: A=40; 2: B=50: return A+B; 3: z = Funkcja( x, y ); to przy wywolaniu w (3) funkcji Funkcja(), wartosci zmiennych x oraz y zostaną skopiowane do zmiennych wewnetrznych funkcji odpowiednio: A oraz B, potem w linii (1) do zmiennej A zostanie wpisana warosc 40 (do A a nie do x !), dalej w (2) do B (a nie x!) wpisane będzie 50, funkcja zwroci ich sume czyli 90, i ta wartosc zostanie wstawiona z powrotem w linii (3) do zmiennej z. Tak więc x i y nie zostały zmienione, nadal maja w sobie 1 i 4 ! Spojrzcie teraz na ten fragment: int x = 1 ; int y = 4; int z = 0; 0: int Funkcja( int A, int &B ) 1: A=40; 2: B=50: return A+B; 3: z = Funkcja( x, y ); rozni sie on generalnie od poprzedniego tylko tym, ze w linii (0) przed nazwą "B" umieściłem znak '&'. W ten sposób nakazuję przy wywołaniu funkcji nie pobierać jedynie wartości zmiennej, a brać "całą" zmienną. Teraz przy wywolaniu w (3) funkcji, A otrzyma wartosc zmiennej x, zaś B zostanie "podłączone" do zmiennej y. I teraz w linii (1) do zmiennej A zostanie wpisana warosc 40 (x się nie zmieni), natomiast gdy w linii (2) do B wpisane zostanie 50 zmienna y (na zewnatrz funkcji) rowniez ulegnie zmianie na 50!! później funkcja zwroci ich sume czyli 90, ta wartosc zostanie wstawiona z powrotem w linii (3) do zmiennej z. Tak więc teraz x nie został zmieniony, i nadal ma w sobie 1, zas y ulegl zmianie i otrzymal w srodku funkcji wartosc 50! 9) Błędy i troche dodatkowych informacji. Coż, przykłady już mieliście, więc ich nie potrzeba (chyba). Zamist tego wskaże wam kilka częstych błędów. int x=0; void Funkcja( int A, int B ) A=40; B=50: return A+B; Przy tych dwóch deklaracjach błąd jest raczej oczywisty - napisano "void" a funkcja probuje zwrocic wartosc "A+B". Poprawnie funkcja z w.z. "void" moze uzywać return tylko tak: void Funkcja( int A, int B ) // jakis program funkcji return; czyli niepodajac returnowi kompletnie nic. Co więcej, funkcja moze go kompletnie opuścic! np: void Funkcja( int A, int B ) //jakis program funkcji dotyczy to tez funkcji zwracających inne typy niż void. Całkowicie poprawne sa dekaracje: float Funkcja(float x) float y=x; return; float Funkcja2(float x) float y=x; Pierwsza uzywa return bez wartosci, a ze miala zadeklarowany typ w.z. "float" to zwraca 0 (zero) w "formacie" float, zas druga w ogole nie ma return'u, ale rowiez miala zwrocic wartosc float, wiec zwraca wartosc float rowna zeru. A teraz znow kilka bledow. Podobnie jak nie mozna bylo zadeklarowac zmiennej typu "void" tak tez nie mozna "void" zwroconego z funkcji nijak wykorzystac. Tak więc dla funkcji: void Funkcja(float x) float y=x; błędem są próby: int x = Funkcja ( 3.5 ); float y = 1.5+Funkcja (2.5); Ostatnia "ciekawostka" czy raczej ostrzezenie dotyczy szczegolnego przypadku, gdy chcemy stworzyc funkcję nie posiadającą żadnych argumentów. W takim przypadku nie poprawny jest zapis np.: float Funkcja( void ) ...... poniewaz deklarujac argument jakikolwiek i nie podajac jego nazwy otrzymamy błąd. Podobnie: float Funkcja( void ) ...... nie jest prawidłowe, jako ze probujemy w ten sposób ustawic zmienna wewnetrzna "X" o typie void. Prawidłowa deklaracja jest najprostsza z nich wszystkich: float Funkcja() ...... Po prostu w nawiasach od argumentów nie dajemy nic i już. Innym częstym błędem jest zapomnienie iż zmienne wewnętrzne funkcji są ...zmiennymi wewnętrznymi. Dziwnie to brzmi, lecz bardzo łatwo jest zapomnieć, że przy zapisie: int x=0; int y=0; int Funkcja( int A, int B) 1: int C=A+B*95; return C; x = Funkcja(3,5); 2: y = C+5; otrzymamy bląd przy linii (2). Dzieje się tak, ponieważ zapomnieliśmy iż zmienna C została w (1) zadeklarowana wewnątrz funkcji i wraz z zakończeniem się funkcji "znika" z programu. Albo jak ktoś woli inaczej - zmienne wewnętrzne nie są widoczne poza funkcją i już. Z kolei warto pamiętać iż zmienne "zwykłe" są jak najbardziej widoczne wewnątrz funkcji!!! Tak więc obydwa programy: int x=7; int y=6; int z=0; int Funkcja( int A, int B) return A+B; z = Funkcja(x,y); oraz: int x=7; int y=6; int z=0; int Funkcja() return x+y; z = Funkcja(x,y); sa poprawne i zaowocują wartością 13 w zmiennej z! Podobnie jeżeli wewnątrz funkcji coś podstawimy bezpośrednio do zmiennej "z zewnątrz": int x=7; int y=6; int z=0; void Funkcja() z=x+y; Funkcja(); to zgodnie z naszymi oczekiwaniami zmienna z otrzyma nową wartość!! Ale uwaga! Jeśli program wygląda tak: int x=7; int y=6; int z=0; void Funkcja() int z=0; z=x+y; Funkcja() to zaiste zmienna "z" wewnątrz funkcji otrzyma wartość 13, lecz zmienna "z" na zewnątrz funkcji pozostanie nie zmieniona! Można by powiedzieć że deklarując zmienną wewnątrz funkcji "zakrywamy" nią zmienne z zewnątrz o tej samej nazwie i funkcja "widzi" tylko tę wewnętrzną. Po takim nawet przypadkowym "zakryciu" nie mozna juz z wewnątrz funkji nijak zniemić przykladowej zmiennej "z" zewnętrznej! 10) Bezsens? Co bardziej spostrzegawczy napewno zauważą pozorny bezsens: "Skoro zmienne zewnętrzne sa dostępne wewnątrz funkcji, to po co nam w ogóle argumenty?" Sa one potrzebne w dwóch przypadkach. Pierwszy: Możemy posłużyć się argumentem ze znaczkiem &, aby takiej 'z' zewnętrznej niejako 'nadac' inną nazwę w środku i móc potem w srodku zadeklarować sobie 'z' wewnętrzną i mieć nadal dostęp do 'z' zewnętrznej: int z = 0; void Funkcja( int &A) int z=3; //zakrywamy 'z' zewnętrzną z=4; //zmieniamy 'z' wewnętrzne A=5; //zmieniamy A - czyli 'z' zewnętrzne, patrz wywołanie niżej Funkcja(z); Oczywiście wystarczyłoby się tak nie upierać i tę 'z' wewnętrzną inaczej nazwać, co nie? Ale argumenty są ważne jeszcze w innym przypadku, a mianowicie przy komunikacji miedzy 2 plikami-obiektami, najpierw jednak trzeba coś jeszcze powiedziec o... 11) Słowa kluczowe i kilka funkcji Jak na razie jest ich nie wiele. Oprocz wspomnianego "return", o ktorym tez nie wszystko jeszcze powiedziano, sa jeszcze: if oraz else, while oraz break i continue, sizeof(), char(), int(), float(), string(), oraz kilka specjalnych load_object(), copy_object, clone_object(), save_object(), environment(), first_inventory(), next_inventory(), prev_inventory, destroy_obejct(), this_object(), move_object() I tak: if(<wyrazenie>) <kawalek programu> else <inny kawalek programu> Jeżeli wyrażenie będzie prawdą, to zostanie wykonany kawałek programu, jeśli fałszem - inny kawałek programu, ten po else. Jednak należy uważać - jeżeli owe 'kawałki' programu bedą się składać z więcej niż jednej instrukcji, to należy je objąć klamrą taką samą jak przy funkcjach! if(x==1) y+=2; x=0; else y-=2;x=0; Zapis jak powyżej dla x!=1 spowoduje wykonanie: y-=2; x=0; zaś dla x==1: y+=2; x=0; x=0; !! Jest tak ponieważ ten kawałek dla spectry wygląda tak: if(x==1) y+=2; x=0; else y-=2; x=0; a dlatego ze po else nie dalismy klamer obejmujących obydwie instrukcje! Należy też pamiętac, że zmienne zadeklarowane wewnątrz tych klamer nie są żadnymi zmiennymi wewnętrznymi (gdzieś tu widzicie funkcje?) i są widoczne także na zewnątrz tychże klamer! while(<wyrażenie>) <kawałek programu> Podobnie jak przy "if" jeśli kawałek programu to więcej niż jedna instrukcja, to nalezy objąć go klamrą. A co w ogóle while() robi? otóż tak długo jak wyrażenie jest prawdziwe, while() powtarza w kółko wykonywanie zadanego kawałka programu. int x=0; int y=1; while(x<4)x+=2; //po zakończeniu "x" będzie równe 4, ponieważ to pierwsza wartość dla której x<4 będzie fałszem while(x<8)x+=1; y*=2; //a po skończeniu tego, "x" będzie równe 8, zaś "y" bedzie 16 Wewnątrz while() możemy użyć słów kluczowych break i continue żeby posterować sobie trochę samym while(). Jeżeli umieścimy break w ten sposób: int x=0; int y=0; while( x < 4 ) x++; break; y++; to zaraz po wejściu do pętli, "x" zostanie zwiększone o jeden, a następnie "break;" spowoduje natychmiastowe opuszczenie pętli while() i ani już więcej nie zostanie sprawdzony warunek, ani też linia "y++;" nie dojdzie do skutku. Z kolei umieszczenie w tym samym miejscu continue: int x=0; int y=0; while( x < 4 ) x++; continue; y++; to również "y++;" nie dojdzie do nigdy głosu, ponieważ program po wykonaniu "x++;" trafi na continue i wróci natychmiast na początek pętli, tj. do prawdzenia warunku, potem ewentualnie wykona "x++;" znów się cofnie itd. int sizeof(<zmienna>) sizeof ma proste zadanie - jeśli zmienna jest tablicą, to zwraca kolejny z jej indeksów (tych zadeklarowanych), jeśli zaś nie jest to zwraca zero: int x[4]; int y[2][5]; sizeof( x ); //zwroci wartosc 4 - zaden indeks nie podany, to "kolejny" oznacza pierwszy sizeof( y ); //zwroci wartosc 2 - zaden indeks nie podany sizeof( y[1] ); //zwroci wartosc 5 - podano pierwszy, a wiec zwraca drugi sizeof( y[1][3] ); //zwroci wartosc 0 - poniewaz podano wszystkie 2 indeksy a dalej juz nie ma nastepnych char char(<wartosc>), int int(<wartosc>), float float(<wartosc>), string string(<wartosc>), Są to funkcje konwertujące wartości podane na inne o ile to jest mozliwe. Pewnie już zastanawialiście się jak np. do wartości int dodać float i to wszystko wrzucić z powrotem do inta? int x=0; float y=2.3; int z=4; x = z + int(y); albo tak: x = int( float(z) + y ); [teraz troche operacji na obiektach] object load_object("nazwapliku") Sprobuje zaladowac program obiektu z pliku "nazwapliku.c", potem stworzyc ów obiekt, połączyć go z grafiką z pliku "nazwapliku.m". Jeśli się to wszystko uda, zwróci ID obiektu, ktore nalezy odrazu wpisac do jakiejs zmiennej, aby go nie zgubić ;), a jesli sie nie uda, zwroci ID"brak obiektu" object copy_object(object obj) Tworzy nowiutki obiekt i wszytko z podanego obiektu obj kopiuje do tego nowego i zwraca ID tego nowego. Nie kopiuje jednak inwentarza! object clone_object(object obj) Tworzy nowy obiekt z pliku programu podanego obiektu. Dziala więc jak copy_object() lecz jednak nie kopiuje aktualnych zawartosci, a jedynie te "fabryczne". Zwraca oczywiscie ID tego nowego obiektu. void save_object(object obj) Zapisuje cały podany obiekt do pliku "nazwamacierzystegopliku.o". Nic nie zwraca, nie niszczy podanego obiektu. void destroy_obejct(object obj) To wlasnie niszczy obiekt. Kasuje wszelkie zmienne object ktore na niego jeszcze wskazywały. object this_object() Zwraca ID obiektu, w ktorym została wywołana. object environment(object obj) Zwraca obiekt który posiada podany objekt obj w swoim inwentarzu object first_inventory(object obj), object next_inventory(object obj), object prev_inventory(object obj), 3 funkcje kolejno zwracające: ID pierwszego obiektu z inwentarza obiektu obj, ID następnego obiektu niż poprzednio pobrany, ID poprzedniego niż ostatnio pobrany. void move_object(object obj1, object obj2) Przenosi objekt obj1 do inwentarza obj2, nie wazne gdzie obj1 wczeniej siedział. 12) Pliki z programem, czyli plikoobiekty, czyli poprostu obiekty. No i co z tymi plikami... Otóż w żadnym wypadku nie da rady kilku różnych programów umieścić w jednym pliku, choćby ze zwzględu na to że zmienne zadeklarowane byłyby wtedy uwspólnione i mogłoby sie wszystko nieźle pokaszanić, gdyby jeden program nagle przypadkiem pozmieniał nam ważne zmienne w drugim. Tak więc jeśli potrzebujemy 2 programów, to bedziemy mieć 2 pliki. Jeśli bedziemy miec 3 (różne) obiekty w grze, to każdy bedzie miał swój program i będzie potrzeba 3 plików, np. jeden dla stołu, drugi dla noża i trzeci dla talerza. Teraz wyobrażmy sobie że potrzebujemy aby te 3 obiekty sie ze sobą w jakikolwiek sposób komunikowaly. Ot, np. chcemy aby talerz miał w sobie zmienną "object leżę_na;" w której bedziemy trzymać ID obiektu na ktorym talerz leży. Zmienna "leżę_na" jest generalnie widoczna jedynie wewnątrz obiektu talerza (podobnie jak zmienne wewnętrzne funkcji). My jednak chcemy zeby dajmy na to nóż mógł się "dowiedzieć" na czym talerz leży. Do tego służy specjalna funkcja call_other. Podobnie jak funkcje trygonometryczne, czy tez funkcje z poprzedniego, 11-tego punktu, jest ona juz przygotowana i nie musicie, ani nawet nie mozecie jej sami napisać (nazwa jest zarezerwowana). Wystarczy ze wewnatrz noża bedzie: object talerz; //ID talerza, zakładam ze już mamy object talerz_lezy_na; //tu zapamietamy uzyskane ID talerz_lezy_na = call_other(talerz, "leżę_na"); //tu sprawdzamy i wstawiamy call_other w ostatniej linii wywołuje zmienną "leżę_na" z obiektu o ID określonym w zmiennej "talerz". Podobnie można "wyciągać" z obiektów dowolne zmienne. Jeśli przypadkiem zmienna o wskazanej przez nas nazwie nie istniałaby, call_other zwraca wartość 0 (zero), ciąg pusty, lub brak obiektu. A co mozna zrobić, jezeli chcemy aby np. stół mógł ustawić zmienną "leżę_na" talerza tak, aby wskazywała na niego? Zapis w pliku stołu: object talerz; //ID talerza, zakładam ze już mamy call_other(talerz, "leżę_na=this_object"); //tu sprawdzamy i wstawiamy zupelnie nie zadziala, gdyz call_other nie wykona wpisanej instrukcji, a ...sprobuje znaleźć zmienną o nazwie "leżę_na=this_object", co z pewnością mu się nie uda. Zamiast tego musimy się posłużyć właśnie napisanymi przez nas funkcjami. I tak, wewnątrz talerza umieszczamy funkcję np.: void UstawNaCzymLeze(object Obj) leżę_na=Obj; i teraz stół bedzie mógł już ustawić tę zmienną wywołując tę funkcję. Funkcje talerza ta jednak nie będa w nim widoczne, podobnie jak zmienne z talerza, wiec trzeba znów posłużyć się funkcją call_other, tylko troche inaczej: (w stole oczywiście) object talerz; //ID talerza, zakładam ze już mamy call_other(talerz, "UstawNaCzymLeze", this_object()); //tu sprawdzamy i wstawiamy W ten sposób stół poprzez call_other wywoła funkcję UstawNaCzymLeze z talerza i przekaze jej za argument swój ID otrzymany z this_object(). Jezeli funkcja wywoływana przez call_other zwracałaby jakąś wartość to call_other ją "złapie" i zwróci sam, podobnie jak zwracał wartości zmiennych: [w talerzu] object NaCzymLeze() return leżę_na; [w stole] object talerz; //ID talerza, zakładam ze już mamy object talerz_lezy_na; talerz_lezy_na = call_other(talerz, "NaCzymLeze"); I to właściwie koniec całej opowieści, powiedziałem już o wszystkim co najważniejsze, jak bedziecie znac i kojarzyc to, to reszta bedzie juz tylko kosmetyką ;))

BIGos [ bigos?! ale głupie ]
ogólnie mówiąc kojarzę już prawie wszystko, przejrzę sobie jeszcze kilka razy to o funkcjach, ale ogólnie zrozumiałe :) a koro reszta jest prostsza to poprosze o wyjasnienie reszty najlepiej w takim stylu jak teraz czyli "dla_laika" :) ogólnie mówiąc to: wiedza_quetza =10; moja_wiedza=2; while( moja_wiedza == wiedza_quetza) moja_wiedza++; :))

Quetzalcoatl [ Konsul ]
dobna wtopa - petla while() sie w ogole nie wykona, bo while() wykonuje operaje tak dlugo jak warunek jest prawda, a w warunku masz (2==10). poprawnie z moim domysłem powinno być: while( moja_wiedza <= wiedza_quetza ) moja_wiedza++; albo while( moja_wiedza != wiedza_quetza ) moja_wiedza++; ale grunt ze sie starasz :))) z reszta opisu trzeba poczekac, bo na razie mam mało czasu w związku z rozpoczęciem roku akademickiego :) ale grafik mam baardzo luźny, więc pewnie za 2-5 dni juz będę miał czasu dużo :) nara!
mORfeOoSH [ NULL ]
polecam inne rozwiazanie: while(Wasza_wiedza < moja_wiedza) Klaniaj_sie_dla_imperatora(); :DD zart:)
BIGos [ bigos?! ale głupie ]
no jeszcze trchę i na pewno się uda :) a wersję z : while( moja_wiedza <= wiedza_quetza ) moja_wiedza++; rozważałem ale zrezygnowałem, nie wiem dlaczego :) w sumie to się staram, i zaczynam to pojmować w koncu :) tyle że teraz mało czasu (gimnazjum sux) i chyba bedzie go coraz mniej :(( no ale mówi się trudno i stara się dalej.] BTW, masz jakies sygnały od kojotki ? jakoś jej nie słychac ostatnio
Quetzalcoatl [ Konsul ]
kojotka wysyla bardzo silne sygnaly ...telepatyczne. jednakze nie sa one zrozumiale dla mezczyzn, z wzajemnoscia zreszta, tak wiec rowniez moje proby odpowiedzi na nie nie powiodly sie :)

BIGos [ bigos?! ale głupie ]
uuuu ajajajaj.... coraz mniej luda :) aktywnych jest dwóch w tym jeden zdolny do pracy... kiepsko to wygląda :) What I felt, What I knew, Never shined trought I shown...
Quetzalcoatl [ Konsul ]
tylko nie myslcie ze te 1,5 miecha nieodzywania sie oznacza ze przerwalem projekt :)) poprostu nie widze sensu gadac wiecej niz juz napisalem podczas gdy nikt o nic nie pyta. Caly czas dzialam i chociaz ostatnio autentycznie cofnalem sie w robocie (duuzy blad w pewnym miejscu => duzy kawal kodu wywalony) to caly czas sie jakos sie kreci :)