[UDF] Moteur 2D en GDIPlus

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

[UDF] Moteur 2D en GDIPlus

#1

Message 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é 368 fois
- Dernière Béta (Revision 3)
GEngin.zip
Dernière Béta
(98.75 Kio) Téléchargé 362 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.
Version Objet - Trop lente.zip
Version Orienté Objet
(76.78 Kio) Téléchargé 339 fois
J'attend vos commentaires avec impatience!!!
@+
Modifié en dernier par matwachich le mer. 25 mai 2011 22:30, modifié 5 fois.
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#2

Message par matwachich »

Un exemple un peut plus parlant! lol
Attaché au premier post
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#3

Message 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)
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#4

Message 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.
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#5

Message 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)
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#6

Message par matwachich »

Corrigé!
Alors, votre avis??? :D :D :D
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Yarillo
Niveau 5
Niveau 5
Messages : 109
Enregistré le : mer. 11 mai 2011 22:22
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#7

Message par Yarillo »

Bien que les jeux soient pas ma tasse de thé j'applaudis le boulot !
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#8

Message par pierrotm777 »

Effectivement ça c'est du joli travail :wink:
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#9

Message 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.
GEngin.zip
beta
(60.6 Kio) Téléchargé 330 fois
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...
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#10

Message 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:

Code : Tout sélectionner

;_GEng_SetDebug(1)
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!!!
Fichiers joints
GEngin.zip
Beta (revision 3)
(98.75 Kio) Téléchargé 313 fois
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#11

Message 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...
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#12

Message 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 :o
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 ^^
Signez ici
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#13

Message 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!!!
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Yarillo
Niveau 5
Niveau 5
Messages : 109
Enregistré le : mer. 11 mai 2011 22:22
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#14

Message par Yarillo »

Peut-on y faire quelque-chose docteur ? :D
J'espère que tu vas pouvoir release ça, que j'effectue quelques tests.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#15

Message 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!
Fichiers joints
GEngin.rar
Exemple très parlant!
(393.38 Kio) Téléchargé 333 fois
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#16

Message par Tlem »

Image
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#17

Message par timmalos »

Impresionnant. Beau travail !
Avatar du membre
Yarillo
Niveau 5
Niveau 5
Messages : 109
Enregistré le : mer. 11 mai 2011 22:22
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#18

Message 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)
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#19

Message 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!
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [UDF] Moteur 2D en GDIPlus

#20

Message 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
Signez ici
Répondre