Loupe

[C#] Créer un jeu avec FMOD – Introduction et mise en place

 

Bonjour à tous et bienvenue dans cette série d’articles consacrées à FMOD et son utilisation dans une application Windows Store.

Le but de ces articles sera de créer un petit jeu en utilisant quelques fonctionnalités de la librairie FMOD. Nous utiliserons pour cela le langage C#/XAML avec MVVM Light.

Partie 1 - Introduction et mise en place

Partie 2 – Bases du jeu et analyse spectrale du signal

Partie 3 – Spectrogramme et plateau de jeu

Prérequis

But de l’article

Notre but va être très simple, à la fin de cet article, vous allez être en mesure de.. jouer un son !

Installation et création du projet

Une fois FMOD installé, nous avons accès à plusieurs choses bien utiles :

  • api : l’ensemble des librairies que nous allons utiliser
  • documentation : la documentation technique que l’on ne retrouve pas sur le site. Je vous invite fortement à jeter un oeil au pdf : Getting started with FMOD for Windows Metro
  • examples : une solution VS2012 contenant quelques exemples basiques en C++

On rentre maintenant dans le vif du sujet en créant un nouveau projet Windows 8 Store dans Visual Studio qu’on appellera FMODGame

create_new_project

 

 

On ajoute la librairie MVVM Light grâce à NuGet :

image

 

 

On change la plateforme de notre projet à savoir soit x86, x64 ou ARM. Pas de AnyCPU possible ! Dans cet article on utilisera la librairie x86.

change_platform_x86

 

 

On ajoute la dll de FMOD compilé avec notre plateforme (fmodexMetro.dll = x86) à notre projet en tant que lien :

add_as_link

 

 

Pour finir, voici l’architecture de la solution que nous allons utiliser :

solution_archi

 

 

 

Je vous laisse le soin d’ajouter les fichiers aux bons endroits. On notera l’utilisation d’un wrapper C# pour utiliser la librairie FMOD écrite en C++ (voir lien de téléchargement en haut de l’article)

Initialisation de FMOD

Nous allons créer la classe MainViewModel qui sera attaché à notre MainPage. Elle sera chargée, dans un premier temps, d’initialiser FMOD afin de pouvoir utiliser toutes ses fonctionnalités.

MainViewModel.cs
using System;
using FMOD;
using GalaSoft.MvvmLight;

namespace FMODGame.ViewModels
{
    public class MainViewModel : ViewModelBase
    {
        private FMOD.System _system;
        private FMOD.RESULT _result;
        int _numdrivers;
        private int _controlpaneloutput;
        FMOD.SPEAKERMODE _speakermode;
        FMOD.CAPS _caps;

        public FMOD.RESULT Initialize()
        {
            FMOD.Factory.System_Create(ref _system);

            if ((_result = _system.getNumDrivers(ref _numdrivers)) != RESULT.OK)
                return _result;
            if (_numdrivers == 0)
            {
                if ((_result = _system.setOutput(OUTPUTTYPE.NOSOUND)) != RESULT.OK)
                    return _result;
            }
            else
            {
                if ((_result = _system.getDriverCaps(0, ref _caps, ref _controlpaneloutput, ref _speakermode)) != RESULT.OK)
                    return _result;

                if ((_result = _system.setSpeakerMode(_speakermode)) != RESULT.OK)
                    return _result;
            }

            _system.init(32, INITFLAGS.NORMAL, (IntPtr)null);
            return RESULT.OK;
        }
    }
}
MainPage.xaml.cs
namespace FMODGame.Views
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            MainViewModel vm = new MainViewModel();
            this.DataContext = vm;
            vm.Initialize();
        }
    }
}

Jouer un son (enfin !)

On va faire très simple et nous allons jouer un son à chaque fois que l’utilisateur cliquera sur le bouton Jouer. Pour cela, on ajoute tout d’abord le son dans notre projet. Pour ma part, j’ai choisi un son au format wav mais vous pouvez très bien prendre un mp3. Ensuite, on crée une nouvelle commande que l’on attachera à notre bouton :

MainViewModel.cs
private ICommand _playSoundCommand;
public ICommand PlaySoundCommand
{
    get
    {
        if (_playSoundCommand == null)
            _playSoundCommand = new RelayCommand(PlaySong);
        return _playSoundCommand;
    }
}

private Sound _sound;
private Channel _channel;

public void PlaySong()
{
    if ((_result = _system.createStream("ms-appx:///Medias/drumloop.wav", MODE.SOFTWARE, ref _sound)) != RESULT.OK)
        return;
    if ((_result = _system.playSound(CHANNELINDEX.FREE, _sound, false, ref _channel)) != RESULT.OK)
        return;
}

Cela se passe en deux phases. La première consiste à créer un flux audio à partir du fichier physique. La seconde sert à consommer ce flux dans un canal propre à lui seul. Pour stopper l’écoute de ce flux il suffira de faire :

_channel.stop();

Vous remarquez aussi que si vous cliquez plusieurs fois sur Jouer, le son sera joué par dessus les autres. Cela s’explique par le fait que l’on crée un canal unique à chaque fois (CHANNELINDEX.FREE). Pour rejouer un son sur le même canal, nous pouvons faire ceci :

public void PlaySong()
{
    if ((_result = _system.createStream("ms-appx:///Medias/drumloop.wav", MODE.SOFTWARE, ref _sound)) != RESULT.OK)
        return;
    if (_channel == null)
    {
        if ((_result = _system.playSound(CHANNELINDEX.FREE, _sound, false, ref _channel)) != RESULT.OK)
            return;
    }
    else
    {
        if ((_result = _system.playSound(CHANNELINDEX.REUSE, _sound, false, ref _channel)) != RESULT.OK)
            return;
    }
}
MainPage.xaml
<Page x:Class="FMODGame.Views.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d">

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Button Content="Jouer"
                Command="{Binding PlaySoundCommand}"
                HorizontalAlignment="Center"
                Width="150"/>
    </Grid>
</Page>

Conclusion

A travers cet article nous avons pu démarrer en douceur avec comme but ultime de jouer un son. Dans le prochain article, nous aborderons le principe de notre jeu et nous commencerons à taquiner un peu les fonctionnalités de FMOD.

Les sources sont disponibles à cette adresse : http://sdrv.ms/122ZHDq

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus