Page 1 sur 2
[UDF] Moteur 2D en GDIPlus
Posté : jeu. 12 mai 2011 20:44
par matwachich
Voici mon dernier bébé!
un petit moteur d'affichage 2D basé sur GDIPlus!
Il permet: (pour l'instant)
- créer la fenêtre d'affichage, et lui donner un couleur d'arrière plan
- Charger et afficher des images, modifier facilement leur taille et leur position
Un exemple est fourni, il montre comment:
- Charger une image avec
_GEng_ImgLoad
- La placer dans un objet
Sprite (_GEng_SpriteCreate) avec
_GEng_SpriteSetImg
- Modifier les paramètres de l'objet Sprite qui sont: Position et taille, avec
_GEng_SpriteSetPos
- Afficher l'objet sprite (et donc l'image qu'il contient) avec
_GEng_SpriteDraw, à une position précise (la position de la souris)
- Changer l'image contenue dans l'objet sprite (
_GEng_SpriteSetImg)
Première mise à jour: (12/05/2011)
- Possibilité de définir le point d'origine d'un sprite via la fonction
_GEng_SpriteSetPos
Version 1.2 (14/05/2011)
- Ajout du calcule de collision
- v1.2.zip
- Dernière version (1.2)
- (117.82 Kio) Téléchargé 427 fois
- Dernière Béta (Revision 3)
- GEngin.zip
- Dernière Béta
- (98.75 Kio) Téléchargé 424 fois
Todo:
- Permettre la rotation d'un objet +++
- Permettre d'assigner
une partie d'une image à un sprite (pour exploiter les SpritesSheets)
-
Changer le point d'origine d'un objet
Le reste sera fait dans la version 2
PS: Le code est devenu trop sale et trou bordélique pour y ajouté des choses, je compte faire une refonte complète du code, sa sera la version 2.
PS: J'ai perdu 2h de ma vie à adapter GEngin pour AutoItObject, le code était magnifiquement propre et intuitif. Mais, en lançant un exemple simple, je me rend compte que AutoItObject était bien trop lent pour gérer un affichage 2D (sauf erreur de codage de ma part). Je joint le code version Orienté Objet si quelqu'un veut le voir.
J'attend vos commentaires avec impatience!!!
@+
Re: [UDF] Moteur 2D en GDIPlus
Posté : jeu. 12 mai 2011 22:13
par matwachich
Un exemple un peut plus parlant! lol
Attaché au premier post
Re: [UDF] Moteur 2D en GDIPlus
Posté : sam. 14 mai 2011 11:31
par pierrotm777
J'obtient cette erreur avec l'exemple2 et une Gui vide avec l'exemple
Code : Tout sélectionner
D:\Program Files\Ride Runner\Skins\Carwings_Dynamic_pm_new\Scripts\2DenGDIP\example2.au3(63,36) : ERROR: _GEng_SpriteGetPos(): undefined function.
$pos = _GEng_SpriteGetPos($sprMech)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\Program Files\Ride Runner\Skins\Carwings_Dynamic_pm_new\Scripts\2DenGDIP\example2.au3 - 1 error(s), 0 warning(s)
Re: [UDF] Moteur 2D en GDIPlus
Posté : sam. 14 mai 2011 14:08
par matwachich
En effet, c'est une erreur de ma part!
J'ai mi dans le premier post la dernière version (1.2) avec les 2 exemples dans un fichier zip, et j'ai supprimé les autres.
Ajout de cette version:
- Gestion des collisions entre les sprites: pour voir les carré de collision dans l'exemple 2: dans le fichier GEngin.au3, mettez la variable $__GEng_Debug à 1.
Re: [UDF] Moteur 2D en GDIPlus
Posté : sam. 14 mai 2011 14:49
par pierrotm777
Dans exemple.au3, j'ai du remplacer:
Code : Tout sélectionner
_GEng_SpriteSetPos($hSpr, $mouse_pos[0], $mouse_pos[1], $dimX, $dimY, $GEng_Middle)
par
_GEng_SpriteSet($hSpr, $mouse_pos[0], $mouse_pos[1], $dimX, $dimY, $GEng_Middle)
Re: [UDF] Moteur 2D en GDIPlus
Posté : sam. 14 mai 2011 21:47
par matwachich
Corrigé!
Alors, votre avis???

Re: [UDF] Moteur 2D en GDIPlus
Posté : sam. 14 mai 2011 22:29
par Yarillo
Bien que les jeux soient pas ma tasse de thé j'applaudis le boulot !
Re: [UDF] Moteur 2D en GDIPlus
Posté : dim. 15 mai 2011 09:30
par pierrotm777
Effectivement ça c'est du joli travail

Re: [UDF] Moteur 2D en GDIPlus
Posté : ven. 20 mai 2011 02:51
par matwachich
Bah déjà merci!
Un petit amuse gueule en attendant GEngin 2, c'est disons une version beta, j'ai pas encore implémenté tout ce que je souhait mais c'est déjà pas mal!
Il y a 2 exemples.
To do:
- Meilleur gestion des mouvements, c'est pas encore top
- Gestion des animation automatiques
- Gestion des collisions! (Aie! lol)
- Supprimer certaine entrée dans le Array principal d'un objet sprite (qui ne servent à rien)
- Bugs, améliorations...
Re: [UDF] Moteur 2D en GDIPlus
Posté : mar. 24 mai 2011 00:38
par matwachich
Encore une nouvelle mise en bouche! Et ouai, je veut pas faire de release tant que je ne suis pas satisfait à 100%!
Cette fois, c'est du lourd!!!
- Animations automatiques OK!
- Mouvements et dynamique OK et simplifié en plus!
- Collision OK! (Cercle vs. Cercle, Rectangle vs. Cercle, Rect vs. Rect)
Reste à vérifier si le Point fonctionne bien et si les cotés d'un rectangles entent bien en collision avec un cercle, sinon c'est satisfaisant!
L'idéal pour les collision aurai été qu'elle prennent en considération la rotation de l'objet (ce qui n'est -pour l'instant- pas le cas)
- J'ai malheureusement eu la flem de supprimer les éléments inutiles du array de l'objet sprite, car il faudrait revoir tout le code à la recherche des décalages...
- L'exemple de l'avion est désormais plus parlant!!! lol
- Un fonction spécial, dans les exemples:
Dé-commentez la et voyez le résultat!
-
http://code.google.com/p/g-engin/: Bon, c'est la première fois que je manipule SVN, j'ai normalement bien commmiter la dernière version du code source (celle que je vous donne dans ce post) en révision 3, mais je fais toujours des sauvegardes ici sur mon pc! (on sais jamais...)
J'espère vois avoir mis l'eau à la bouche!!!
Ce qu'il me reste encore avant la release:
- Un objet sprite simplifié: car on à pas besoins de tout les calcules que demande le sprite standard (position, vitesse...) pour un fond ou un objet de décors (static) par exemple
- Je vais
essayé de prendre en considération l'angle de l'objet dans les collision.
- Correction en tout genre et documentation.
J'attends vos comms avec impatiente!!!
Re: [UDF] Moteur 2D en GDIPlus
Posté : mer. 25 mai 2011 22:27
par matwachich
Avec ce projet, je me rend bien compte des limites de AutoIt!
Je sais définitivement qu'il n'est pas fait pour les jeux! du moins, les gros jeux!
Le FPS d'une simple simulation avec GEngin tombe rapidement en dessous de 25 au bout de 20 à 25 sprites à l'écran (je parle de sprites 'mobiles': dont la position est calculé selon la vitesse à chaque frame, et de même pour l'accélération, inertie, angle...)
Sinon, pour des affichages plus simples, c'est plus que correcte.
Au max, j’atteins 150 à 170 FPS (Dual Core T3400, 3Go Ram, NVidia G103M 512 Mo)
Je pense que j'ai bientôt fini le développement!
- Animation, mouvements OK
- Collisions OK
- Sprites Static OK (Il suffit de mettre le 2é paramètre de _GEng_Sprite_Draw() à 1 pour empêcher le calcule de la dynamique du sprite)
PS: J'ai essayé d'ajouter la possibilité d'afficher du text à l'écran, qui je pense est indispensable! mais c'est pas fluide.
J'y travaille...
Re: [UDF] Moteur 2D en GDIPlus
Posté : jeu. 26 mai 2011 09:20
par Iste
Déjà, merci pour cette exemple.
matwachich a écrit :Avec ce projet, je me rend bien compte des limites de AutoIt!
Pour avoir testé, en effet, la, c'est très lourd pour un rendu très moyen. Je note toute foi des pertes de perf progressives, surement du a des "erreurs" de codage. Je pense cela surtout car j'ai déjà fais tourner un exemple bien plus lourd sur un tout petit PC, même si c'était pas codé en au3, la différence ne peut pas être si énorme.
Donc mon 1er conseil serait d'essayer d’alléger le truc, ya moyen de faire tourner des exemple très simple à la zelda sur nes, voir snes :p
matwachich a écrit :Je sais définitivement qu'il n'est pas fait pour les jeux! du moins, les gros jeux!
Et donc du coup, après avoir dis que je ne pensais pas qu'autoit était trop limité pour ça, faut bien que je donne une explication :
C'est GDI+ qui est pas fait pour ça

Le même exemple utilisant une lib openGL tournera bien mieux, après pour la partie calcul pure, autoit est laaargement assez rapide a mon gout, surtout sur un gros PC
Seulement là, gros PC ou pas, GDI+ se repose sur le proco et laisse la CG dormir..
Donc voila, encore merci pour cette exemple, je voulais aussi tester GDI+ dans mon coin, sans en avoir le temps...
Mes conseils sont donc : essayer d'optimiser le tout, c'est pas normal que ca ram autant. J'ai vu d'autres exemples sur le fofo us qui étaient bien plus fluides (mais aussi moins complexe)
essayer de le faire tourner avec une lib openGL, ça doit pas être énormément plus compliqué et ca doit se trouver !
Bonne chance ^^
Re: [UDF] Moteur 2D en GDIPlus
Posté : jeu. 26 mai 2011 20:29
par matwachich
Merci pour les conseils!
En effet, en tournant sur google, je découvre tout plein de moteurs d'affichage 2D (SDL, SFML, HGE, ClanLib...), et je me rend compte que la plupart utilisent OpenGL ou Direct3D.
Les erreurs de codage, y'en a surement des tas! d'ailleurs ces jours ci, je ne suis plus en phase de développement mais d'optimisation et de nettoyage, car j'ai réussi à implémenter tout (ou presque) ce que je voulait!
Je pense que les problèmes viennent de la fonction de calcule des mouvement ou de celle des collisions.
Mais le problème majeur est en effet GDI+, qui utilise le Software Render.
Je vais me pencher sur OpenGL ... Affaire à suivre!
Edit:
Après un petit surf sur google (fofo anglais, SdZ ...), je me dis que c'est du lourd!
Je pense que ça me dépasse un peut, c'est compliqué OpenGL, et D3D n'en parlons même pas!
Je vais essayé d'optimiser au max GEngin, et je vais faire une release finale (v2)
Le code source est toujours dispo sur Google codes
Edit2:
- Après quelques petits tests, je me rend compte par moi même que ce que disait Iste est vrai: Le problème est bel et bien GDI+
- La fonction _GEng_DrawStart (qui fait: _GDIPlus_GraphicsClear) Prend 2ms!
- Pire, la fonction _GEng_DrawEnd (qui fait: _GDIPlus_GraphicsDrawImage) Prend 8ms!
Alors que les calcules de AutoIt:
- Le calcule de la position d'un sprite prend à peine 0.5 à 0.8 ms
- 4 fois Le calcule des collisions Rect vs. Rect (qui est la fonction la plus complexe) prend aussi moins d'1 ms
- 8 appels consécutifs à _IsPressed prennent à peine 0.6 ms!
Résultat: Le nombre max de sprites animé simultané est d’environ 25 - 30 (en comptant les collisions pour chaqu'un)
Sans compter une grande image d'arrière plan (2 à 7 ms)
Conclusion: Trop lent!!!
Re: [UDF] Moteur 2D en GDIPlus
Posté : jeu. 26 mai 2011 20:44
par Yarillo
Peut-on y faire quelque-chose docteur ?
J'espère que tu vas pouvoir release ça, que j'effectue quelques tests.
Re: [UDF] Moteur 2D en GDIPlus
Posté : ven. 27 mai 2011 21:22
par matwachich
J'aimerai vous montrer ou j'en suis
Dans le dossier work de l'archive, il y à un exemple très parlant, et plutôt abouti!
J'attend vos commentaires!
Re: [UDF] Moteur 2D en GDIPlus
Posté : ven. 27 mai 2011 23:29
par Tlem
Re: [UDF] Moteur 2D en GDIPlus
Posté : sam. 28 mai 2011 10:50
par timmalos
Impresionnant. Beau travail !
Re: [UDF] Moteur 2D en GDIPlus
Posté : dim. 29 mai 2011 21:38
par Yarillo
Le dernier exemple est sympa, avec l'avion et les astéroides ! Et... Ultra hardcore.
Sinon, tu pourrais faire un tutoriel d'installation pour les utilisateurs désespérément bêtes comme moi ? Ton exemple tank plante toujours a la ligne 11 (L'include de GEngin.au3 qui est pourtant dans le dossier)
Re: [UDF] Moteur 2D en GDIPlus
Posté : dim. 29 mai 2011 21:56
par matwachich
Merci!
L'example du Tank est 'deprecated'! il ne faut pas essayé de le lancé.
N'oublions pas que ces exemples je les ai fait uniquement pour tester les fonctionnalités que je codais, et à un moment je me suis plus concentrer sur l'avion que le tank, et le tank est resté avec les vieilles fonctions et techniques des version antérieurs.
Je suis actuellement entrain d'écrire les description des fonctions, une fois fini, je ferai un exemple très simple mais aussi très bien commenté, et j'ajouterai quelques commentaires à l'exemple de l'avion.
Enfin, ce sera la release 2.0!
Re: [UDF] Moteur 2D en GDIPlus
Posté : lun. 30 mai 2011 09:05
par Iste
En effet, présenté comme ca l'exemple est tres parlant !
Je me suis galérer a le télécharger ce WE pour y jeter un coup d’œil, le code est vraiment bien foutu, bon boulot !
matwachich a écrit :4 fois Le calcule des collisions Rect vs. Rect (qui est la fonction la plus complexe) prend aussi moins d'1 ms
cette phrase m'avait interpelée, car pour avoir déjà fait des calcules similaire, Rect vs. Rect n'était vraiment pas le plus complexe et après avoir regarder le code, je pense que le corps de __GEng_RectVsRect() pourrai ressembler a ça :
Code : Tout sélectionner
If ($x1 + $w1 > $x2 And $x1 < $x2 - $w2) And ($y1 + $h1 > $y2 And $y1 < $y2 - $h2) Then
Return 1
Else
Return 0
EndIf