IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[SdlDotNet] Mais où est la boucle de jeu ?


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut [SdlDotNet] Mais où est la boucle de jeu ?
    Salut à toutes et à tous, allons droit au but !

    Je viens du monde C/C++ et dans ces langages lorsque je créais une application avec la bibliothèque graphique SDL, il y'avait toujours une boucle de jeu (la boucle principale) et à l'intérieur de celle-ci se trouvait la boucle des événements. J'ai essayé de reproduire un peu près l'équivalent en C# :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
            public static void Main(string[] args)
            {
     
                Video.SetVideoMode(800, 600);
                Video.WindowCaption = "test";
                Video.Screen.Fill(Color.White);
     
                bool gameloop = true;
                KeyboardState kbs = new KeyboardState();
     
                while(gameloop)
                {
                    if (kbs.IsKeyPressed(Key.Escape))
                    {
                        gameloop = false;
                    }
                }
            }
    Malheureusement, ça m'a crée une boucle sans fin et j'ai dû faire appel au taskmanager (gestionnaire des tâches, Ctrl+Alt+Suppr) pour l'arrêter.

    Donc j'aimerais savoir comment créer un simple programme contenant une vrai boucle while. Si quelqu'un a une idée, je suis preneur.

    Je vous remercie

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    Je ne comprends pas bien ta question. Effectivement dans ton code tu fais une boucle infinie, sans gestion des évènements windows, donc ton appli est freezée. Regarde du côté de la doc de SdlDotNet pour savoir comment il faut gérer la boucle de jeu... Cela dit vu que c'est du .net j'imagine assez qu'il faille s'abonner a qques évènements, genre Update et Draw puis faire un SDL.Start(). Mais je fais des suppositions, regarde la doc.

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Moi je parierais sur une classe à hériter (Game ?) et à surcharger certaines méthodes (comme en XNA).

    Après ben faut lire la doc hein.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  4. #4
    Membre actif Avatar de Gulix
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 273
    Points
    273
    Par défaut
    Ca fait quelque temps que j'ai pas touché à SdlDotNet, mais il me semble qu'il faille créer le KeyboardHandler à chaque passage de boucle. C'est à ce moment-là qu'il se rafraîchira.

    Si Echap n'est pas pressé avant d'entrer dans ta boucle, l'état restera inchangé.

    Tu peux regarder sur mon site, j'ai quelques tutos sur SdlDotNet.
    "L'univers... on croit qu'il est infini mais quand on arrive au bout un gorille géant vous balance des tonneaux."
    Phillip J. Fry

    http://www.gulix.fr/

    BlindShark, Logiciel de Blind Test - Pull N' Bounce - Jeu XNA

  5. #5
    Invité
    Invité(e)
    Par défaut MISSION ACCOMPLIE !!!
    Eureka !! J'ai trouvé la solution à mon problème. Tout d'abord je vous donne le code ne contenant pas la boucle while ensuite celui avec la boucle.

    Sans la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
        class SimpleExample
        {
            private const int width = 640;
            private const int height = 480;
            private Random rand = new Random();
            private Surface screen;
     
            public SimpleExample()
            {
                Video.WindowIcon();
                Video.WindowCaption = "SDL.NET - Simple Example";
                screen = Video.SetVideoMode(width, height);
                Events.KeyboardDown += new EventHandler<KeyboardEventArgs>(this.KeyDown);
                Events.Quit += new EventHandler<QuitEventArgs>(this.Quit);
                Events.Tick += new EventHandler<TickEventArgs>(this.Tick);
                Events.Fps = 5;
            }
            private void KeyDown(object sender, KeyboardEventArgs e)
            {
                if (e.Key == Key.Escape || e.Key == Key.Q)
                {
                    Events.QuitApplication();
                }
            }
            private void Quit(object sender, QuitEventArgs e)
            {
                Events.QuitApplication();
            }
            private void Tick(object sender, TickEventArgs e)
            {
                screen.Fill(Color.FromArgb(rand.Next(255), rand.Next(255), rand.Next(255)));
                screen.Update();
            }
            public void Show()
            {
                Events.Run();
            }
            [STAThread]
            public static void Main()
            {
                SimpleExample t = new SimpleExample();
                t.Show();
            }
    Avec la boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
        class SimpleExample2
        {
            private const int width = 640;
            private const int height = 480;
            private Random rand = new Random();
            private Surface screen;
            private bool gameLoop;
     
            public SimpleExample2()
            {
                gameLoop = true;
                Video.WindowIcon();
                Video.WindowCaption = "SDL.NET - Simple Example";
                screen = Video.SetVideoMode(width, height);
                Events.Fps = 5;
            }
            private void DetectEvent()
            {
                SdlEventArgs[] eventList = Events.Retrieve();
     
                foreach(SdlEventArgs oneEvent in eventList)
                {
                    if (oneEvent.Type == EventTypes.KeyDown)
                    {
                        KeyboardEventArgs kbea = (KeyboardEventArgs) oneEvent;
                        if(kbea.Key == Key.Escape)
                        {
                            gameLoop = false;
                        }
                    }
                    else if(oneEvent.Type == EventTypes.Quit)
                    {
                        gameLoop = false;
                    }
                }
                Events.Remove();
            }
     
            public void Show()
            {
                while (gameLoop)
                {
                    this.DetectEvent();
                    screen.Fill(Color.FromArgb(Color.FromArgb(rand.Next(255), rand.Next(255), rand.Next(255))));
                    screen.Update();
                }
            }
            [STAThread]
            public static void Main()
            {
                SimpleExample2 t = new SimpleExample2();
                t.Show();
            }
        }
    Note: j'avais cherché dans la documentation officielle ainsi que dans d'autres sites, mais sans succès. Une application avec la boucle, dans le .Net faut pas rêver surtout qu'en C# (et peut-être Java) les événements sont gérées différemment (utilisation des handler et delegates).

    Sinon que pensez-vous de ma solution ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Android] [Jeu] Mais où est passé . . . ?
    Par aziraphale76 dans le forum Mon application mobile
    Réponses: 1
    Dernier message: 13/10/2014, 17h36
  2. jeu de tir mais ou est la bal?
    Par ghan77 dans le forum Flash
    Réponses: 5
    Dernier message: 24/03/2007, 14h01
  3. Mais quel est l'intérêt de XML ?
    Par darkbauer dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 01/06/2004, 18h03
  4. [VC++ .NET] mais où est passée SignedXML ???
    Par benoitB dans le forum MFC
    Réponses: 4
    Dernier message: 30/04/2004, 08h14
  5. Une table qui existe mais qui est inconnu! ?
    Par Nino dans le forum InterBase
    Réponses: 6
    Dernier message: 13/06/2003, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo