LECKÉK:              

Saját ablak
Directdraw1
Directdraw2
Directdraw_3
Sprite_1

Sprite 2
Billentyű_1
Billentyű_2
Egér
Joystick
Midi
MP3
Directsound
Időzítők
Fájlkezelés
 

Üdvözöllek!

A Mid fájlokat le tudjuk játszani a projectünkben,de segítségül kell Hívni egy Dll programot,Amit
ingyenesen letölthetsz innen:


 

A kijelölt fájlt kell letölteni, abból fogjuk használni a forrásfájlokat.
Ha sikerült letölteni,akkor adjál a projecthez egy új fájlt Midi.hpp néven.

A szokásos menet,létrehozzuk a MIDI osztályunkat. DE előtte hozz létre egy midi nevű mappát,és tegyél bele egy pár midi fájlt, nevezd őket sorban át      m1.mid   m2.mid  m3.mid   stb.

Ezek után ha valahova kicsomagoltad a letöltött anyagot,másold át a project-be az fmod.h az fmod.dll és az
fmodvc.lib fájlokat a későbbi használathoz!
Az alaposztály dekralációja:
#ifndef _MIDI_
#define _MIDI_

#include <fmod.h>
#pragma comment(lib, "fmodvc.lib")

class MIDI
{
public:
MIDI();
~MIDI();
bool midi_init(int num=0);
void midi_play();
void midi_pause(bool);
void midi_stop();
void midi_hangero(unsigned char);
void midi_loop(bool);
char midi_playing();
protected:
FMUSIC_MODULE *mod;
bool init_ok;
};
#endif
A Konstruktor és destruktor:

//
//Megvalósítások:
//
MIDI::MIDI(){mod=NULL;init_ok=false;}
//
MIDI::~MIDI(){FMUSIC_StopSong(mod);FMUSIC_FreeSong(mod);}
//Ha az oszt. megszűnik felszabadítunk.

A midi init() megvalósítása:

bool MIDI::midi_init(int num)//melyik szám töltődjön be?
{
LPCTSTR nevek[]={"midi/m1.mid","midi/m2.mid","midi/m3.mid"};
if(!init_ok)
{
if (FSOUND_GetVersion() < FMOD_VERSION)
{
// err("rossz dll");
return 0;
}
FSOUND_SetOutput(FSOUND_OUTPUT_WINMM);
if (!FSOUND_Init(44100, 32, FSOUND_INIT_USEDEFAULTMIDISYNTH))
{
// err("inithiba");
return false;
}
}
init_ok=true;
if(mod){FMUSIC_StopSong (mod ) ;}
mod = FMUSIC_LoadSong(nevek[num]);
if (!mod)
{
//err("nincs file ilyen sehol,vagy hibás");
}
return true;
}

Ha elsőnek hívjuk meg, akkor betölti a dll-t, de a továbbiakban már nem, csak az új fájlt.
A többi függvény megvalósítása:

void MIDI::midi_play() {FMUSIC_PlaySong (mod ) ;}
void MIDI::midi_stop() {FMUSIC_StopSong (mod ) ;}
void MIDI::midi_hangero(unsigned char vol) {FMUSIC_SetMasterVolume (mod,vol) ;}
void MIDI::midi_loop(bool l) {FMUSIC_SetLooping (mod,l) ;}
char MIDI::midi_playing() {return FMUSIC_IsPlaying(mod) ;}
void MIDI::midi_pause(bool jelzo) {FMUSIC_SetPaused (mod,jelzo) ;}

Hát ennyi. Használjuk a Main cpp-ben. Először is csatoljuk a fájlt:

#include <Sprite.hpp>
#include <Midi.hpp>
---------
Hozzuk létre a tényleges oszályt:


MIDI midi;
SPRITE sprite;

Azért tettem a sprite elé, mert az fogja végül is használni, és ne legyen fordítási hiba.( később)

Az inicializáló függvények közé tegyed be a midi_init() függvényt.:
--------
sprite.sp_init ();
midi.midi_init();midi.midi_play();
while (fut)
--------
Ebben az esetben az első számot játssza le,de konkrét számmal meghívva azt fogja lejátszani!
figyelni kell,hogy nagyobb számmal ne hívjuk meg, mint amennyi tényleg van,mert nem irtam meg az ellenőrzést.(Valamit azért te is írhatsz hozzá!)

Használata :

while (fut)
{
static int flag=0;//ha a pause függvényt többször hívod, kiakad a progi tehát:
if(input.get_key(DIK_A,true) && !flag){midi.midi_pause(true);flag=1;}
if(input.get_key(DIK_B,true) && flag){midi.midi_pause(false);flag=0;}
if(input.get_key(DIK_C,true)){midi.midi_stop();midi.midi_init(1);midi.midi_play();}

uzenetkezelo();
sprite.frissit();
input.get_key(0,true);//csak azért hívjuk meg,hogy az esc-re kilépjen

}
return 0;
};
//
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* vizsgáljuk az üzenet tipusát */
{
case WM_ACTIVATE: //ha az alkalmazás előtérbe került
switch(wParam)
{
case WA_ACTIVE:
case WA_CLICKACTIVE:
aktiv=true; //az más osztályok innen tudják,hogy az ablak aktív-e
if(input.bill)input.bill->Acquire();
if(input.mouse)input.mouse->Acquire();
midi.midi_play();
break;
case WA_INACTIVE:
aktiv=false;
if(input.bill)input.bill->Unacquire();
if(input.mouse)input.mouse->Unacquire();

midi.midi_stop();
break;
}
break;

Azért írtam bele, mert a dll akkor is játssza a zenét, amikor az alkalmazásunk kisméretben van,és ez zavaró lehet.A későbbiekre javaslat: egy valamekkora időzítő, ha lejárt a zenét folyamatosan lehalkítani (255-0)
újat betölteni,és lehet lejátszani.egy játék alatt monoton ugyanaz a zene .....
Következik az MP3 lejátszása, az is ezzel a dll-el, hasonlóan egyszerű.

Itt a kód:

vissza