Page 1 sur 2

Tracés 2D et 3D

Publié : sam. 23/mai/2009 18:10
par KrisJNT
Bonjour à tous !

Je me suis lancé dans la 3D avec PureBasic, ça a été un succès !
Seul bémol : as moyen de faire du tracé en 2D sur l'écran.

En effet : ScreenOutput() me renvoie 0 seulement si j'ai InitEngine3D() avant.

J'ai bien essayé avec des Sprites, mais rien y fait ! SpirteOutput(#MonSprite) me renvoie aussi 0 en présence d'InitEngine3D().

J'ai donc essayé de charger un Sprite depuis un fichier extérieur quelconque : LoadSpirte() ne fonctionne pas !

J'ai alors essayé de changer les commandes d'ordre mais le seul qui fonctionne est celui-ci :

InitEngine3D() > InitSprite() > OpenScreen() > CreateSprite()/LoadSprite()

Si bien que créer un sprite, récupérer le ScreenOutput() avant InitEngine3D() n'est pas possible.

A croire que le dessin en 2D m'en veut ! :D

J'ai trouvé une alternative temporaire : utiliser l'API de Windows, mais ça n'est pas efficace : l'API ne fonctionne pas avec le FlipBuffers(), donc on voit le tracé clignoter.

Si vous avez une piste pour moi, n'hésitez pas !

Je posterai le code au besoin (sachant qu'il nécessite des fichiers externes).

Merci pour vos réponses,

Kris

Publié : sam. 23/mai/2009 18:21
par Backup
la seule réelle alternative, c'est N3XT-D

qui va te permettre bien mieux, et sans effort !! ;)

Publié : sam. 23/mai/2009 18:22
par KrisJNT
Je viens juste d'aller sur le site :D ! Y'a-t-il une doc avec ?

Publié : sam. 23/mai/2009 18:23
par djes
Les inits sont à placer une seule fois en début de programme. Si tu utilises la 3d, tu dois mettre l'InitEngine3D() en tout premier. Après ça, tu peux ouvrir/fermer et récupérer le ScreenOutput de tous les écrans que tu veux. Pourquoi voudrais-tu faire un ScreenOutput() avant l'InitEngine3D()???
Si c'est un problème avec la version 4.30 de Purebasic, tu peux revenir à la 4.20.

Publié : sam. 23/mai/2009 18:25
par KrisJNT
En fait j'avais essayé ca :

InitSprite()
ScreenOutput()
OpenScreen()
id = ScreenOutput() ;==> La je récupère l'id du screen
InitEngine3D()
StartDrawing(id) ;==>Là je m'en sert

Mais évidemment, ça n'a pas marché... (je m'étais dit : psuique ScreenOutput() me renvoie 0 après un InitEngine3D(), pourquoi ne pas récupérer l'id avant ?)

Publié : sam. 23/mai/2009 18:47
par djes
En fait les inits() sont plus des sortes de directives qui disent au compilateur quel type de code il doit générer pour les routines comme sprite() etc. Par exemple, quand on met l'initengine3d, le code généré pour l'openscreen est complètement différent! Il est donc inutile d'essayer de bidouiller, ça ne fonctionnera jamais.
Grâce à ces astuces, un programme purebasic est toujours le plus léger possible, puisqu'il n'embarque que ce dont il a besoin :)

Publié : sam. 23/mai/2009 19:34
par Backup
quoiqu'il en soit, le Purebasic est assez lourding !!


toutes ces commandes a la noix, qui ne servent a rien
comme initsprite,start3D , stop3D , ect !!

c'est un peu naze !!

elles devraient etre implicite a l'utilisation des commande de dessins point barre

etre obligé de se coltiner ces trucs, c'est quand meme assez nul non ? :?

allez quelques exemples naze !

on fait

Code : Tout sélectionner

     StartDrawing(SpriteOutput(#sprite_fond))
        Box(0,0,EcranX,EcranY,RGB(0,0,0))
    StopDrawing()

il vaudrai mieux une commande differente pour chaque sortie
genre

Code : Tout sélectionner

 StartDrawing_Sprite(#sprite_fond)
        Box(0,0,EcranX,EcranY,RGB(0,0,0))
    StopDrawing()

StartDrawing_screen(#sprite_fond)
        Box(0,0,EcranX,EcranY,RGB(0,0,0))
    StopDrawing()
ça ferai deja moins de parentheses :lol:

etc ..............

voila encore un exemple :

on fait :
CreateSprite(#fourmi, 8, 16,#PB_Sprite_Texture) ; c'est la meme image qui est employé
; dessine le sprite
StartDrawing(SpriteOutput(#fourmi))
Box(2,0,4,16, RGB($D6,$74,$3F))
StopDrawing()

CreateSprite3D(#fourmi3D, #fourmi)

on pourrai faire :
CreateSprite(#fourmi, 8, 16,#PB_Sprite_Texture, 3D) ;

StartDrawing(SpriteOutput(#fourmi))
Box(2,0,4,16, RGB($D6,$74,$3F))
StopDrawing()

plus besoin de ce " CreateSprite3D(#fourmi3D, #fourmi)"
il suffirai que Fred ajoute un flag dans la commande createsprite()

j'en ai plein d'autres des comme ça :lol:

le purebasic , demande a etre sérieusement épuré !! :)

de toute façon ça sert visiblement a rien de faire des suggestions

Fred et son equipe , sont comme le gouvernement actuelle
il dise oui! oui ! mais ne change rien ! :?
(d'ailleurs , je suis injuste , ils ne disent meme pas "oui oui", ils ne disent rien ... )

la dictature c'est "Ferme ta gueule"
la republique c'est "cause toujours"

Publié : sam. 23/mai/2009 19:47
par Anonyme
on fait
Code:

CreateSprite(#sprite_fond,EcranX,EcranY)
StartDrawing(SpriteOutput(#sprite_fond))
Box(0,0,EcranX,EcranY,RGB(0,0,0))
StopDrawing()


on pourrai faire

Code:

CreateSprite(#sprite_fond,EcranX,EcranY)
StartDrawing(#sprite_fond)
Box(0,0,EcranX,EcranY,RGB(0,0,0))
StopDrawing()

ben oui on s'en fou nous du spriteoutput()

Bah , non , on lui dit directement dans quel buffer dessiné , si tu lui passe un vulgaire pointeur sans l'output() , la fct° Startdrawing() va devoir énumérer les output() valide et trouvé le bon !

Publié : sam. 23/mai/2009 20:05
par Backup
comme par hasar tu as retenu l'exemple le plus foireux !!
c'est meme pour ça que je me suis empressé d'en donner un autre ;)

Publié : sam. 23/mai/2009 20:09
par Anonyme
Parce que pour les autres je suis d'accord avec toi :D

Publié : sam. 23/mai/2009 20:13
par Backup
:D

Publié : dim. 24/mai/2009 14:01
par comtois
pour mélanger 2D et 3D , tu dois passer par des sprites, et dans le sous système directx9.


tu as un exemple d'affichage de sprite sur de la 3D ici

http://www.purebasic.fr/english/viewtopic.php?t=34593

tu peux dessiner, écrire sur ton sprite comme tu le ferais sur l'écran.
ou encore cet exemple , je dessine une ligne à l'écran sur de la 3D en passant par un sprite.

http://www.purebasic.fr/english/viewtopic.php?t=37127

Publié : dim. 24/mai/2009 19:35
par KrisJNT
Les exemples sont intéressants, mais SpriteOutput renvoie aussi 0 :(

Publié : dim. 24/mai/2009 21:30
par comtois
juste pour être sûr, tu as bien été dans les options du compilateur ?
ensuite tu as bien tapé directx9 dans le champ bibliothèque du sous système ?

Ensuite regarde le fichier ogre.log il y a peut-être des infos intéressantes

Publié : mer. 27/mai/2009 19:03
par KrisJNT
Euh... j'ai pas trop compris : où dois-je taper DirectX9 ?
Sinon, j'ai un peu de mal avec les log, mais je peux toujours essayer de le comprendre.