Aleksandar Ružičić @ 07.03.2008. 14:52
Pozdrav svima,
ova tema je namenjena projektu pod nazivom EliteTanks (to mi palo napamet, ako imate boljih ideja recite, pa da menjamo naziv) a tema projekta je izrada igre po uzoru na "tenkice" koje smo svi mi igrali nekad davno dok smo jos bili deca :)
elem, cilj projekta je da malo promovisemo FreeBasic na EliteSecurity forumima i da napravimo nesto korisno, da naucimo nesto novo iz toga i pre svega da se dobro zabavimo :D
ova igra moze da se napise bukvalno u jednom modulu (.bas-u) i nema potebe za nekim preteranim AI-em a pogotovu ne za scripting podrskom, ali mi cemo bas sve to da ubacimo u ovu igru, jer kao sto rekoh hocemo da naucimo nesto iz ovoga, a ne da "sto pre zavrsimo"...
inace, "engine" igre cemo kasnije izolovati, malo ga doterati i iskoristiti za neke kasnije poduhvate. a engine (neka "codename" bude EliteGameEngine) treba da bude sastavljen od sledecih delova/modula:
• GFX module - deo zaduzen za iscrtavanje na ekran, trebao bi da koristi double buffering tehniku i da ima neke objekte tipa sprite, animated stripe, layer i sl (dovoljno je proslediti objekat Draw funkciji i on ce biti nacrtan na trenutnoj poziciji, frejmu i slicno)
• SOUND module - za muziku i zvucne efekte, ja sam za to da se koristi BASS biblioteka (em je poznajem, em je free, em je super :D)
• AI module - za pocetak nek bude samo implementiran A* path finding algoritam (to nam jedino treba za EliteTanks)
• MAP module - za rad sa mapama - ucitavanje, generisanje minimape, kontrolisanje skrolovanja i slicno
• SCRIPTING module - podrska za skriptovanje, jezik treba da bude typeless, sa basic sintaksom i podrskom za objekte
• NET module - podrska za igranje preko mreze - ovo cemo kasnije da radimo, cisto da se zna da je u planu...
"pomocni" alati koji su potrebni:
• Map editor
• Script compiler (bolje je da skripte budu kompilovane nego interpretirane - brzina ucitavanja i izvrsavanja je bitna u ovom slucaju)
Sto se tice grafike za pocetak cemo da koristimo sprajtove iz
SpriteLib GPL-a, a kasnije mozemo da uradimo i nesto nase (za pocetak nam je grafika najmanji problem...)
Projektu moze da se pridruzi ko god hoce, jedini uslovi su da taj neko dovoljno poznaje FreeBasic (koji je lako nauciti ukoliko imate nekog iskustva u qbasic-u, c-u, vb-u tj u bilo kom jeziku...) i da ozbiljno hoce da se ukljuci u rad na projektu.
za sada su ukljuceni sledeci clanovi (u zagradi je navedeno za sta je ko zaduzen):
•
stefanpn (AI,MAP Editor)
•
krcko (SCRIPTING, GFX)
•
Aleksandar Vasic (SOUND)
ukoliko ste zainteresovani da se prikljucite projektu mozete se za to obratiti u ovoj temi, samo navedite sta zelite i mozete da uradite.
sav source cemo objavljivati ovde na es-u, i delimicno ce se diskusija voditi u ovoj temi, ali ce uglavnom svi dogovri ici preko irc-a (#freebasic @ irc.elitesecurity.org) ili msn-a
[Ovu poruku je menjao Aleksandar Ružičić dana 13.03.2008. u 23:55 GMT+1]
Shadowed @ 07.03.2008. 15:18
Mozda nije lose da prvo sto pre zavrsite (naravno, da radi kako treba) pa da onda dodajete sve i svasta. Korisno po moral.
My 2c
Aleksandar Ružičić @ 07.03.2008. 15:57
pa pitanje je koliko ko ima slobodnog vremena i volje da trosi isto na programiranje, ja ga imam stvarno malo (fax, pos'o, studentski zivot :D) ali cu svo slobodno vreme uloziti u ovaj projekat pa kad bude gotov bice...
iz tih razloga nikakav timelimit nije i nece biti postavljan, jednostavno "kad bude gotovo bice" :)
mada to za podizanje morala je na mestu :)
Eurora3D Team @ 07.03.2008. 16:43
Mislim da bi bilo dobro da ste odredili i IDE u kom ce da se radi. Recimo mene najvise nervira kad skinem neki kod i moram da ga prebacujem na IDE koje imam. Ja sam skinuo pre neki dan FbEdit IDE i mislim da je dobro (pogotovo za GUI programe) ...
Ovo da FreeBasic moze da se nauci za 2 dana ... neverujem. Ja recimo programiram profesionalno u VB6 i C++ zadnjih 5 godina a assembler znam skoro od kad sam bio mali , pa nebi mogao nista posebno da uradim u FreeBasicu za 2 dana (neke stvari koje radim u VB verovatno ni za 2 meseca).
Tu je stvar koliko ko ima iskustva u necemu (i uradjenog ili skupljenog koda)
Pa nebi bilo lose da stavite ovde neki kompleksniji kod koji demonstrira npr koriscenje spoljnjih dll fajlova (nisu sve API fn ubacene u FreeBasic) i kako se to linkuje.
Npr sta ako neko hoce da koristi neki svoj dll napisan u c jeziku i slicno.
Ne pisem ovo zbog sebe ... (iako ne znam mogao bi to da pronadjem brzo) ... al neko ko bi hteo da ucestvuje treba da ima bar neku osnovnu predstavu o FreeBasic jeziku , pogotovo sto pominjes koriscenje spoljnih biblioteka ...
Predlog
Razmislite da kompajlujete igru i kao dll sa jednom glavnom funkcijom kojoj bi se preneo hWnd glavnog prozora.
Ako napravite to obecavam da cu da vam napravim plug-in i ActiveX (u c++) za browsere pod windowsom da bi moglo da se igra i u browseru.
Pozdrav
Aleksandar Ružičić @ 07.03.2008. 17:01
pa ako imas programersko iskustva, i ako znas da razmisljas na "programerski nacin" onda ne bi trebao da imas problema da naucis novi jezik, jer nista novo ti ne ucis osim nove sintaxe, tu je gomila primera koja ti pomaze da se snadjes u novoj sintaksi a tu je i manual :) od cijeg kvaliteta zavisi koliko brzo neko moze da nauci taj jezik, recimo PHP manual je odlicno uradjen i meni je trebalo 4-5 dana da se snadjem u php-u i napisem prvu vecu aplikaciju u istom. nista novo ja tu nisam naucio osim php sintaxe, razmisljam isto i kao da resavam problem u vb-u, c-u ili pascalu (naravno svaki jezik je za nesto specifican i nudi ti laki nacin da uradis odredjeni posao od ostalih, ali sve sto znas da napises u jednom jeziku znas i u bilo kom drugom, samo da se malo izvezbas u novoj sintaksi...)
sto se tice koriscenja dll-ova imas primera u /examples/ a i u dokumentaciji
e da, i sto se tice IDE-a koristimo FBEdit, mislio sam da se to podrazumeva :)
Eurora3D Team @ 07.03.2008. 17:38
Hvala ... sad si me prosvetlio

Ja sam postavljao pitanja kao sto bi to radio pocetnik ... i zbog njih.
Ja sam ucio (mislim) 5 programskih jezika do sad (asm,c++,vb,java,i c) i znam kako to ide.
Posle ucenja sintakse dolazi bolan i mucan period

ucenja na greskama i upoznavanja IDE i kompajlera (i njegovih mana i vrlina).
Za neke stvari treba da se nauci i instalira jos ++ Npr ti si za PHP instalirao npr Apache (verovatno i mySQL) i citao njihovu dokumentaciju ucio da pravis baze i tabele itd. Slicno je i ko hoce da programira za MS SQL Server ...
Inace nije mi bila namera da obeshrabrujem ljude .... jedino mislim da se nesto bolje sagleda ako se gleda iz vise uglova , pa samim tim su i vece sanse da se uradi. FreeBasic je ozbiljan jezik ...
FbEdit

i ja mislim da je najbolje FreeBasic IDE
http://www.radasm.com/fbedit/
Imam i njegovo RadAsm za assemblere.
A cime debugujes , ovaj njihov debuger je komplikovan ...
Pozdrav Sale
Aleksandar Ružičić @ 07.03.2008. 17:44
sto se tice formata MAP fajlova, moje predlog je sledeci:
binarni fajl u little endian formatu cija struktura izgleda ovako (uglaste zagrade prestavljaju 1 byte, viticaste vise bajtova a "normalne" prestavljaju zero terminated wide string tip):
Code:
{HEADER}{DATA}
gde je {HEADER}:
[E][L][I][T][E][M][A][P] {VERSION:32b} (map name) {WIDTH:16b} {HEIGHT:16b} {HASH:32b} {FLAGS:32b}
a {DATA} niz bajtova:
[0,0][0,1]...[0,WIDTH-1][1,0][1,1]...[1,WIDTH-1]...[HEIGHT-1,WIDTH-1]
objasnjenje:
VERSION - 32bitni unsigned integer koji predstavlja verziju ELITEMAP formata (verovatno necemo menjati format, ali za svaki slucaj)
map name - naziv mape (wide string kao sto sam rekao, u LE 16bit Unicode formatu)
WIDTH - 16bitni unsigned integer koji predstavlja sirinu mape
HEIGHT - 16bitni unsigned integer koji predstavlja visinu mape
HASH- 32bitni unsigned integer koji predstavlja hash vrednost mape (tj DATA byte niza) - ovo cemo koristiti kasnije kad bude bio implementiran online sistem igranja (za sada moze da bude 0 dok ne odlucimo koji hash algoritam da koristimo)
FLAGS - 32bitni unsigned integer koji predstavlja razne flegove, recimo jedan bajt moze biti rezervisan za tileset index (koji set slicica se koristi u mapi) i slicno...
jel ima neko primedbi, sugestija?
ako ne, onda stefane zasuci rukave i pocni :)
Aleksandar Ružičić @ 07.03.2008. 17:46
Citat:
Eurora3D Team:A cime debugujes , ovaj njihov debuger je komplikovan ...
pa i nije komplikovan nesto mnogo :)
to je ustvari GDB (GNU Debugger) a Insight je samo GUI za GDB... snadjes se brzo :)
stefanpn @ 07.03.2008. 17:57
Predlazem da se u map datoteku doda i neki komentar o datoteci
Code:
{HEADER}{DATA}
gde je {HEADER}:
[E][L][I][T][E][M][A][P] {VERSION:32b} (map name) {WIDTH:16b} {HEIGHT:16b} {HASH:32b} {FLAGS:32b}
a {DATA} niz bajtova:
[0,0][0,1]...[0,WIDTH-1][1,0][1,1]...[1,WIDTH-1]...[HEIGHT-1,WIDTH-1]
{COMMENT}
Evo i ovde originalnih tenkica, ako neko nije video tamo:
Tenkovi i emulator
Mozda je ova tema vise za GameDev.
Aleksandar Ružičić @ 07.03.2008. 18:14
moze i comment da se doda, s tim sto to treba da bude opciono, moze npr jedan bit u FLAGS integeru da znaci ima komentara/nema komentara, a ako ima komentara onda on treba da bude izmedju {HEADER} i {DATA}, nekako mi nije dobra ideja da bilo sta ide posle DATA...
znaci od 32 flega iskoristili smo do sad 5, prva 4 formiraju tileset index, a peti oznacava prisustvo komentara.
sto se tice komentara da je tema za GameDev, verovatno si u pravu, ali ipak mislim da je bolje da bude ovde, bar dok je ne zavrsimo, a kasnije moze da se prebaci u GameDev, jer jedan od razloga sto ovo radimo je da priblizimo FreeBasic onima koji jos nisu culi za njega, a to cemo najbolje da uradimo (tj uticacemo na najveci broj ljudi) ovde jer su na GameDevu-u uglavnom C\C++ programeri...
[Ovu poruku je menjao Aleksandar Ružičić dana 07.03.2008. u 19:44 GMT+1]
Aleksandar Ružičić @ 07.03.2008. 19:14
evo, konacno sam ispodesavao FBEdit kako mi odgovara i pocecu da radim na kompajleru za FBScript, tacnije prvo cu da napisem TokGen - alat za generisanje leksickih parsera...
evo moje VS-like teme za FBEdit:
Code:
[Themes]
.
.
.
6=Visual Studio,8388608,255,0,0,0,0,0,0,0,0,268435584,128,8388608,8404992,8421376,0,0,0,16777215,0,10485760,16777215,37781504,64,0,16777215,16777215,15329769,16777215,15132390,0,0,16777215,0,16777215,0,12644592,0,12644592,0,4194432
samo sto sam ja sve tokene ubacio u C0, C1, C10 i C11 grupe, pa mi sad [Edit] izgleda ovako:
Code:
EditFont=-15,0,Courier New
LnrFont=-12,0,Courier New
EditOpt=4,0,0,1,0,1,4,1,0,1,1,1,1,0,0,1,1,1,1,1
CodeFiles=.bas.bi.
CaseConvert=CWPp
CustColors=12644592,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Colors=8388608,255,0,0,0,0,0,0,0,0,268435584,128,8388608,8404992,8421376,0,0,0,0
C0="abs Abs access Access acos alias Alias allocate And Any append Append as As asc Asc asin asm atan2 atn Atn base Base Basic beep Beep bin bin$ Bin$ binary Binary bit bitreset bitset bload BLoad bsave BSave byref ByRef byval ByVal call Call callocate Calls Case Cast CByt cbyte CCur cdbl CDbl cdecl Cdecl chain Chain chdir ChDir ChDrive Chr chr$ Chr$ cint CInt circle clear Clear clng CLng clngint close Close cls Cls color Color Com command command$ Command$ common Common CompileLine CompileLine$ condbroadcast condcreate conddestroy condsignal condwait Const Constructor continue cos Cos cshort csign csng CSng csrlin CsrLin cubyte cuint culngint cunsg curdir CurDir$ cushort Cvb Cvc cvd Cvd cvi Cvi cvl Cvl cvs Cvs data Data date date$ Date$ deallocate Declare Def defbyte DefCur DefDbl defined DefInt DefLng defshort DefSng DefStr defubyte defuint defushort Destructor dim Dim dir dir$ Dir$ DisableBOPT DisableFold DisableIncDec DisablePeriodMsg DisableShifts DisableTest DisableTrim do Do draw dylibfree dylibload dylibsymbol dynamic Else ElseIf End EndIf enum environ Environ environ$ Environ$ eof Eof eqv Eqv erase Erase ErDev ErDev$ Erl err Err error Error Error$ escape Event exec exepath exit Exit exp Exp explicit Explicit export extern False Field FileAttr Files Fix fix flip For for Fortran Fre fre FreeFile freefile Function Get get getkey getmouse Go GoSub gosub GoTo goto hex Hex$ hex$ hibyte hiword If iif Imp imp InKey$ inkey$ Inp inp Input input Input$ input$ Instr instr Int int IoCtl IoCtl$ Is is Key Kill kill LBound lbound lcase LCase$ lcase$ left Left$ left$ Len len Let let Lib lib Line line LineNumber List lobyte Loc loc Local local Locate locate Lock lock Lof lof Log log Loop loop loword LPos LPrint LSet lset ltrim LTrim$ ltrim$ mid mid$ Mkb$ Mkc$ mkd Mkd$ mkd$ MkDir mkdir mki Mki$ mki$ mkl Mkl$ mkl$ mklongint mks Mks$ mks$ mkshort Mod mod multikey mutexcreate mutexdestroy mutexlock mutexunlock Name name Namespace Next next Not Null oct Oct$ oct$ Off Offset On on once Open open Operator Option option Or Out out Output output overload paint palette Pascal pascal pcopy Peek peek PeekByte PeekCurr peeki PeekLong peeks PeekWord Pen Play pmap point Pointer Poke poke PokeByte PokeCurr pokei PokeLong pokes PokeWord Pos pos Preserve preserve preset Print private procptr Property pset public Put put Random random Randomize randomize Read read reallocate ReDim redim Rem Reset reset Restore restore Resume resume resume Return return rgb right Right$ right$ RmDir rmdir Rnd rnd Rol Ror RSet rset rtrim RTrim$ rtrim$ Run run Sadd sadd Scope Screen screen screencopy screeninfo screenlock screenptr screenres screenset screenunlock Seek seek Seg Seg$ Select setenviron SetMem Sgn sgn Shared shared Shell shell Shl Shr Signal Sin sin sizeof Sleep sleep Sound space Space$ space$ Spc spc Sqr sqr Sseg Ssegadd Stack Static static Stdcall stdcall Step step Stick Stop stop Str Str$ str$ strcat strchr strcmp strcpy Strig String$ string$ strlen strncat strncmp strncpy strptr strrchr strstr Sub swap Syscall system Tab tab Tan tan Test TestNot Then threadcreate threadwait time Time$ time$ Timer timer To to trim Trim$ trim$ True Type UBound ubound ucase UCase$ ucase$ union unlock Until until Using using va_arg va_first va_next Val val val64 valint Var VarPtr varptr VarPtr$ VarSeg view wait wend while width WinCon window windowtitle WinGui with write Xor "
C1="#define #else #elseif #endif #endmacro #error #if #ifdef #ifndef #inclib #include #libpath #line #macro #pragma #print #undef "
C2=""
C3=""
C4=""
C5=""
C6=""
C7=""
C8=""
C9=""
C10="#define #include ACCELERATORS ALT AUTOCHECKBOX AUTORADIOBUTTON BEGIN BITMAP BLOCK CAPTION CLASS COMBOBOX CONTROL CURSOR DIALOGEX DISCARDABLE EDITTEXT END EXSTYLE FALSE FILEOS FILETYPE FILEVERSION FONT GROUPBOX ICON LISTBOX LTEXT MENU MENUITEM NOINVERT NULL POPUP PRODUCTVERSION PUSHBUTTON SEPARATOR SHIFT STRINGTABLE STYLE TRUE VALUE VERSIONINFO VIRTKEY "
C11="__DATE__ __FB_BIGENDIAN__ __FB_DEBUG__ __FB_DOS__ __FB_ERR__ __FB_LANG__ __FB_LINUX__ __FB_MAIN__ __FB_MIN_VERSION__ __FB_MT__ __FB_OPTION_BYVAL__ __FB_OPTION_DYNAMIC__ __FB_OPTION_ESCAPE__ __FB_OPTION_EXPLICIT__ __FB_OPTION_PRIVATE__ __FB_OUT_DLL__ __FB_OUT_EXE__ __FB_OUT_LIB__ __FB_OUT_OBJ__ __FB_SIGNATURE__ __FB_VER_MAJOR__ __FB_VER_MINOR__ __FB_VER_PATCH__ __FB_VERSION__ __FB_WIN32__ __FILE__ __File_Nq__ __FUNCTION__ __Function_Nq__ __LINE__ __PATH__ __TIME__ "
C12=""
C13=""
C14=""
C15=""
C16=""
C17=""
C18=""
C19=""
steve585 @ 07.03.2008. 20:14
Rado bih se ukljucio, ali nikad do sada nisam radio sa Free Basic-om. Instalirao sam, FreeBasicEditor, pa cu pokusaati skontati o cemu se radi.
Eurora3D Team @ 07.03.2008. 20:19
Code:
2=Black Night,16744448,16744448,16744448,8421440,16711680,33521664,16744448,16744448,16744448,33521664,285179904,16744448,4227327,16711680,16711680,16711680,65535,65535,0,12632256,10485760,16777215,8454143,16777215,255,4868682,15420,3158064,12632256,8421504,8388608,8421504,15263976,0,15329769,0,12644592,0,12644592,0,4194432
Ovako cuvas oci :) ... jos ako imas TFT ...
Aleksandar Ružičić @ 07.03.2008. 20:52
ma koje oci, one su odavno otisle u aut (vec godinu dana nosim -0.5 dioptriju), imam TFT ali ipak navika je navika :)
@steve585: ako ti se svidi freebasic (verujem da hoce) mozes se prikljuciti kad hoces, uvek ce imati nesto da se radi (ako ne u ovom onda nekom drugom projektu)
Shadowed @ 07.03.2008. 21:20
Cek malo, sta prestavlja ono u data delu map fajla? Obelezavas svaki pixel da li je teren ili ne? Ili samo navods koji jeste?
Trebalo bi odluciti da li je teren konveksan ili ne, odnosno da li moze postojati deo koji se "nadnosi" na ostatak. Kod tenkova obicno nije tako, vec u tom slucaju "zemlja" padne dole. Ako hocete tako, onda teren mozete jednostavno definisati visinama na svakoj koloni piksela.
Nadam se da je ikom jasno sta sam hteo da kazem, skroz sam zakomplikovao a mrzelo me crtati.. :)
stefanpn @ 07.03.2008. 22:20
Mmm... Nije ovo teren vec mapa(ovo je 2D aplikacija) tako da nema visine...
Mapa je u stvari matrica u koju su upisane vrednosti koje oznacavaju sta se nalazi na poljima od 32x32 pixela.
Znaci nesto kao ovo:
Code:
_______________________
| E1| | | | | E2|
|___|___|___|___|___|___|
| P | P | | P | P | P |
|___|___|___|___|___|___|
| P | P | | | | |
|___|___|___|___|___|___|
| c | | | P | P | |
|_z_|___|___|___|___|___|
| | | | P | | |
|___|___|___|___|___|___|
| P | | P | P | | P |
|___|___|___|___|___|___|
| | | | | | |
|___|___|___|___|___|___|
| | T | O | | | |
|___|___|___|___|___|___|
Gde je
T = tenk
P = prepreka
O = ptica
E1 = neprijatelj 1
E2 = neprijatelj 2
C = pesak
Z = zbun
S' tim sto cemo mi to P(prepreka) predstaviti kao 1 ili 2 ili 3 ili ... u zavisnosti od toga koja je prepreka u pitanju.
EDIT: Ruza me je prosvetlio, tako da sad imamo za svako polje po dva bajta, da mozemo imati delove koji se "nadnose".
[Ovu poruku je menjao stefanpn dana 07.03.2008. u 23:53 GMT+1]
[Ovu poruku je menjao stefanpn dana 07.03.2008. u 23:54 GMT+1]
Aleksandar Ružičić @ 07.03.2008. 22:24
ja mislim da sam razumeo sta si hteo da kazes :)
i u originalnim tenkicima ima "konveksnih" delova, tj imas kao onu "kamuflazu" koja predstavlja zbun, i mozes da prodjes ispod njega (tenkic se nalazi ispod tog zbuna, koji je mestimicno providan pa lepo vidis da je tenkic ispod)
ja sam i to imao u vidu, i to se uklapa u ovaj format map fajla.
sto se tice DATA sekcije, to je niz bajtova koji predstavljaju polja, a ne pixele (polje ce biti mozda 30x30px ili nesto slicno, videcemo). i svaki taj bajt ustvari sadrzi dve vrednosti (2 nibble-a), prva 4bita predstavljaju index "donjeg" elementa a druga 4bita predstavljaju index "gornjeg" elementa (koji naravno moze biti izostavljen). i kada se crta frejm prvo se iscrtaju sva polja ali crta se samo donji element, onda se iscrtaju svi sprajtovi i na kraju se za svako polje iscrta gornji element (naravno ovo ce biti optimizovano, jer nema potrebe da se drugi put radi ceo For .. Next, najverovatnije ce se kad se ucitava mapa kreirati i pomocni niz koji ce sadrzati indexe onih polja koja imaju podesene elemente - tako mi je nekako najlogicnije)
e sad, ova podela bajta na dva dela od 4bita ogranicava broj mogucih elemenata koji je u ovom slucaju 2^4 = 16 za donji element i 15 za gornji (kada su druga cetiri bita = 0 onda nema gornjeg elementa)...
mozda je bolje da za donji element rezervisemo 7 bitova, pri cemu je MSB rezervisan kao fleg koji oznacava pristustvo/odusustvo gornjeg elementa, e sad ukoliko nema gornjeg elementa (prvi bit = 0) onda sledecih 7 bitova (tacnije ceo taj bajt) predstavljaju index elementa (time dobijamo 2^7 = 128 razlicitih elemenata), a ukoliko je msb podesen onda je trenutni bajt pracen sa jos jednim bajtom koji predstavlja index (ovog puta 255 razlicitih vrednosti) gornjeg elementa.
ovo jeste bolje sto se tice broja mogucih slicica (iako je za tenkice sasvim dovoljno 16 razlicitih elemenata) ali je malo teze za ucitavanje (ne moze jednostavno da se ucita sve u byte niz), mada uz For petlju ni ovo nije tesko ucitati...
neka stefan odluci :)
Shadowed @ 07.03.2008. 22:25
OK, onda sam ja pogresno skontao o cemu se radi u igri :)
Aleksandar Ružičić @ 07.03.2008. 22:36
nije stvar samo u ovoj konkretnoj igri, hocemo da napravimo nesto sto se kasnije moze primenljivati i na druge tipove igara...
stefanpn @ 07.03.2008. 23:01
Informacija za sve posetioce: chat o freebasic-u i ovoj temi na http://www.elitesecurity.org/chat na kanalu #freebasic
[Ovu poruku je menjao stefanpn dana 08.03.2008. u 00:45 GMT+1]
Shadowed @ 08.03.2008. 00:53
Ili, ako koristite neki irc klijent - server irc.elitesecurity.org
stefanpn @ 08.03.2008. 02:11
Mislim da bi tema trebala da se preimenuje iz "[FreeBasic] EliteTanks projek
at" u "[FreeBasic] EliteTanks
projekt", nekako mi lepse zvuci...
[Ovu poruku je menjao Aleksandar Ružičić dana 06.04.2008. u 18:09 GMT+1]
Aleksandar Vasic @ 08.03.2008. 13:20
eo ja bi da se prikljucim ali ne znam koliko cu moci da pomognem :D
Aleksandar Ružičić @ 08.03.2008. 14:30
sta bi hteo da radis?
Aleksandar Vasic @ 08.03.2008. 16:25
pa jedino sto sam radio od ovoga je,sound sa bibliotekom bass ;)
Aleksandar Ružičić @ 09.03.2008. 15:45
ok, onda ti radi funkcije za zvuk!
evo otprilike sta je potrebno:
• mogucnost pustanja "background" muzike (potrebna je kontrola jacine zvuka, "auto repeat", nasumicno odabiranje numera iz liste koje moze da se iskljuci takko da se pesme pustaju redom u kom se nalaze u listi)
• funkcije za zvucne efekte, pri cemu treba jedna f-ja koja se zove (npr) PlayFX koja prima 4 parametra od koja su tri opciona:
Code:
Declare Sub PlayFX(effect As SoundEffects, x As Single = CENTER_X, y As Single = CENTER_Y, volume = -1)
• effect - id zvucnog effekta (SoundEffects je Enum koji sadrzi sve zvukove igre)
• x - x pozicija na ekranu, ovo koristi da podesis balance, tj ako je blize levoj ivici onda se glasnije cuje na levom zvucniku, odnosno na desnom ako je blize desnoj ivici
• y - y pozicija na ekranu, pogledaj na
www.un4seen.com na forumu sam pre nekog vremena naisao na nacin kako da odredis koliko ima zvucnika, ako ima samo dva onda y parametar zanemarujes, ukoliko ima vise onda i y uzimas u obzir (ako je blize gornjoj ivici onda je jace na front zvucnicima, ako je blize donjoj onda na rear)
• sto se tice CENTER_X i CENTER_Y to ce biti vrednosti definisane u glavnom modulu (game.bas) a predstavljace koordinate centra ekrana (ovo ce se definisati u zavisnosti od velicine mape, tj dela mape koji je vidljiv na ekranu), takodje bice definisane i FRAME_WIDTH i FRAME_HEIGHT (koji oznacavaju velicinu frejma, tj dela mape koji je vidljiv)
• volume - jacina zvucnog efekta, ukoliko je -1 onda koristi promenljivu FX_VOLUME_LEVEL koja ce sadrzati jacinu zvucnih efekata koja je podesena u Options
dok testiras ti definisi ove konstante i promenljive koje sam naveo, da imas sa cime da radis, kasnije cemo sve to povezati i prebaciti te deklaracije u glavni modul.
e da, zaboravio sam da vam napomenam da ce svaki modul imati svoj namespace, cisto da se zasititmo od moguceg name-colisiona, dakle ukoliko je modul za zvuk naka bude
Namespace Sound, ukoliko je AI
Namespace AI i td...
Aleksandar Vasic @ 09.03.2008. 15:50
Dogovoreno
stefanpn @ 09.03.2008. 20:01
Ej ljudi ja se izvinjavam, sto me nema... Malo sam zauzet, ali pogledam povremeno sta se desava. Slazem se skroz za koriscenje Namespace-a. Samo sam hteo da se dogovorimo nesto oko AI dela. Ako koristimo A star path find, onda ce se traziti najbolji put u matrici, tako da vam ja iz AI modula mogu dati samo koordinate neprijatelja u matrici, tako da ce mi se modul jako preplitati sa main modulom ili sa modulom za gfx. Pa sam hteo da pitam kada cemo i kako cemo raditi te module?
Inace trenutno sam zauzet nekim programom koji mora da se zavrsi za nekih 30-ak dana, tako da nemam bas puno vremena, pa se nadam da se ne ljutite sto cu malo kasniti za vama.
[Ovu poruku je menjao Aleksandar Ružičić dana 06.04.2008. u 18:10 GMT+1]
Aleksandar Ružičić @ 09.03.2008. 21:46
sada je bitno da se urade "moduli" koji rade samostalno, znaci ako uzmemo u obzir A* algoritam, potrebno je da se uradi funkcija koja prima 2 parametra, prvi je lokacija (uredjen skup [x,y]) na kojoj se igrac (ili neprijatelj) nalazi a drugi parametar je lokacija na koju treba da dodje, funkcija treba da vrati niz lokacija (znaci niz parova [x,y]) koji prestavljaja najefikasniji (ne i najbrzi, npr bolje je ako neprijatelj prodje ispod zbunja jer je na taj nacin teze uocljiv, nego da dodje najkracim mogucim putem) put kojim igrac treba da se krece.
e sad, u pravu si da ai zavisi dosta od ostlih modula, pre svega od modula za ucitavanje mape, zato je potrebna jedna funkcija koja ce inicijalizovati AI modul tako sto ce toj funkciji biti prosledjen pointer na matricu koja predstavlja trenutno ucitanu mapu. Posto ti radis i AI i MAP module mozes odma da ih povezes tako sto ces u MAP modulu u funkciji
LoadMap ili kako si je vec nazvao po uspesnom ucitavanju mape pozivati f-ju
AI.Initialize(VarPtr(mapdata)) (gde je mapdata matrica koja predstavlja mapu)
i potreban nam je jedan "common" modul, tj modul koji ce sadrzati zajednicke definicije tipova, kao sto su:
Code:
Type Point
X As Single
Y As Single
End Type
Type MapPosition
Row As Integer
Col As Integer
End Type
Type Field
Position As MapPosition
Base As MapFieldType
Cover As MapFieldType
End Type
gde Point predstavlja lokaciju na ekranu u koordinatama x,y (koje su floating-point) a koristice se pozicioniranje elementa na mapi (necemo pomerati "polje-po-polje" nego ce prelazi sa polja na polje biti "glatki" tj u zavisnosti od brzine ce se menjati x i y koordinate), MapPosition predstavlja lokaciju na mapi (odredjujem o kom redu i o kojoj koloni se radi), a Field predstavlja jedno polje na mapi i Base predstavlja onaj "donji deo" polja o kom sam pre govorio, a Cover je onaj "gornji" deo (svako polje se crta sledecim redom: prvo se nacrta Base slicica, pa onda sprajt neki ukoliko se nalazi na tom polju, znaci tenkic, neki bonus, metak itd, pa tek onda preko Cover slicica koja ce uglavnom biti providna tako da se vidi sta je ispod)
bice jos zajednickih tipova (i ovi su dati samo kao primer, naravno da se nazivi tipova i propertija mogu menjati) ali ovi su sada potrebni za MAP i AI module pa ih ovde navodim, ti Stefane napravi poseban fajl (declarations.bas ili nesto slicno) u koji ces da smestis ove tipove, mozes i da im dodas neke propertije ako ti zatrebaju, kao sto rekoh ovo navodim samo kao primer
sto se tice vremena ni ja ga nemam bas nesto mnogo (zato nije ni navodjen nikakav vremenski rok, i nece ga ni biti) i trenutno nisam u bg-u pa me zato nema na netu (ovde sam na dial-upu...) a i nisam stigao nista konkretno da odradim sto se ovog projekta tice od tak sam dosao kuci, ali od utorka sam ponovo u beogradu pa cu nastaviti da radim
Aleksandar Ružičić @ 12.03.2008. 16:15
evo meni bilo malo dosadno pa sam uradio mainmenu screen...

Aleksandar Ružičić @ 12.03.2008. 16:25
Stefane, sto se tice ELITEMAP formata, imam jos jednu ideju:
format ima 32 bita rezervisana za flegove od kojih smo 5 vec iskoristili - prva cetiri bita (nibble) su rezervisana za tileset index, 5 bit predstavlja prisustvo komentara.
predlazem da 6 bit predstavlja Extended Format Flag, tj ako je ovaj bit 0 (sto je default) onda su polja (DATA sekcija) ozacena sa 8bita (1 bajt), a ukoliko je ovaj bit podesen (tj ako je 1) onda su polja oznacena sa 16bita (2 bajta jedno polje).
EliteTanks ce koristiti 8bita, ali mozda kasnije ovaj engine iskoristimo za drugi projekat (sto i planiram...) koji ce zahtevati vise od 128 razlicitih slicica u jednom tilesetu (recimp neki rpg)...
Aleksandar Vasic @ 12.03.2008. 17:16
vidim ja da se freebasic-u pishe lepa buducnost ;)
Aleksandar Ružičić @ 12.03.2008. 19:07
evo ja pocinjem upravo da pisem kompajler za EliteScript jezik, a evo i gramatike jezika, pa ko razume BNF notaciju neka iznese primedbe/sugestije ako ima...
Code:
<Script> ::= <OptNL> <ScriptId> <Globals>
<ScriptId> ::= 'script' StringLiteral 'class' StringLiteral <NL>
<NL> ::= NewLine <NL>
| NewLine
<OptNL> ::= <NL>
|
<Globals> ::= <GlobalScope> <NL> <Globals>
| <GlobalScope>
|
<GlobalScope> ::= <Declarations> <NL>
| <EventHandler> <NL>
| <Function> <NL>
<EventHandler> ::= 'handler' Identifier '.' Identifier <OptParamList> <NL> <Statements> 'end' 'handler'
<Function> ::= 'function' Identifier <OptParamList> <NL> <Statements> 'end' 'function'
<OptParamList> ::= '(' <ParamList> ')'
| '(' ')'
|
<Declarations> ::= 'var' <InitList>
<InitList> ::= <DeclListItem> ',' <InitList>
| <DeclListItem>
<DeclListItem> ::= Identifier '=' <Expression>
| Identifier
<ParamList> ::= <ParamlListItem> ',' <ParamList>
| <ParamListItem>
<ParamListItem> ::= Identifier
| 'ref' Identifier
<Statements> ::= <Statement> <NL> <Statements>
|
<Statement> ::= <Declarations>
| <IfStatement>
| <ForStatement>
| <LoopStatement>
| <SelectStatement>
| <FunctionCall>
| <RaiseEvent>
| <Assignment>
| <ReturnExpression>
| <Expression>
| 'exit' 'handler'
| 'exit' 'function'
| 'exit' 'do'
| 'exit' 'loop'
| 'exit' 'for'
| 'continue'
| 'lock' <QualifiedId>
| 'unlock' <QualifiedId>
<IfStatement> ::= 'if' <Expression> 'then' <NL> <Statements> <ElseBlocks> 'end' 'if'
<ElseBlocks> ::= 'else' <NL> <Statements>
| 'elseif' <Expression> 'then' <NL> <Statements> <ElseBlocks>
|
<ForStatement> ::= 'for' <OptVar> Identifier '=' <Expression> 'to' <Expression> <OptStep> <NL> <Statements> 'next'
| 'foreach' <OptVar> Identifier 'in' <Expression> <NL> <Statements> 'next'
<OptVar> ::= 'var'
|
<OptStep> ::= 'step' <Expression>
|
<LoopStatement> ::= 'do' <NL> <Statements> <Condition> <Expression>
| <Condition> <Expression> 'do' <NL> <Statements> 'loop'
<Condition> ::= 'until'
| 'while'
<SelectStatement> ::= 'select' 'case' <Expression> <NL> <CaseStatement> <CaseBlocks> 'end' 'select'
<CaseStatement> ::= 'case' <OptIs> <Expression> <NL> <Statements>
<CaseBlocks> ::= <CaseStatement> <CaseBlocks>
| 'case' 'else' <NL> <Statements>
|
<OptIs> ::= 'is' <CompareOp>
|
<FunctionCall> ::= 'call' <QualifiedId> <OptArgList>
| <QualifiedId> <OptArgList>
| <QualifiedId> <ExpList>
<RaiseEvent> ::= 'raise' <QualifiedId> <OptArgList>
| 'raise' <QualifiedId> <ExpList>
<ArgList> ::= '(' <ExpList> ')'
| '(' ')'
<OptArgList> ::= <ArgList>
|
<ExpList> ::= <Expression> ',' <ExpList>
| <Expression>
<QualifiedId> ::= <QualifiedIdPart> '.' <QualifiedId>
| <QualifiedIdPart>
<QualifiedIdPart> ::= Identifier <OptIndex>
| Identifier <ArgList> <OptIndex>
<OptIndex> ::= '[' <Expression> ']'
|
<Assignment> ::= <QualifiedId> <OptIndex> '=' <Expression>
<ReturnExpression> ::= 'return' <Expression>
| 'return'
<Expression> ::= 'Iif' '(' <OrExp> ',' <Expression> ',' <Expression> ')'
| <OrExp>
<OrExp> ::= <OrExp> 'Or' <XorExp>
| <XorExp>
<XorExp> ::= <XorExp> 'Xor' <AndExp>
| <AndExp>
<AndExp> ::= <AndExp> 'And' <CmpExp>
| <CmpExp>
<CompareOp> ::= '<' | '>' | '<=' | '>=' | '=<' | '=>' | '<>' | '='
<CmpExp> ::= <CmpExp> <CompareOp> <ShiftExp>
| <ShiftExp>
<ShiftExp> ::= <ShiftExp> 'Shl' <AddExp>
| <ShiftExp> 'Shr' <AddExp>
| <AddExp>
<AddExp> ::= <AddExp> '+' <MulExp>
| <AddExp> '-' <MulExp>
| <MulExp>
<MulExp> ::= <MulOp> '*' <UnaryOp>
| <MulOp> '\' <UnaryOp>
| <MulOp> '/' <UnaryOp>
| <MulOp> 'Mod' <UnaryOp>
| <UnaryOp>
<UnaryOp> ::= 'ref' <UnaryOp>
| '-' <UnaryOp>
| '+' <UnaryOp>
| 'Not' <UnaryOp>
| <PrimaryExp>
<PrimaryExp> ::= <QualifiedId>
| StringLiteral
| IntLiteral
| RealLiteral
| BinLiteral
| HexLiteral
| OctLiteral
| 'true'
| 'false'
| 'null'
{String Chars} = {Printable} - ["]
{Hex Digit} = {Digit} + [abcdef]
{Oct Digit} = [01234567]
{Bin Digit} = [01]
{WS} = {Whitespace} - {CR} - {LF}
{Id Head} = {Letter} + [_]
{Id Chars} = {Id Head} + {Digit}
NewLine = {CR}{LF}? | ':'
Whitespace = {WS}+ ( '_' {WS}* ( {CR}{LF}? | ':' ) )?
ID = {Id Head}{Id Chars}*
StringLiteral = '"' ( {String Chars} | '""' )* '"'
IntLiteral = {Digit}+
HexLiteral = '&H' {Hex Digit}+
OctLiteral = '&O' {Oct Literal}+
BinLiteral = '&B' {Bin Literal}+
RealLiteral = {Digit}* '.' {Digit}+ ( 'E' [+-]? {Digit}+ )?
| {Digit}+ 'E' [+-]? {Digit}+
[Ovu poruku je menjao Aleksandar Ružičić dana 12.03.2008. u 20:36 GMT+1]
stefanpn @ 12.03.2008. 22:29
Evo cisto nesto malo za pocetak...
Zapravo nista, samo sam dodao kursor na sliku i napravio izvrsnu verziju :(
Ali ovaj projekt smo i zapoceli da bi FreeBASIC priblizili onima koji i nisu bas puno upoznati sa njim... Tako da mislim da im treba neki ovako prost primer... HELLO WORLD sa dve slike... :)
Aleksandar Ružičić @ 12.03.2008. 22:54
heh, izgleda malo mracno, moracu da posvetlim grafiku malo :)
ali lep primer, mada si trebao da koristis double buffering, posto se na mojoj jadnoj grafickoj pojavljuje mouse trail :)
stefanpn @ 13.03.2008. 00:20
Koristio sam double buffer. Trail pojavljuje zato sto sam tako ja postavio... Nema brisanja ekrana, nego se pozadinska slika crta sa alfablendingom(50%) preko postojeceg ekrana.
Aleksandar Ružičić @ 13.03.2008. 00:58
pa cim crtas sa alphablendingom onda to nije double buffering :)
double buffering ti je kad sve crtas u memoriji (ne direktno na ekran) pa onda prekopiras (bez blendinga, jer je to zahtevna operacija) to na ekran...
sad ovih dana cu ja uraditi GFX modul sa funkcijama za crtanje lejera i sprajtova pa cemo da uradimo ove screenove... a ti kad zavrsis Map Editor onda cemo da crtamo texture za mape (iskoristicemo ono sto ima u SpriteLib-u, al cemo dosta prepraviti i dodati nase teksture)...
stefanpn @ 13.03.2008. 01:01
Pogledaj kod...
Ja ovde imam dve stranice u memoriji. Pa dok se na jednoj "crta". Druga je prikazana, pa se onda uradi FLIP, pa se crta na drugoj a prva je prikazana i tako u krug... To se valjda zove Double Buffer?
Aleksandar Vasic @ 13.03.2008. 09:42
valjalo bi da bude malo svetlije,e i meni se javlja trail,cak mi i slika malo, kako da kazem, vibrira :D
stefanpn @ 13.03.2008. 11:39
To se desava samo kada program radi na 16 bpp, problem je sa alpha blend-om... Ispravice se.
Aleksandar Vasic @ 13.03.2008. 11:46
ja sam ukljucio na 32 bpp i isto se desilo
stefanpn @ 13.03.2008. 12:59
Posalji screenshot, ako mozes na 16 bpp i na 32 bpp.
Eurora3D Team @ 13.03.2008. 14:40
Prebacio sam ovaj tvoj primer u moj framework
Fajl je na
http://www.eurora3d.com/elitesecurityplugin/EliteTanks.zip
Pogledaj EliteDownloadCompleted funkciju i funkciju na samom kraju EPlg.bas fajla , cela implementacija je u te dve funkcije.
Inace kod mene ovaj primer radi u sve 4 varijante (na 16 bpp malo trepce tamo gde je prosao kursor)
Pozdrav
Probao sam i iz browsera ... radi isto ... (normalno EPlg.dll za bowser treba da je komajlovana u windows\system32 folderu)
Eurora3D Team @ 13.03.2008. 15:02
Palo mi je na pamet ... mozda je bolje da napravite samo framework za igru a da sve ostalo (slike , script itd) bude u jednom komrpesovanom fajlu. Tako bi se lakse pravile nove igre (samo se napravi novi fajl igre) a i mogli bi da iskoristite plugin framework za online igranje ...
Dok se igra pravi taj fajl moze da bude predstavljen kao folder , pa na kraju moze da se doda kompresija / dekompresija
stefanpn @ 13.03.2008. 17:45
A sta cemo sa bass.dll, zlib.dll i koje cemo dll vec koristiti? Njih ne mozemo u neku datoteku.
Ali bi bilo lepo da sve bude u jednoj datoteci. Nego moze li browser plugin recimo preuzeti zip arhivu, pa je raspakovati i pokrenuti u browseru, jer i onako mora da preuzme resurse i dll, pa bi mu to bilo isto samo sto bi ovako mozda bilo jednostavnije.
Kad pokrenem ovaj poslednji plugin iz browsera on ne moze da ucita slike... Ali sa EPlgTestDlg.exe radi lepo.
Gde bi trebao da se nalazi folder GFX da bi ovaj mogao da ucita slike kada se pokrece iz browsera?
SetCurrentDirectory(CFile)
Tj. gde je Cfile?
Inace jako mi se dopada kako ovo funkcionise a i cela ideja je ok.
Aleksandar Ružičić @ 13.03.2008. 18:24
sto se tice pakovanja fajlova, ja sam to imao u planu, za grafiku, zvuk i mape. malo kasnije cu da napisem Packer (bez kompresije, zbog brzine ucitavanja) pa cu da okacim ovde...
Shadowed @ 13.03.2008. 19:53
wtf se desilo? Eurora 3D team je imao duplu poruku i ja obrisao jednu, sad nema ni jedne. Izgleda da je u isto vreme neko brisao onu drugu :)
Eurora3D Team @ 13.03.2008. 19:59
bass.dll, zlib.dll itd. Najbolje da se instaliraju sa pluginom (jednom) a kad se downloaduje samo se skida fajl (kao npr flash jednom se instalira a posle kad se otvori stana downloaduje samo svoj fajl)
A ovo za folder malo je komplikovano . Trebalo bi da promenis src parametar u strani na folder gde su ti slike ali tad FF nebi aktivirao plugin (on aktivira plugin jedino ako je src fajl sa odredjenom ekstenzijom .esf). Najbolje promeni
Code:
SetCurrentDirectory(CFile)
u
Code:
SetCurrentDirectory("C:\NekiFolder\gfx\")
Folder gde su ti slike sa
Code:
\
na kraju i kompajluj EPlg.dll u
windows\system32
Al sam zakomplikovao objasnjenje :) ...
Eurora3D Team @ 13.03.2008. 20:01
Citat:
Shadowed: wtf se desilo? Eurora 3D team je imao duplu poruku i ja obrisao jednu, sad nema ni jedne. Izgleda da je u isto vreme neko brisao onu drugu :)
Ja sam obrisao drugu u istom trenutku :) ... Obrisi ovu ako je offt...
Eurora3D Team @ 13.03.2008. 20:11
Da i (ostao sam nedorecen

) Ovo gore vazi samo za ovaj test, u pravom pluginu mi bi stavili pravi fajl sa neta u stranu (to bi bila nasa arhiva) FF bi downloadovao to na lokalni HD i poslao bi FilePath tog downloadovanog fajla sa lokalnog diska u EliteDownloadCompleted funkciju. Ti fajlovi koje FF downloaduje i snima na HD nemaju extenziju i ime im je random (nesto kao edeqwe23 u tmp folderu) ali to nije bitno. Mi onda otvaramo taj fajl (koji je isti kao i onaj sa neta) i raspakujemo ga u neki folder (npr tmp\nesto) i postavljamo FilePath na taj folder. To mi je bila ideja ...
U stranu moze da ide i fajl (arhiva) sa lokalnog diska i ovo posle ide isto ...
Aleksandar Ružičić @ 13.03.2008. 21:45
nije losa ideja da se cela igra uradi preko skripti, onda bi mogli da iskoristimo ovaj tvoj plugin da se igra izvrsava u browseru, samo ne znam koliko je to pametno jel flash vec postoji, zar ne?
naravno, mozemo to da uradimo cisto kao primer koda... al da prvo zavrsimo engine i ovu igru pa je posle lako doradjivati/prepakivati...
Eurora3D Team @ 13.03.2008. 21:49
Pa nek postoji flash 100 puta

(ja nisam ljubitelj flasha) Mi mozemo da uradimo ono sto flash jos ne moze (OGL,DX pristup File sistemu ....)
Aleksandar Ružičić @ 13.03.2008. 22:05
da, ali ko ce hteti plugin koji dozvoljava svakom sajtu da mu prcka po fajl sistemu?
ali naravno da sam ja da se uradi nesto nase, kao sto sam rekao cisto kao primer...
stefanpn @ 13.03.2008. 22:12
:)
Vecina igraca i internet surfera i nezna sta je fajlsistem...
Eurora3D Team @ 13.03.2008. 22:27
Pa valjda ce ovi ljudi sa ovog sajta da veruju :) Mislim moze da se postavi i source kod pa nek sami kompajluju.
Koliko svako od nas instalira nekih pluginova sa neta ... a postoji i AV i sl . Kao sto rade i svi drugi ne treba nam neka topla voda ... dobro za prostu igru stvarno ne treba browser podrska ... al sto da ne kad se moze :)
[Ovu poruku je menjao Eurora3D Team dana 14.03.2008. u 23:52 GMT+1]
Aleksandar Ružičić @ 13.03.2008. 22:32
za par dana cu valjda zavrsiti scripting system (kompajler sam zapoceo, gotov je lexical analyzer, sad radim na parseru) pa kad budemo imali i kompajler i virtual machine videcemo koliko je izvodljivo imati komplet igru uradjenu preko skripti (pa ako se pokaze da nema velikih nedostataka, pre svega sto se tice brzine, onda mozemo i da napravimo da se igra u browseru)
stefanpn @ 14.03.2008. 21:42
@Aleksandar Vasic
Evo ti primer za VB i BASS.DLL
Samo mi nije bas najjasnije kako se zaustavlja, pa sam ja sam to ovde resio sa BASS_Stop, samo posle toga da bi se opet pokrenulo mora da ide BASS_Start
Svaki put pozivam i Call BASS_MusicPlay i Call BASS_StreamPlay jer mora da bude ili jedno ili drugo(ili Muzika ili Strim) pa da nebismo pisali dve f-je moze sve u jednoj...
Aleksandar Vasic @ 14.03.2008. 23:10
Evo uz tvoju pomoc sam reshio moj problem shto nije htelo da radi,samo je bilo potrebno dodati f-ju LOADBASS ;)
Edit: Izgleda da ne radi Balance
Aleksandar Vasic @ 14.03.2008. 23:41
Evo ispravke,@stefanpn mi je napomenuo da se ne chuju svi zvucnici,pa sam to ispravio,a balance sam sredio za po Y osi,a za X cu naknadno.
Eurora3D Team @ 15.03.2008. 00:22
Za FreeBasic ce ceo ovaj Bass modul morati da se prebaci u FreeBasic fajlove ... (ako to vec neko nije negde uradio)
Aleksandar Vasic @ 15.03.2008. 00:23
naravno,prvo sam odradio u vb,a sad cu da prevodim u freebasic
p.s. u fb-u ima header bass.bi ;)
Eurora3D Team @ 15.03.2008. 00:33
@Aleksandar Vasic
Evo ti Subrutina za Volume
Code:
Private Sub Slider1_Change()
SetVolume CLng(Slider1.value)
End Sub
Samo podesi slider na moguci minimum i maximum
A mozes i ovako
Code:
SetVolume CLng(Slider1.value) * NeskiBroj
Da nebi bili mali podeoci na slideru
Eurora3D Team @ 15.03.2008. 00:34
Aha imaju bass.bi :)
Ljudi su se bas naradili oko tog FreeBasica ...
Aleksandar Ružičić @ 15.03.2008. 08:17
sto se tice Sound (Music) modula, mislim da nam je ipak dovoljno samo left/right balance, tj da ne komplikujemo sa front/rear, jer nije bas jednostavno (malo sam procesljao BASS dokumentaciju) znaci Y nece uticati na front/rear nego na volume i to u zavisnosti od blizine dogadjaja igracu (u sourceu koji dajem vidi se o cemu pricam), i ono sto nam je potrebno to je pustanje fajla koji se nalazi u memoriji (jer ce se svi zvuci/muzika nalaziti zapakovani u PCKD fajlove, danas cu raditi na Packeru i PCKD formatu, pa kad zavrsim i istestiram okacicu source), znaci evo sta nam treba:
Code:
' ovo je samo za testiranje, bice deklarisano u glavnom modulu
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
#define CENTER_X SCREEN_WIDTH / 2
#define CENTER_Y SCREEN_HEIGHT / 2
Dim Shared SFXVolumeLevel As Integer = 75 ' u intervalu 0 - 100
Dim Shared PlayerY As Single = CENTER_Y ' ovo ce biti definisano u glavnom modulu, a predstavlja tenutnu Y poziciju igraca na ekranu
Enum SFXType ' i ovo ce biti deklarisano u glavnom modulu...
sfxExplosion = 0
sfxBullet = 1
sfxWallHit = 2 ' ovo navodim samo kao primere...
End Enum
#include "bass.bi"
Namespace Music
Sub Initialize
BASS_Init -1, 44100, 0, 0, 0
End Sub
Sub Shutdown
BASS_Free
End Sub
Sub PlaySFX(sfx As SFXType, X As Single = CENTER_X, Y As Single = CENTER_Y)
Dim memloc As Byte Pointer
Dim length As Integer
' za ovo pogledajte dole (bice definisano u nekom od drugih modula)
GetSoundData sfx, memloc, length
Dim stream As Integer
stream = BASS_STreamCreateFile(1, memloc, 0, length, BASS_STREAM_AUTOFREE) ' ovde je potrebno autofree
Dim As Integer vol, pan
' balance:
pan = (X / SCREEN_WIDTH) * 200 - 100 ' u intervalu od -100 (levi zvucnik) do +100 (desni zvucnik)
' volume: (ovo me mrzelo da malo bolje uradim, ali uglavnom sto je dogadjaj udaljeniji od igraca slabije se cuje)
vol = SFXVolumeLevel - Max(Min((Abs(Y - PlayerY) / SCREEN_HEIGHT, 0.8), 0.5) * SFXVolumeLevel
BASS_ChannelSEtAttributes stream, -1, vol, pan
BASS_ChannelPlay stream, 0
End Sub
End Namespace
ovo sam sve pisao iz glave (gledajuci u BASS manual), pa treba ovo i istestirati, Aleksandrew tebi prepustam ovaj deo :)
e da, i "for testing purposes" ovakva f-ja moze da se koristi da se fajl (wav/mp3/ogg...) ucita u memoriju (byte niz):
Code:
Type MemoryFile
Data As Byte Pointer
Size As UInteger
Declare DEstructor
End Type
Destructor MemoryFile
If This.size > 0 Then Delete[] This.Data
End DEstructor
Function LoadFileToMemory(Filename as String) As MemoryFile Pointer
Dim fn As Integer = FreeFile
Dim size as UInteger
dim mf As MemoryFile POinter = New MemoryFile
Open Filename For Binary As fn
mf->Size = LOF(fn)
mf->Data = New Byte[mf->size]
GEt #fn, , *(mf->Data), mf->Size
Close fn
Return mf
ENd FUnction
' ovako se fja koristi:
Dim Shared mf1 As MemoryFile Pointer
Dim Shared mf2 As MemoryFile Pointer
mf1 = LoadFileToMemory("C:\bla.wav")
mf2 = LoadFileToMemory("C:\blabla.wav")
' funkcija za "prevodjenje" SFXType vrednosti u memorijsku lokaciju i velicinu
Sub GetSoundData(sfx As Integer, byRef memloc As Byte Pointer, byref length As UInteger)
Select Case sfx
Case 0
memloc = mf1->data
length = mf1->size
Case 1
memloc = mf2->data
length = mf2->size
End Select
End Sub
' "pustanje" zvuka
#include "music.bas"
Music.Initialize
Music.PlaySFX fxExplosion
Sleep 2000 ' nisam bas siguran dal ce ovo da zaustavi zvuk (nadam se da nece)
Music.PlaySFX fxBullet
sleep 3000
' ovo je vazno:
Music.Shutdown
Delete mf1
Delete mf2
moguce je da sav ovaj kod sto sam dao ne radi "iz prve", tj mozda bude i compie-time gresaka, ali nisam u mogucnosti sada da isprobam ovo posto nisam kuci i nemam fbc ovde...
uostalom trebalo bi da se iz koda vidi ideja, pa nek Aleksandar to iskoristi u izradi Music modula
Shadowed @ 15.03.2008. 08:36
Citat:
Aleksandar Ružičić: jer ce se svi zvuci/muzika nalaziti zapakovani u PCKD fajlove, danas cu raditi na Packeru i PCKD formatu
Koji je razlog za to? Sta fali izvornom formatu ako vec nema kompresije? :)
Aleksandar Vasic @ 15.03.2008. 13:13
@eurora - to je definitivno bolje reshenje ;)
@ruzicic - ovo ce biti ovde ovo onde i na kraju neke stvari fale da bi se kompajliralo kako treba :D
Code:
Dim Shared SFXVolumeLevel As Integer = 75
#Include "bass.bi"
Namespace Music
Sub Initialize
BASS_Init -1, 44100, 0, 0, 0
End Sub
Sub Shutdown
BASS_Free
End Sub
Sub PlaySFX(sfx As SFXType,X As Single = CENTER_X,Y As Single = CENTER_Y)
Dim memloc As Byte Pointer
Dim length As Integer
GetSoundData sfx, memloc, length
Dim stream As Integer
stream = BASS_StreamCreateFile(1, memloc, 0, length, BASS_STREAM_AUTOFREE)
Dim As Integer vol, pan
pan = (X / SCREEN_WIDTH) * 200 - 100
vol = SFXVolumeLevel - Max(Min((Abs(Y - PlayerY) / SCREEN_HEIGHT, 0.8), 0.5) * SFXVolumeLevel)
BASS_ChannelSetAttributes stream, -1, vol, pan
BASS_ChannelPlay stream, 0
End Sub
Sub PlayBGND(vol As Integer,Repeat As Integer,Rand As Integer)
If Rand = 1 Then Randomize song 'gde je song enum gde su definisani background pesme(verovatno u glavnom modulu)
If Rand = 0 Then song = 0
Dim bstream As Integer
If Repeat = 0 Then bstream = BASS_StreamCreateFile(1,song,0,0,BASS_STREAM_AUTOFREE)
If Repeat = 1 Then bstream = BASS_StreamCreateFile(1,song,0,0,BASS_SAMPLE_LOOP)
BASS_ChannelSetAttributes bstream, -1, vol, -101
BASS_ChannelPlay stream, 0
End Sub
End Namespace
Da li si pod Autoplay mislio da se jedna ista pesma vrti,ili da na listi nastavlja dalje...I da li ce za nasumicno biranje pesama, kôd biti u music modulu ili u nekom drugom??
[Ovu poruku je menjao Aleksandar Vasic dana 15.03.2008. u 14:43 GMT+1]
[Ovu poruku je menjao Aleksandar Vasic dana 15.03.2008. u 14:48 GMT+1]
Eurora3D Team @ 15.03.2008. 13:58
Citat:
Shadowed: Koji je razlog za to? Sta fali izvornom formatu ako vec nema kompresije? :)
wav formatu mnogo fali ako nije kompresovan a downloaduje se sa inerneta npr. Normalno ako nema kompresije onda je svejedno :)
Cisto ideja u vezi performansi ... ako ce muzicki fajlovi da budu veliki (kad su dekompresovani i ucitani u RAM) mislim da nije dobra ideja da se drze u buffrerima (byte ptr) celo vreme. Sve ove Stefanove graficke aplikacije angazuju mnogo CPU vremena (kod mene 50% ... imam dual core procesor) pa jos ako se doda mnogo ram-a mislim da ce to znacajno da uspori igru na prosecnom komijuteru.
Pokusao sam da nadjem uzrok tolike iskoriscenosti CPU-a ali nisam nista mogao da otkrijem. Vidim da FreeBasic ima 2 fn za OGL ScreenRes i Screen (i cini mi se da se linkuju sa drugim bibliotekama ... ) U svakom testu sam dobio isto (50%) cak i u najjednostavnijem kodu sa jednom linijom koja kreira window i prostom Msg Loop za izlaz.
Eurora3D Team @ 15.03.2008. 14:49
Inace OpenGL je biblioteka sa visokim performansama koja moze da prikazuje 2D/3D scene sa minimalnim iskoriscavanjem memorije i CPU (daleko manje nego ovde a sa mnogo vecim 3D modelima)
Shadowed @ 15.03.2008. 14:56
Krcko rece da nece biti kompresije. Sto wav? Sto ne mp3?
Eurora3D Team @ 15.03.2008. 16:56
Verovatno je hteo da koristi sve formate (ustvari 3 koja su nabrojena) a ne samo jedan
@Aleksandar Ružičić
Zar ovde ne ide AddressOf (@) umesto direferenciranja (*)
Code:
GEt #fn, , *(mf->Data), mf->Size ' @(mf->Data)
Nisam probao da kompajlujem ... samo pitam
Aleksandar Ružičić @ 15.03.2008. 18:01
@Shadowed: nece biti kompresije zbog brzine ucitavanja, mada moze i to lako da se doda, a razlog zasto pakovati sve u jedan fajl je cisto zbog toga da napravimo nesto "fensi", ovaj projekat je ionako cisto vezbanje programiranja u fb-u, a i jos jedan razlog je sto cemo tako smanjiti broj fajlova i na neku nacin obezbediti "kradju" grafike/zvuka, naravno ovo nama uopste nije bitno jer cemo ionako koristiti free sprajtove i free muziku/zvuke, ali od kada sam u Neighbours Of Hell video da za grafiku imaju gfxdata fajl a za zvuk snddata (znaci ukupno dva fajla) znaci dva fajla sa resursima ukupno, oduvek sam hteo da kad budem pravio neku igru uradim to isto :)
@Eurora: ne, mf->Data je pointer, a Get/Put ne smes da p[rosledis pointer, jer nece menjati vrednost na koju pokazuje pointer, nego ce promeniti sam pointer (tretira ga kao Integer tip)....
Eurora3D Team @ 16.03.2008. 00:22
@Aleksandar Vasic
Napravio sam test kod za Bass i FreeBasic. Nisam vest u FreeBasicu zato kod vise lici na C++

(pogotovo win api funkcije)
Ubacio sam osnovni modul za bass (i ispobao sam sve).
Moze da ucita fajl sa diska i ima play, pause i stop dugmad (imas i komentare u kodu)
Imas i skroler za ton.
Nisam dodavao ove Aleksandrove funkcije za pustanje iz memorije (prepisao sam samo dve definicije za Enum i jedan Type ali nisu koriscene)
Ostalo dopuni

Pozdrav
navikao sam da pisem na Engleskom menije , dugmad ... bar su komentari na Srpskom 
Aleksandar Ružičić @ 16.03.2008. 05:14
malo sam preleteo pogledom preko ovog koda i imam jednu zamerku - Pause/Stop ne rade a razlog je ovo (u SoundModule.bi):
Code:
Dim hStream As Long = 0
Dim lpFile As ZString*260
da bi u freebasic-u promenljiva bila vidiljiva u svim procedurama mora biti deklarisana kao Shared, znaci:
Code:
Dim Shared hStream As Long = 0
Dim Shared lpFile As ZString*260
Eurora3D Team @ 16.03.2008. 10:50
Uploadovao sam opet.
Juce sam kad sam zavrsio uploadovao (radilo je) pa sam razmisljao sta ako neko otvori novi fajl dok jedan svira i prepravio kod i uploadovao ponovo al ta druga verzija je imala gresku...
Ovo je jedina razlika (sad radi) ... ovo sto je zaklonjeno
Code:
Case IDC_PLAY
'Ovde
If Not lpCurrentFile = "" Then
'If Not Music.PlayFile() Then
'Music.LoadFile(Music.lpFile)
Music.PlayFile()
'EndIf
Else
I ovaj zip fajl od juce je zamenjen (na oba mesta je ista vezija) ....
[@Aleksandar Ružičić Hvala sto si mi javio da ne radi]
[Ovu poruku je menjao Eurora3D Team dana 16.03.2008. u 16:10 GMT+1]
Aleksandar Vasic @ 16.03.2008. 17:44
tnx bi ce mi od velike pomoci ;)
Aleksandar Vasic @ 17.03.2008. 00:21
eo uz pomoc krcka napravih ja to nekako ;)
pa...testirajte :P
p.s. nemojte komentarisati zvukove :PP
markozelenovic @ 22.03.2008. 22:06
Dobro ide ,Doobro.
Eurora3D Team @ 27.03.2008. 20:36
Malo je van teme :) ali jel nekom poznat neki nacin (softver) za prevodjenje VB6 koda u FreeBasic ?
Dali tako nesto postoji ?
Aleksandar Vasic @ 27.03.2008. 20:41
lol nema brate :D
Eurora3D Team @ 27.03.2008. 21:53
Kako napreduje ovaj projekat ? Jel radite ?
stefanpn @ 27.03.2008. 22:05
Pa radimo, samo je pitanje: "sta radimo?". Ovaj salim se, ali nije daleko od istine, bar sto se mene tice, ja imam sad puno obaveza, pisem nesto komercijalno a i fax me malo "gusi", ali cim "ukradem" neko slobodno vreme bacam se na projekt, jako bih voleo da vidim da smo zapravo nesto uradili...
Pozz...
Eurora3D Team @ 27.03.2008. 22:29
I mi ostali bi voleli na kraju da vidimo kako je ispalo :)
Pozdrav
Aleksandar Vasic @ 27.03.2008. 22:30
ja mogu samo da kazem "Ready & Waiting" ili "Standing by" :P
samo cekam naredjenja :P
stefanpn @ 27.03.2008. 22:31
Najkasnije do 6 ujutru, dobicete neko parce koda od mene. Evo sad sam poceo da radim, nesto.
stefanpn @ 28.03.2008. 11:06
Nije bas 6 ujutru, ali mi se jako prispavalo sinoc oko 3 pa nisam mogao sve da zavrsim na vreme :(
Evo mali demo za dva igraca
kontrole su:
Code:
plavi tenk | zeleni tenk | f-ja
R strelica gore | ubrzanje
F strelica dole | kocenje
D strelica levo | okretanje u levu stranu
G strelica desno| okretanje u desnu stranu
A CTRL | pucanje
cilj je da se pogodi drugi igrac ali da se ne pogodi ptica
koristi se fb-ext-lib, tako da ce vam mozda traziti neke dodatnje dll-ove a mozda i nece jer ih ovaj primer ne koristi :)
sve u svemu za par sati pisanja, i nije toliko lose
samo kod je malo nevesto napisan jer nisam odmah isplanirao kako to sve treba da izgleda, nego sam dodavao deo po deo, opisao sam sve lepo u samom kodu
preporucujem da se broj metaka koji jedan igrac moze odjedanput da ispali sa 12 smanji na 5, mozda bi se malo popravila igrivost, to vam je promenljiva brMet = 4
'Ajd' da cujem komentare.
Mogao bi Aleksandar malo da se poigra sa zvukom....
stefanpn @ 28.03.2008. 11:52
Ipak trebaju neki dll-ovi, za sad samo jpeg62.dll ali evo sva tri dll-a samo da se raspakuju u system32 ili pored aplikacije.
Eurora3D Team @ 28.03.2008. 15:06
Radi :) Mislim dobro je. Dobro si uradio "fiziku" :)
Jel jos grafika trosi mnogo CPU vremena ?
Sta se u FB koristi za net (ima neka biblioteka i sl) Ovo bi moglo da se napravi kao online (TCP , server je program koji prvi pokrene igru ...)
Gde moze da se nadje ova fb-ext-lib
Usput trebala je zlib1.dll (mislim ja je nisam imao)
stefanpn @ 28.03.2008. 15:22
Problem zauzeca procesora sam jednostavno resio sa sleep. A sto se tice igre u mrezi, free basic moze da koristi Winsock API iz biblioteke wsock32.dll mislim da je ima svako na racunaru.
fb-ext-lib
ovde
ne znam zasto mu trebaju: freetype6.dll, jpeg62.dll i zlib1.dll kada ih ja nista ne koristim, to mi se malo ne svidja koz extlib-a a i povrsina koja je transparentna kod 32 bpp nije transparentna u 16 bpp kad se koristi f-ja za rotaciju.
sve tri biblioteke imate u system32.rar, u predhodnoj poruci.
Eurora3D Team @ 28.03.2008. 15:35
Valjda ih linkuje uvek kad se koristi ta ext lib
jpeg koristi zip kompresiju (to znam)
Sta mislis zar 640, 480 nije malo prevazidjena ? Mozda je bolje sa jednom rezolucijom vise ...
Mada sa druge stane ovo je onaj stari stil igara tako da i ta mala rezolucija daje neku car :)
stefanpn @ 28.03.2008. 22:19
Sto se tice rezolucije, nije nikakav problem da se prebaci na 800x600 i vise, ali kao sto ti rece nekako mu ovo daje car, samo to cemo i onako resiti kad se uradi citanje mapa i grafika, ovo je samo za testiranje.
Evo malo ispravljene verzije:
Dodao sam malo stelovanja za timer tako da ce sad bolje raditi i na starim masinama. Takodje sad je ceo ekran "obojen" tj popunjen. Ali me brine to sto je igra nekako prezahtevna i ako nema gotovo nista ... samo malo grafike. Tako da se pitam da li iko zna kako da sve ovo ubrzamo malo? Imam neki osecaj da bi nesto ovakvo radilo i na C64, tako da bi ova danasnja "cudovista" od racunara trebala da pojedu ovo.
Eurora3D Team @ 29.03.2008. 12:46
Skinuo sam predzadnju verziju i ext lib da bi mogao da je kompajlujem da radi u prozoru (da bi mogao da vidim Task Manager). Ta verzija trosi otprilike 20% procesorskog vremena ... i tu je po meni problem (ili ova graficka biblioteka za FB nije dobro odradjena ili ima neka druga caka koja mi jos uvek nije poznata). Ti si rekao da se zbog timera smanjila iskoriscenost CPU (u onim ranijim primerima meni je tosilo 50% a sad 20%) ... trebalo bi pretraziti net ili FB forume za ovo. Po mom misljenju ovaj program nebi trebalo da uzima vise od 2% CPU vremena ...
Isto kad uhvatim vremena zavrsicu onaj Browser plugin framework za FB u browseru. Ideja mi je da svi fajlovi budu kompresovani u jedan fajl za plugin (kao sto si ti ovde stavio sve u rar). Da plugin downloaduje i dekompresuje sve u temp folder i pusti odatle (sve znaci sve i exe i dll koji su potrebni i ostalo). Isto cu da uradim i aplikaciju za distribuciju koja ce da ukompresuje sve u u jedan plugin fajl ... Ovakvim pristupom FB programer nece morati da se bavi mojim c++ like kodom nego kad zavrsi sve upakuje sa tom aplikacijom i postavi na net.
stefanpn @ 29.03.2008. 13:27
Nisi morao da je kompajliras da bi dobio prozor, moze i sa ALT-ENTER da se menja izmedju prozora i celog ekrana.
Ova aplikacija radi tako sto treba da 30 puta u sekundi prebaci iz RAM-a u VRAM po ~900KB(i jos malo vise zbog sprajtova) sto mu dodje preko 26Mb u sekundi. Kada bi mogao da slike prebacim u VRAM mislim da bi mnogo brze radilo sve. Takodje se razmisljam da dodam double buffer, ali ne obican double buffer vec da se u jednoj grafickoj strani nalazi pozadina, a sprajtovi se docrtavaju naknadno na vidljivoj strani. S tim da se prva strana ne menja ukoliko nema pomeraja u matrici.
To za plugin u koji mogu samo da posaljem jednu datoteku (tipa rar ili zip ili bilo koji format) i da ne mislim o tome kako radi vec samo da radi je super. Samo me zanima jel je sve to ograniceno na Windows okruzenje ili moze da radi i pod Linux-om i MAC OS-om?
Eurora3D Team @ 30.03.2008. 00:25
Eto ovo za ALT-ENTER nisam ni znao :) Hvala ...
To o sprajtovima i buferovanju tu vidim da imas dosta iskustva ... ja nisam radio u FB ranije. Prvi put sam cuo za njega od vas ovde na forumu a jedina ozbiljnija stvar koju sam napravio u njemu je onaj plugin. Video sam (po forumu) da si se ti mnogo vise bavio time a imas i solidno opste znanje tako da tu mogu samo da potvrdim (prihvatim) ono sto kazete ti i Aleksandar. Ja sam se bavio vise nekim sistemskim stvarima u c/c++ i asm a za ove "svakodnevne programe" VB6 i sad malo java. Ocu da kazem mogao bi da vam napisem neku funkciju u FB inline assembleru za brzo (najbrze :) ) prepisivanje memorije sa nekog dela memorije u neki drugi ali mislim da ti to ovde nebi resilo problem jer vidi. Probao sam u FB da napravim OGL window sa screenres (samo jedna linija koda) i jedan loop za izlaz i tu je trosio 50% procesora (imam dualni sto znaci 100% jednog). Znaci nesto u tim FB bibliotekama nije ok ili postoji neka caka. Istovetna c++ aplikacija bi trosila mizerno malo CPU vremena. (ove FB biblioteke su verovatno bazirane na c jeziku znaci brzina skoro kao asm ali negde nesto ne radi kako treba).
Ovaj plugin framework je za win32 (dll i exe su windows executables) na Linuxu i MAC-u ovi fajlovi mogu da rade samo na emulatoru ili slicnom softveru.
Nisu Fles i Java dzabe toliko popularni :) Ljudi su dosta radili da naprave to za vise platformi
I ovo
Slicno ponasanja (trosenje CPU vremena) u c++ moze da se desi kad je u window proceduri (funkciji koja obradjuje GUI window messages) napravljena neka graska. To i ovo sto si rekao za timer u msg loop me navodi na taj zakljucak koji sam ti rekao ...
[Ovu poruku je menjao Eurora3D Team dana 30.03.2008. u 01:37 GMT+1]
Aleksandar Vasic @ 30.03.2008. 11:03
nemojte se smejati ako lupetam,a mozda da pokushash da smanjih tih 900kb/s :D
stefanpn @ 30.03.2008. 14:13
Code:
&HFFFFFF - 24 bita
RRGGBB
E sad kod - 32 bita tu je 3 bajta za RGB i jedan bajt za AplhaBlend
Code:
&HFFFFFFFF
RRGGBBAA
(640 x 480 pixela) x 3 bita = 900 KB ali posto mi koristimo 32 bpp to mu dodje ne puta 3 kako sam ja racunao nego puta 4. pa mu dodje 1.17 MB + Sprajtovi pa sve to 30 puta u sekundi...
Sto mu dodje da tih 900 KB moze da se smanji samo ako se smanji rezolucija ekrana. Ali postoji i drugi "lek" za tu "boljku" a to je da se grafika ne prebacuje iz RAM-a u VRAM, nego da se slike uskladiste u VRAM i odatle prebacuju na vidljivi ekran. Za to se koristi DirectX ili OpenGL. Ali smo se mi dogovorili da radimo samo FreeBASIC.
@ EURORA3D
Nema to zauzece procesora veze sa grafikom, jer u FB-u da stavis i samo:
Code:
do while not multikey(1)
' Ne mora nista da se radi u petlji
loop
i zauzece procesora ce biti 100% t.j. na dva procesora 50%. Jer ce se vrteti u petlji koliko god procesor moze da postigne.
E sad kada se koristi SLEEP [milisecond] procesor je slobodan za to vreme u ms. I onda ce zauzece da jako da opadne...
znaci:
Code:
do while not multikey(1)
sleep 30
loop
i nece biti veliko zauzece.
Eurora3D Team @ 30.03.2008. 19:30
Ok kapiram ... tebi nije valjala msg loop
Evo ti kod iz FB helpa za dobru msg loop za GL window. Ovaj program kod mene angazuje 0% CPU vremena (nemerljivo malo) i 2000 K Memorije
Code:
'' include fbgfx.bi for some useful definitions
#include "fbgfx.bi"
Using fb
Dim e As EVENT
Dim As Integer x, y, pressed, col
Dim As Any Ptr img
ScreenRes 384, 64, 32,, GFX_SHAPED_WINDOW
'' create a fancy window shape
img = ImageCreate(48,8)
Draw String img, (0, 0), "GfxLib"
For y = 0 To 63
For x = 0 To 383
col = Point(x \ 8, y \ 8, img)
If (col <> RGB(255, 0, 255)) Then
col = RGB((x + y) And &hFF, (x + y) And &hFF, (x + y) And &hFF)
End If
PSet (x, y), col
Next x
Next y
pressed = 0
Do
If (ScreenEvent(@e)) Then
Select Case e.type
Case EVENT_MOUSE_BUTTON_PRESS
pressed = -1
Case EVENT_MOUSE_BUTTON_RELEASE
pressed = 0
Case EVENT_MOUSE_MOVE
If (pressed) Then
ScreenControl GET_WINDOW_POS, x, y
ScreenControl SET_WINDOW_POS, x + e.dx, y + e.dy
End If
End Select
End If
Sleep 5
Loop While Not MultiKey(1)
stefanpn @ 30.03.2008. 20:33
Ovaj kod angazuje 0% cpu zato sto radi sledece:
Code:
do
sleep 5
loop until mutlikey(1)
Tj skoro se nista ne desava u 99.99 % rada programa (ScreenEvent(@e) je sve vreme FALSE osim kad se prozor provlaci)...
Isto bi zauzimala i ona moja petlja da nije opterecena crtanjem grafike.
Za one koji nisu videli:
EliteTanks 360
http://217.26.67.168/uploads/1/9/1901925/tank%20360.rar
Eurora3D Team @ 31.03.2008. 00:36
Jeste ... upravu si. Doduse kod tebe sleep interval ima mnogo veci znacaj (probao sam sa 100 ms i CPU vreme je 6% al zato i sve ostalo u do while loop normalno radi spoije). Kad sam ja (nekad davno :) ) radio sa ovakvim stvarima secam se da nisam brisao ceo ekran nego samo objekte koji su promenili poziciju od proslog iscrtavanje a ako se nista nije promenilo odma sam prelazio u sledeci krug (ocitavanje tastature i ostalo)...
stefanpn @ 31.03.2008. 16:43
Sacekacemo Krcka da se javi, da vidimo dali ima neki konstruktivan predlog.
Malo bi bilo zamorno da se prati svaki pomeraj i sl... Ipak postoje Api f-je koje to mogu da odrade mnogo brze, i manje nerviranja. Ali ako mozes u ASM da napravis f-ju koja bi mogla da se poziva iz FB i da najbrze moguce kopira sadrzaj sa nekih lokacija iz video memorije na vidljivu stranu, i f-ju koja bi nam omogucavala da prebacimo neke slike u video memoriju. To bi moglo da resi problem.
Aleksandar Ružičić @ 31.03.2008. 19:32
sad sam pogledao ovo sto je Stefan radio i nije lose, ja se nisam javljao neko vreme jer imam mnogo obaveza na poslu, i jos uvek nemam dovoljno vremena da zavrsim engine koji sam poceo, ali uskoro cu ga zavrsiti pa kacim ovde.
sto se tice engine-a, gotovo je ucitavanje png slika (alpha-channel jos uvek malo zeza ali sredicu to) i delimicno je kompletan redraw sistem (engine koristi tehniku dirty rectangles sto znaci da se iscrtavaju samo oni delovi ekrana na kojima je nastala neka promena)
sto se tice kompajlera za EliteScript, on napreduje polako i verovatno ce biti gotov pre gfx engine-a (sto je bolje, jer ce imati vise vremena da se sam kompajler istestira)
k'o sto rekoh, cim stignem da zavrsim nesto postujem kod!
stefanpn @ 01.04.2008. 00:17
http://www.elitetanks.co.nr
BTW: Uzeo sam neki freehost i free domain i da vidite cuda: Nisu ubacili nikakve reklame i banner-e...
Pa sam ja uzeo i sam sam to uradio iz zahvalnosti :)
[krcko: izbrisan spam :D]
[Ovu poruku je menjao Aleksandar Ružičić dana 01.04.2008. u 14:59 GMT+1]
Eurora3D Team @ 01.04.2008. 12:32
A koji je host ... mislim koji im je sajt ?
Sad ces moci da isprobavas ove internet fore sto sam vam slao :)
... by the way :) provalio sam sajt po download URL-u ...
http://www.ypu.com/
stefanpn @ 01.04.2008. 12:43
bas taj ypu.com
i domain je
www.co.nr.
10GB prostora
12GB Mesecni Bandwith
nema reklama, bannera i sl.
FTP/PHP/MySQL
i sto je najbolje, radi brzo.
Aleksandar Vasic @ 01.04.2008. 13:16
sutra eventualno prekosutra cu ubaciti zvuk u primer stefanpn-a
Eurora3D Team @ 01.04.2008. 13:17
To majstore :)
Sad se baci i na internet proramiranje ...
A nisu zabranili mozda neke fajl extenzije (npr .exe i sl.)?, nema tih ogranicenja ... mislim uglavnom svi imaju neku caku koliko sam ja do sad video ...
stefanpn @ 01.04.2008. 13:21
Nema zabrane ni za sta s'tim da izvrsne datoteke i biblioteke moraju biti u zip ili rar arhivama.
I ne sme da ima pornografije i piratskog materijala.
Aleksandar Ružičić @ 01.04.2008. 14:01
jos nemamo igru a vec pravite sajt :)
nego, Stefane jesi li radio sta u vezi onih mapa i map editora?
stefanpn @ 01.04.2008. 15:41
Level edit ce brzo da iskoci
Nego jedno malo pitanjce...
Kako da pokupim resource za level-e kada ne znam ni u kom ce formatu biti upakovani.
Pa tu jos i taj AlphaBlend i PNG za koje VB nema ugradjenu podrsku.
Moram prvo da se dogovorim s' vama oko ulaznih formata. T.J. Odakle cu da vucem resurse. Iz jedne datoteke ili iz vise datoteka, bmp / jpg / gif / png ili MPF(Mose Pijade Format

) ovaj taj nas format. Posto se Level Editor radi u VB-u to i imamo vec dogovoren format map datoteke to ce sve brzo da ide, samo da sve karte budu na stolu

Aleksandar Ružičić @ 01.04.2008. 18:46
koristi PNG fajlove, sto se tice PNG-a u VB6 pogledaj
ovo (fenomenalan kod btw)
sto se tice organizacije fajlova, struktura foldera ce da izgleda ovako:
Code:
+-<Game install dir>
|
+---+-<src>
| |
| +---<mapedit> ... mapeditor source
| |
| +---<game> ... game source
| |
| +---<esc> ... esc source
|
+---+-<snd>
| |
| +---<sfx> ... ovde su specijalni efekti (zvucni)
| |
| +---<music> ... ovde je "pozadinska" muzika
|
+---+-<gfx>
| |
| +--+<0>
| | |
| | +--- 0.png
| | |
| | +--- 1.png ... i tako dalje
| |
| +--+<1>
| |
| +--- 0.png
| |
| +--- 1.png ... i tako dalje
|
+---+-<maps>
| |
| +--- 0.map
| |
| +--- 1.map ... i tako dalje
|
+---+-<scripts>
| |
| +--- enemy0.esx
| |
| +--- enemy1.esx ... i tako dalje
|
+--- mapedit.exe
|
+--- game.exe
|
+--- esc.exe
|
+--- game.conf
tebe interesuju samo
\gfx\ i
\maps\ folderi, u
\gfx\ folderu se nalaze podfolderi koji predstavljaju
tileset-ove (to je jedan od onih flegova u ELITEMAP formatu) u svakom od tih tileset foldera se nalaze png fajlovi koji nose imena
0.png,
1.png,
2.png itd...
u
maps folderu ti se nalaze mape, isto su "nazvani"
0.map,
1.map,
2.map itd.
masterjoda @ 02.04.2008. 09:23
Aleksandar Ružičić @ 02.04.2008. 10:28
dobro izgleda (mada imas gramatickih gresaka :D), ako hoces da ucestvujes u projektu uradi nesto vezano za igru koju pravimo (klon battle city-a), recimo main menu screen, game screen, tile-ove (skini neki battle city klon pa vidi sta sve treba) pa okaci ovde, ako bude dobro primljen si :)
pozdrav
masterjoda @ 02.04.2008. 11:13
Mislio si da uradim pocetni ekran i jednu mapu. Gde da napravim mapu u 3ds max-u ili photoshop-u?
Aleksandar Ružičić @ 02.04.2008. 11:56
pa posto radimo 2D igru znaci u photoshopu :)
inace, mozda u nekoj verziji budemo presli na izometriju (2.5D) pa bi se onda mape radile u 3ds-u (Il slicnom alatu) ali o tom potom...
markozelenovic @ 02.04.2008. 12:29
Odlicno


stefanpn @ 02.04.2008. 13:13
Za graficare...
Elementi od kojih ce mapa biti napravljena trebaju biti 32 x 32 pixela. Sa tim elementima ce se popunjavati matrica. Dok neko ne odradi grafiku koristicemo elemente iz spritelib_gpl koji je besplatan.
Igrica ce se raditi za rezoluciju 800 x 600. Sto znaci da ce se ti title/menu screen-ovi raditi za 800 x 600 x 24bpp
Znaci ako hocete da napravite tileset, koristite sledecu matricu:
A ovo se trenutno koristi
Mada licno mislim da bi polje bilo da se koriste elementi velicine 48 x 48 pixela.
Takodje elementi trebaju biti snimljeni u png formatu. I to element, po element 1.png, 2.png ... n.png
Shadowed @ 02.04.2008. 13:24
Par pitanja (nadam se da nije bilo a ja propustio):
Posto je mapa sastavljena iz ovakvih polja, a nije (bar mislim da nije) potezna igra, da li postoji animacija kretanja sa polja na polje ili samo preskace? Pretpostavljam da je prvo i ako jeste: da li se moze pucati u bilo kom trenutku ili ispaljuje samo kada je bas na polju?
Da li se tenk smatra pogodjenim ako projektil pogodi polje na kojem je tenk ili ako pogodi sam tenk?
Dakle, pitanja se odnose na "premoscavanje" izmedju rezolucije mape i rezolucije ekrana.
stefanpn @ 02.04.2008. 13:33
Naravno da postoji animacija kretanja i moze se pucati u bilo kom trenutku i tenk je pogodjen kada ga metak dodirne.
Najbolje bi bilo da pogledas
ovaj primer (nesto sam se malo igrao sa fb-ext-lib-om) pa ces dobiti odgovore na tvoja pitanja.
Na primeru nema skrolovanja mape, ali ce ga biti...
Aleksandar Ružičić @ 02.04.2008. 13:41
inace, sto se tice rezolucije i ja sam za 800x600, ali sprajtovi koje trenutno koristimo (SpriteLib GPL) su radjeni za 640x480, pa cemo zasad da radimo na 640x480, dok neko ne uradi tenkice za 800x600...
Stefane, ti u map editoru stavi mogucnost biranja rezolucije, velicine polja (32x32), i velicine mape (u poljima, ne u pixelima) ne znam dal smo ostavili polje u ELITEMAP formatu za velicinu polja, ako nismo onda dodaj (pre velicine mape)
Eurora3D Team @ 02.04.2008. 14:38
Za Aleksandra ili Shadowed (ili ko je zaduzen za to :) )
Da ne otvaram novu temu ... u poslednjih par dana vam MySQL server koji opsluzuje ovaj sajt malo zakucava ... cesto kad hocu da otvorim neku stranu dobijem MySQL gresku na stranici (ne moze da se poveze sa bazom) ...
Shadowed @ 02.04.2008. 14:45
Stefane, ja to samo informativno, nemam bas mogucnosti da se udubljujem u kod. Ta moja pitanja su napola ono sto me interesuje napola ono sto bi mozda trebalo pomenuti za one koji takodje samo usput posmatraju sta se desava.
Eurora3D Team, hvala na obavestenju, poznat nam je problem, znaju i admini, radi se na tom (kol'ko tolk'o) :)
masterjoda @ 02.04.2008. 20:43
Eurora3D Team @ 03.04.2008. 09:11
Dali neko zna kako da se dobije hWnd (window handler) prozora koji kreira screenres funkcija ?
Hteo sam da napravim malo bolje resenje za msg loop u ovoj igri (subklasiranjem window procedure) ali nemogu da nadjem hWnd ....
masterjoda @ 03.04.2008. 09:13
A moji modeli... ???
Aleksandar Ružičić @ 03.04.2008. 10:04
@masterjoda: nije lose, mada su tenkici iz SpriteLib GPL-a nekako lepsi za oko, mozes da pokusas njih da obradis malo.
sto se tice eksplozija to nemoras da crtas to cemo da uradimo sa explosion generatorom, evo npr sta on moze da uradi:

stefanpn @ 03.04.2008. 12:18
Moze li ta crna pozadina eksplozije da bude transparentna sa alfa kanalom?
Jer bi onda eksplozije izgledale super!
@Eurora
Ja u VB-u to resavam ovako:
Code:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Dim ProzorHwnd as Long
Private Sub Form_Load()
ProzorHwnd = FindWindow("Notepad", vbNullString) ' Ja sam stavio da trazi Notepad, ali tu upisujes ime prozora
End Sub
Moralo bi da radi i u FreeBASIC-u... :)
Aleksandar Ružičić @ 03.04.2008. 13:04
Citat:
stefanpn: Moze li ta crna pozadina eksplozije da bude transparentna sa alfa kanalom?
Jer bi onda eksplozije izgledale super!
Naravno, magical wand tool :)
Citat:
@Eurora
Ja u VB-u to resavam ovako:
Code:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Dim ProzorHwnd as Long
Private Sub Form_Load()
ProzorHwnd = FindWindow("Notepad", vbNullString) ' Ja sam stavio da trazi Notepad, ali tu upisujes ime prozora
End Sub
Moralo bi da radi i u FreeBASIC-u... :)
evo moje LookupWindow fje (u ovom slucaju je jednostavnije koristiti FindWindow k'o sto je Stefan predlozio, al evo mozda nekom zatreba ovakva funkcionalnost)
Code:
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Function LookupWindow(Optional ByVal ClassName As String, Optional ByVal Title As String, Optional UseLike As Boolean = False, Optional ByVal Parent As Long) As Long
LookupWindow = GetChild(Parent, ClassName, Title, UseLike)
End Function
'
Private Function GetChild(Optional ByVal hwnd As Long, Optional ByVal ClassName As String, Optional ByVal Title As String, Optional UseLike As Boolean = False)
Dim lHandle As Long
Dim lRet As Long
Dim sBuffer As String
Dim bClassMatch As Boolean
Dim bTitleMatch As Boolean
Do
lHandle = FindWindowEx(hwnd, lHandle, vbNullString, vbNullString)
bClassMatch = False
bTitleMatch = False
If lHandle <> 0 Then
bClassMatch = LenB(ClassName) = 0
bTitleMatch = LenB(Title) = 0
If Not bClassMatch Then
sBuffer = String(160, 0)
lRet = GetClassName(lHandle, sBuffer, 160)
sBuffer = Left$(sBuffer, lRet)
bClassMatch = (UseLike And (sBuffer Like ClassName)) Or (Not UseLike And (ClassName = sBuffer))
End If
If Not bTitleMatch Then
sBuffer = String(160, 0)
lRet = GetWindowText(lHandle, sBuffer, 160)
sBuffer = Left$(sBuffer, lRet)
bTitleMatch = (UseLike And (sBuffer Like Title)) Or (Not UseLike And (Title = sBuffer))
End If
If bClassMatch And bTitleMatch Then
GetChild = lHandle
Exit Function
Else
lRet = GetChild(lHandle, ClassName, Title, UseLike)
If lRet <> 0 Then
GetChild = lRet
Exit Function
End If
End If
End If
Loop While lHandle
End Function
samo treba sa Spy++ videti klasu prozora koji se dobije sa ScreenRes
stefanpn @ 03.04.2008. 13:10
Ali sa magical wand ne bi dobili alpha chanel za mesta na kojima bi vatra mogla malo da se providi.
Nego moze li to cudo za eksplozije da napravi eksploziju na providnoj povrsini?
Aleksandar Ružičić @ 03.04.2008. 13:13
kako ne bi mogla da se providi?
dobijas transparentnu eksploziju za par min!
EDIT:
evo:

mada ipak, sa magic wand nisam dobio zadovoljavajuce rezultate, ali sam uspeo da postignem zeljenu transparenciju pomocu rgb kanala, tj njihove transparencije
stefanpn @ 03.04.2008. 13:31
Pa dobro, samo nisam bas tako mislio. Ovde se vidi crni trag ispod eksplozije ali i ovo daje dobre rezultate...
Aleksandar Ružičić @ 03.04.2008. 13:36
pa nema crnog traga... crna boja je uklonjena u potpunosti, ovo su samo nijanse crvene boje, nego sam ja duplirao lejer da pojacam jacinu crvene, to je mozda potamnilo neke delove (koji opet nisu crni nego tamno crveni)
EDIT:
evo uradio sam animated gif:
mada sam radio copy/paste frejmova tako da nisu pozicionirani tacno u pixel a i mogao sam malo da ubrzam animaciju... (ovo ce sve da bude mnogo lakse kroz fb)
[Ovu poruku je menjao Aleksandar Ružičić dana 03.04.2008. u 15:16 GMT+1]
Aleksandar Vasic @ 03.04.2008. 15:47
eo sa zvukom,ali zbog velicine fajla izbacio sam pesmu za background music,stoga ubacite fajl koji zelite u ovaj folder pod imenom pesma.mp3
Ne zamerite shto pri pucanje se chuje zvuk explozije ne dzukele koja laje ;)
tnx to @stefanpn, @krcko
Eurora3D Team @ 03.04.2008. 16:02
:) Hvala za kod
Mislio sam da OGL cuva hWnd u nekoj info strukturi i da ima neka funkcija za to ... da ne nabadamo prozore :) al ok moze i ovako
Eurora3D Team @ 03.04.2008. 16:20
Citat:
samo treba sa Spy++ videti klasu prozora koji se dobije sa ScreenRes
Bavio sam se time (i window