Page 1 sur 2

[jeu] Music

Publié : mer. 27/avr./2011 10:22
par blendman
salut

voilà, je n'ai pas encore abordé les sounds et music dans mon jeu.

J'ai regardé les libs à ce sujet. J'ai vu que je pouvais utiliser des *.ogg, j'ai donc converti certaines de mes musics dans ce format.

Je ne sais pas exactement comment on procède pour lancer les music, faut-il utiliser un thread ou peut-on lancer les music sans thread, et elles se jouent sans "ralentir" le reste du jeu ?

Pour le moment, j'ai créer une procédure pour un thread :

Code : Tout sélectionner

Procedure MusicIntro(*valeur)   
   LoadSound(0,"music.ogg")
   SoundVolume(0,50)
   PlaySound(0)   
 EndProcedure
Mais j''aimerai lancer des music à la suite et boucler la liste par exemple,


Pour en lancer en fonction des terres explorées, je pense que c'est assez simple : je fais une boucle qui stop tous les sounds, puis je lance le sound correspondant :

Code : Tout sélectionner

for i = 0 to maxMusic ; maxMusic étant le nombre maximum de music que j'aurai par exemple
stopsound(i)
next i
playsound(#le_numero_de _la_music_en_fonction_du_lieu,#PB_Sound_Loop,Volume)
Mais dois-je à nouveau le faire dans un thread d'après vous ?

Les multi-canaux c'est cool aussi, ça permet de lancer un son (par exemple le bruit d'un trol qui marche) et la music en même temps :).
Merci :)

Re: [jeu] Music

Publié : mer. 27/avr./2011 10:41
par Backup
lorsque tu lance un son ou une musique, celui-ci ou celle-ci ce joue deja en Tache de fond ..

si tu fais d'autres trucs après avoir lancé la musique, c'est indépendant deja !!
pas besoin de Threads !! ;)

en fait la carte son "bufferise" ce que tu lui a envoyé
elle joue , en multitache , ce que tu fais avec Purebasic pendant ce temps,
ta carte son ... elle s'en fout !! :lol:

ps: pour info c'etait deja le cas sur les Ordi 8 bits :roll:

Re: [jeu] Music

Publié : mer. 27/avr./2011 10:56
par blendman
ah ok, super, merci !

ça va bien me simplifier la tache ça, c'est cool :D.

Re: [jeu] Music

Publié : mer. 27/avr./2011 11:15
par djes
Dobro a écrit :lorsque tu lance un son ou une musique, celui-ci ou celle-ci ce joue deja en Tache de fond ..

si tu fais d'autres trucs après avoir lancé la musique, c'est indépendant deja !!
pas besoin de Threads !! ;)

en fait la carte son "bufferise" ce que tu lui a envoyé
elle joue , en multitache , ce que tu fais avec Purebasic pendant ce temps,
ta carte son ... elle s'en fout !! :lol:

ps: pour info c'etait deja le cas sur les Ordi 8 bits :roll:
Ca dépend lesquels, tous les ordis n'avaient pas des DMA! Et les musiques compressées nécessitent toujours un décodage, qui se fait sur Windows dans un thread séparé, pareil pour les lecteurs de modules. C'est vrai que PB gère tout ça tout seul, donc on n'a à se préoccuper de rien, sauf à faire des déformations sonores en temps réels.

Re: [jeu] Music

Publié : mer. 27/avr./2011 17:09
par Fred
D'ailleur PlaySound() renvoie le canal utilisé par le son joué, pour pouvoir agir dessus apres.

Re: [jeu] Music

Publié : mer. 27/avr./2011 23:30
par case
a propos des sons y a t'il un moyen de savoir si un son s'est arrêté de jouer ou pas ?

je n'ai rien vu dans la doc a ce sujet. j'aurais bien voulu pouvoir enchaîner plusieurs titres a la suite.

Re: [jeu] Music

Publié : jeu. 28/avr./2011 10:35
par blendman
case a écrit :a propos des sons y a t'il un moyen de savoir si un son s'est arrêté de jouer ou pas ?
je n'ai rien vu dans la doc a ce sujet. j'aurais bien voulu pouvoir enchaîner plusieurs titres a la suite.
Ah oui, pareil !

je serai très intéressé par cette information moi aussi :D.

Re: [jeu] Music

Publié : jeu. 28/avr./2011 13:58
par falsam
case a écrit :a propos des sons y a t'il un moyen de savoir si un son s'est arrêté de jouer ou pas ?
blendman a écrit :Je serai très intéressé par cette information moi aussi
l'interface IDirectSoundBuffer (Window uniquement) répond à cette question.

Cette interface étant déjà déclaré dans Pure basic, il est donc inutile de la définir à nouveau dans le programme.

Code : Tout sélectionner

Enumeration
  #MainForm
  #Sample
EndEnumeration

Global SampleName.s

Procedure GetDXSoundStatus(IDSound.i)
  If IsSound(IDSound)
    Protected *DxSound.IDIrectSoundBuffer=PeekL(IsSound(IDSound)), PlayState.i
    *DXsound\GetStatus(@PlayState)
  
    ;PlayState retourne les valeurs 1 : (DSBSTATUS_PLAYING) ou 5 (DSBSTATUS_LOOPING)  ou 0 (DSBSTATUS_BUFFERLOST)
    If PlayState=1 Or PlayState=5
      ProcedureReturn #True  
    Else
      ProcedureReturn  #False  
    EndIf
  EndIf
EndProcedure

Procedure MainFormShow()
  OpenWindow(#MainForm,0,0,500,400,"Test Son",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
EndProcedure


Procedure PlaySample()
  If InitSound() = 0
    MessageRequester("Error", "Sound system is not available",  0)
    End
  EndIf
  
  SampleName = OpenFileRequester("", "", "Wave files|*.wav",0)
  If SampleName
    If LoadSound(#Sample, SampleName)
      PlaySound(#Sample)
    Else
      MessageRequester("Error", "Can't load the sound.", 0)
  EndIf
EndIf

EndProcedure

MainFormShow()
PlaySample()

Repeat
  If GetDXSoundStatus(#Sample)=#False
    Debug "Le son est stoppé"
  EndIf
    
  Select WaitWindowEvent()
    Case #PB_Event_Gadget

    Case #PB_Event_CloseWindow
      End
  EndSelect
 ForEver
La doc de l'interface. sur le site de microsoft.

Re: [jeu] Music

Publié : jeu. 28/avr./2011 14:09
par case
Ce serais mieux sans api, ou alors avec des solutions pour les autres systemes

Re: [jeu] Music

Publié : jeu. 28/avr./2011 14:16
par falsam
case a écrit :Ce serais mieux sans api, ou alors avec des solutions pour les autres systemes
Bien sur que ce serait mieux. Mais je n'ai que cette solution qui ne fonctionne que sur window comme je l'ai bien spécifié. Au fait, affiche dans ta signature sur quel O.S. tu développes tes applications. :)

Re: [jeu] Music

Publié : jeu. 28/avr./2011 18:18
par Chris
Je vais peut-être dire une connerie, ça ne serait pas la première fois, mais quitte à utiliser des fichiers .wav, pourquoi ne pas utiliser la librairie "Movie"?
MovieStatus() retourne 0 quand la lecture est terminée, ça fonctionne très bien, et ... c'est multi-plateforme

Re: [jeu] Music

Publié : jeu. 28/avr./2011 19:01
par blendman
personnellement, j'utilise des *.ogg, car c'est beaucoup plus léger ;)

Re: [jeu] Music

Publié : jeu. 28/avr./2011 19:24
par case
en général sous windows mais je pense surtout aux gens qui dev sous macos ou linux, de plus faire un soft sous windows ne veux pas dire que seul une version windows verra le jour, j'ai aussi un mac... quand a linux je n'ai pour l'instant pas de machines sous cet os mais qui sait...

Re: [jeu] Music

Publié : jeu. 28/avr./2011 19:26
par falsam
blendman a écrit :personnellement, j'utilise des *.ogg, car c'est beaucoup plus léger ;)
Pour savoir si un son est arrêté avec des *.ogg, mon exemple de code fonctionne aussi en utilisant la fonction UseOGGSoundDecoder() en entête de ce code par exemple.

Re: [jeu] Music

Publié : jeu. 28/avr./2011 19:35
par Chris
La librairie "Movie" sait lire les *.ogg, et ... elle est multi-plateforme :mrgreen: