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
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.
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
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 ? ). 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
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()"
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.
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
@ Ravine : Ca te dit pas de poster ça dans le wiki?
Hors ligne
Merci, Ravine. Je vais piocher ça.
Thierry
Hors ligne
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