#0 

20-01-2008 11:36:24

thierry_st_malo
Petit nouveau
Date d'inscription: 18-01-2008
Messages: 7

Bonjour,
Je voudrais traduire en VB 2005 le tutoriel "tilemap" d'Agar (et le mettre à la disposition de qui sera intéressé, d'ailleurs) mais j'ai beau importer IrrlichtNETCP et IrrlichtNETCP.Inheritable, et même IrrlichtNETCP.Event, je ne vois nulle part d'interface ou de classe EventReceiver ou IEventReceiver à implémenter ou à hériter.
Je ne trouve nulle part non plus quoi que ce soit qui ressemble à cet IrrlichtDevice.OnEvent qu'on trouve dans les tutoriaux.
A l'aide !
Merci d'avance,
Thierry

Dernière modification par thierry_st_malo (20-01-2008 11:56:24)

Hors ligne


#1 

22-01-2008 01:27:02

Ravine
Membre
Date d'inscription: 09-12-2006
Messages: 61

EDIT : ce qui suit concerne C#. Avec un peu de recherche, tu devrais *normalement* pouvoir adapter ça a VB. J'avais pas fait gaffe avant de partir dans l'ecriture de mes 2 messages que ça portait sur VB. Bon courage donc

Alors, si tu ne les trouves pas, c'est normal, c'est que c'est pas héritable. Le seul (gros) defaut (mais tributaire du statut de wrapper, on peut pas tout avoir) est justement qu'on ne peut pas faire de l'héritage a tout va. Les seuls trucs héritables sont dans Inheritable donc (qui veut dire "heritable" en fr.). Donc du coup, pour un custom scene node, tu déclares ta classe, et tu la fais hériter de ISceneNode. Ensuite tu implémentes des trucs dedans.

Par exemple, tu veux te faire une caméra custom, qui rotationne sur le clic molette (button 3 de la souris) et un mouvement. Bon bah tu déclares une classe, tu hérites de ISceneNode, et a l'interieur, tu implémentes une CameraSceneNode. En gros, tu as une cameraSceneNode classique dans ton CustomSceneNode, auquel tu appliques les comportements que tu aimerais avoir pour ta caméra. Ensuite tu exposes les méthodes pour ton node. Et voilà, tu viens "d'emballer" un node existant dans un CustomSceneNode

Un peu de code sera plus parlant je pense.

Code:

    public class SquadsCameraSceneNode : ISceneNode
    {

        public enum TranslationDirection
        {
            Up,
            Down,
            Left,
            Right
        }

        protected CameraSceneNode camera;
        protected SceneManager sceneManager;
        protected VideoDriver driver;

        public void Translate(TranslationDirection direction, float movingSpeed)
        {
            if ((TranslationDirection.Up == direction) || (TranslationDirection.Down == direction))
            {
                vector3d moveVector = camera.Position - camera.Target;
                moveVector.Y = 0;
                moveVector.Normalize();

                if (TranslationDirection.Up == direction)
                {

                    camera.Position = camera.Position - moveVector * movingSpeed;
                    camera.Target = camera.Target - moveVector * movingSpeed;
                }
                else
                {

                    camera.Position = camera.Position + moveVector * movingSpeed;
                    camera.Target = camera.Target + moveVector * movingSpeed;

                }
            }
            else if ((TranslationDirection.Left == direction) || (TranslationDirection.Right == direction))
            {
                vector3d toTargetVector = camera.Position - camera.Target;
                toTargetVector.Normalize();
                vector3d crossVector = toTargetVector.CrossProduct(camera.UpVector);
                vector3d strafeVector = crossVector.Normalize();

                if (TranslationDirection.Left == direction)
                {
                    camera.Position = camera.Position - strafeVector * movingSpeed;
                    camera.Target = camera.Target - strafeVector * movingSpeed;
                }
                else
                {
                    camera.Position = camera.Position + strafeVector * movingSpeed;
                    camera.Target = camera.Target + strafeVector * movingSpeed;
                }

            }

            this.UpdateAbsolutePosition();

        }
}

Ici, j'ai créé une camera custom. C'est une classe qui implémente le constructeur du parent (enlevé ici pour eviter trop de code inutile) et une méthode "Translate" qui fait une translation de caméra. Comme tu peux le voir, j'expose "Translate", et en réalité, j'applique mes modifs a l'interieur.

Jette un coup d'oeil aux custom scene nodes de Irrlicht.Extension dans le source du wrapper. Ce sont tous des CustomSceneNode, et tu pigeras mieux si t'as pas saisi avec mon exemple.

----------------------------------------------------------------------------------------------------------

Ensuite, pour l'histoire du EventReceiver, donc, comme dit au dessus, c'est pas héritable. En revanche, tu peux "récupérer" les events normalement, et leur appliquer des transformations. Par exemple, Irrlicht.NetCP n'integre pas MastEventReceiver, qui est une classe qui se substitue a l'event receiver du Irrlicht Natif. Qu'a cela ne tienne ! Tu peux faire une classe "EventTransformer", et quand un event est lancé, tu le fais passer par cette classe, via une methode lambda, par exemple "ProcessEvent(Event e)".

Plutot que de partir dans une longue explication, je vais te renvoyer au port du MastEventReceiver, que j'ai réalisé. Il fonctionne sur le principe que je te décris au dessus .

http://irrlichtnetcp.sourceforge.net/ph … .php?t=811

Bon, tu y verras que j'ai "quand meme" hérité de Event, pour pouvoir récuperer quelques trucs. Le tout est commenté (j'ai pris du temps pour les comments), principalement en début de code, dans le gros pavé, sous le Disclaimer original.

Voilà pour un exemple de traitement d'event.

Dernière modification par Ravine (22-01-2008 01:41:34)

Hors ligne


#2 

22-01-2008 01:35:39

Ravine
Membre
Date d'inscription: 09-12-2006
Messages: 61

Enfin, derniere partie (je me méfie de la limite de caracteres des posts, me suis deja fait surprendre), le OnEvent est ce que l'on appelle un delegate. (ou délégué dans la langue de Moliere. Mais entre nous, qui dev en français ? big_smile ). Je te renvois ici pour la def du delegate http://en.wikipedia.org/wiki/Delegate_%28.NET%29

Concretement, comment ça fonctionne avec irrlicht.NetCP ? Tres simplement. Tout d'abord, on jette un coup d'oeil a ce qu'il se passe en terme d'interception d'events.

Tu lances ton programme.
Tu appuis sur Echap  >  ton device repere que tu viens d'appuyer sur Echap, et lance son "OnEvent" (device.OnEvent) . Comme toi tu veux pouvoir intervenir dans ce OnEvent, mais sans avoir a modifier le wrapper, tu ajoutes un delegate a la création du device

Code:

            device = new IrrlichtDevice(DriverType.Direct3D9, screenResolution, colorDepth, fullscreen, stencil, vsync, antialias);
            device.OnEvent += new OnEventDelegate(device_OnEvent);

là concretement, tu viens de rattacher la méthode "device_OnEvent()" a la methode "OnEvent" lancée par le device (si tu mates l'intellisense, OnEvent est de type OnEventDelegate, et sa doc dit "Fired when an event occured".). Ne reste plus qu'a implémenter plus loin ta méthode "device_OnEvent()"

Code:

        private bool device_OnEvent(Event e)
        {
            if (null != device)
            {
                #region Keyboard

                if (EventType.KeyInputEvent == e.Type)
                {
                    // key input processing by Mast
                    keyProcessor.OnEvent(e);

                    cameraSceneNode.OnEvent(keyProcessor, device.Timer.RealTime);

                    // insert big key code switch here
                    switch (keyProcessor.KeyCode)
                    {
                        case KeyCode.Escape:
                            {
                                device.Close()
                            }
                            break;

                        default:
                            break;
                    }
                }

                #endregion

            }
            return (true);
        }

et voilà. Tu interceptes les events de ton device, et tu peux meme faire mumuse avec. smile

Comme tu peux le voir dans le code au dessus, j'ai un cameraSceneNode.OnEvent(keyProcessor, device.Timer.RealTime);. C'est parce que dans ma Camera Custom, j'ai créé spécifiquement une méthode pour profiter du port du MastEventReceiver que j'avais fait.

Dernière modification par Ravine (22-01-2008 01:38:57)

Hors ligne


#3 

22-01-2008 12:52:51

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

@ Ravine : Ca te dit pas de poster ça dans le wiki?


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#4 

25-01-2008 14:22:59

thierry_st_malo
Petit nouveau
Date d'inscription: 18-01-2008
Messages: 7

Merci, Ravine. Je vais piocher ça.
Thierry

Hors ligne


#5 

28-01-2008 11:23:35

thierry_st_malo
Petit nouveau
Date d'inscription: 18-01-2008
Messages: 7

Bonjour,
J'ai terminé l'adaptation (ce n'est pas une traduction littérale, mais pour moi en tous cas la base d'autre chose, d'où toute une restructuration) du tutoriel "tilemap" d'Agar en VB 2005. Comment faire pour le mettre à la disposition des gens intéressés et pour qu'on me dise (je ne suis pas complètement désintéressé moi-même !) si cela peut tourner sous Mono ? La possibilité de développer en VB 2005 un jeu ne tournant pas seulement sous Windows est une de mes motivations essentielles.
Merci d'avance,
Thierry

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
14 invités en ligne
Aucun membre connecté
RSS Feed