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