Page 1 sur 2

Petites questions techniques pour les jeux :)

Publié : sam. 16/mai/2009 17:41
par reno
Bonjour,

Je fais tourner depuis quelques jours la démo de PURE BASIC et j'apprécie vraiment ce programme.

Je comprends le principe pour faire de la 2D et de la 2D avec des sprites 3D. Maintenant, ce que je recherche, c'est utiliser la camera pour faire de la 2D avec tous les avantages de la 3D.

Si j'ai bien compris (et en plus ça ne marche pas), c'est impossible d'utiliser des sprites 3D (en plus il n'y a pas d'axes Z) en utilisant le moteur 3D. Alors quel autre moyen ? Utiliser des Billboards ? Des meshes ? Comment alors garder tous les effets de transparences des sprites ?

Merci d'avance de m'éclairer ;)

Publié : sam. 16/mai/2009 17:52
par jbernard13
Bonjour et bienvenu sur ce forum

as tu été voir dans la section 3D de ce forum ?

Publié : sam. 16/mai/2009 18:03
par reno
Salut jbernard13,

Effectivement j'y suis passé rapidement il y a quelques jours, je n'y ai plus pensé... j'y retourne !

Publié : sam. 16/mai/2009 18:06
par jbernard13
est ce que deja tu maitrise les sprites2d? as tu dej crée un petit jeu?

Publié : sam. 16/mai/2009 18:27
par djes
Il ne faut pas croire tout ce qui est marqué dans la doc...
Pour Purebreaker 3, j'ai mélangé des sprites 2D, des sprites 3D, et de la 3D avec Ogre. Officiellement ce n'est pas supporté, mais ça fonctionne quand même très bien. A noter que c'était avec la version 4.20 de PureBasic.
Pour les sprites 3D, on peut jouer avec le Z en bidouillant un peu : il y a des petites extensions là aussi non supportées qui permettent plus de manipulations que celles d'origine. Pour un panel complet, va sur Codearchiv.
A noter que certains codes ne fonctionnent qu'avec certaines versions de PB, car de petites choses ont été changées (c'est pour ça que ces manips sont déconseillées par l'équipe). En pratique ce n'est pas très génant, car Pure est suffisamment léger pour être installé en plusieurs versions.
Si tu te débrouilles bien, il te permettra d'aller très loin ;)

Publié : dim. 17/mai/2009 9:52
par Backup
j'ajoute qu'il peut y avoir un quiproquo

en effet Sprite3D ne veux pas dire qu'ils s'agits de Sprite3D !!
il s'agit de Sprite 2D qui sont pris en charge par la carte 3D !!

Fred aurai peut etre du les appeler hard_sprite() !!

le moteur 3D (ogre) , c'est la vraie 3D , c'est un moteur 3D
qui peut gerer la 2d dans une certaine mesure !!

ps :

vivement "N3xT-D" <-- fait une recherche sur le forum !!

il s'agit d'une adaptation du moteur Irrich pour Purebasic :)

Publié : dim. 17/mai/2009 15:20
par reno
Bonjour à tous les deux,

J'ai fait un deuxième tour sur les forums.
est ce que deja tu maitrise les sprites2d? as tu dej crée un petit jeu?
Oui. En fait jusqu'à maintenant j'ai travaillé avec BlitzPlus et dernièrement avec PlayBasicFX. Ce dernier étant toujours en dévellopement par son créateur, PureBasic a attiré mon attention. Vous pouvez trouver mes jeux sur mon site http://www.thereeteam.com/. J'aimerai reprogrammer Saturn MD2 en utilisant les effets de transparences de PureBasic. 8)

J'aimerai bien utiliser les fonction "officielles" de PB pour créer des jeux. En fait, ce qu'il manque vraiment aux sprites 3D, c'est un axe Z ! Ça simplifierait grandement l'affichage et ça permettrait de faire des effets sympa ! L'auteur de PB lit les suggestions dans le forum ?

Sinon je découvre vraiment la 3D. Pour l'instant je serais incapable de dire en quoi N3XT et OGRE sont différent ! La 3D m'intéresse car dans un premier temps, la gestion d'une caméra me serait très utile. C'est pour ça que je me demande si utiliser des BILLBOARDS ou des MESH plats était une bonne idée ?

Publié : dim. 17/mai/2009 15:45
par djes
Tu peux agrandir et réduire les sprites 3d, ce qui correspond à la manipulation du "Z".
Tu peux aussi utiliser des mesh plats pour remplacer les sprites, pas de problème! Ca demande juste un peu plus de manipulations.

Publié : dim. 17/mai/2009 22:57
par reno
Pour l'axe Z, c'est surtout pour dessiner de manière automatique le plan des sprites.

Bon, si j'ai bien compris, c'est OGRE qui ne gère pas les sprites dans son moteur 3D, contrairement au très prometteur N3XT :P .

Du coup je vais travailler avec les sprites 3D pour me faire la main. Par contre je ne vois pas de commandes pour gérer l'axe d'un sprite (handle) dans la doc en ligne (par exemple si je veux faire la rotation à partir du point en haut à gauche d'un sprite). J'ai raté quelque chose :?:

Publié : lun. 18/mai/2009 6:25
par TazNormand
Salut Reno,

Je viens de regarder ton site web, et je peux dire que tu dépasses le status de débutant, rien que tes questions montrent une certaine maîtrise.

Bienvenu sur PureBasic en tout cas.

Publié : lun. 18/mai/2009 10:28
par Backup
l'axe des Z en sprite 2D est conditionné par la regle suivante

le dernier affiché (pas crée) est au dessus des autres !!

si tu gere tes sprites avec une variable (meme structuré) comme numero de sprite , il est assez facile de gerer le Z !!

voici un petit exemple qui fait passer alternativement le rouge devant le jaune :)

Code : Tout sélectionner

; Dobro
; codé avec mon NC10   ;O)

If InitSprite() = 0 Or InitKeyboard() = 0
    MessageRequester("Erreur", "Le système de Sprite ne peut pas être initialisé", 0)
    End
EndIf

Global Pas_x=2; cette variable indiquera le sens de deplacement x
Global Pas_y= 3; cette variable indiquera le sens de deplacement y
Global x2=10
Global x=400
Global Pas_x2=-2; cette variable indiquera le sens de deplacement x
Global Pas_y2= -3; cette variable indiquera le sens de deplacement y
Global largeur_ecran=GetSystemMetrics_(#SM_CXSCREEN); si purebasic demo mettre ici la taille X de votre resolution
Global hauteur_ecran=GetSystemMetrics_(#SM_CYSCREEN); si purebasic demo mettre ici la taille Y de votre resolution

If OpenScreen(largeur_ecran, hauteur_ecran, 32, "Visualisation")
    
    
    ; *********** creation et dessin d'un sprite *******************
    
    CreateSprite(0,32,32)
    StartDrawing(SpriteOutput(0))
        Circle(16,16,16,RGB(255,255,15)) ; la tete
        
        Circle( 10,10,5,RGB(0,250,255)); oeil gauche
        Circle( 10,10,2,RGB(0,0,0)); pupille gauche
        
        Circle( 22,10,5,RGB(0,250,255));oeil droit
        Circle( 22,10,2,RGB(0,0,0)); pupille droite
        
        Box (10,22,10,5,RGB(0,0,0)) ;bouche
        Box (7,20,4,4,RGB(0,0,0));coin bouche gauche
        Box (20,20,4,4,RGB(0,0,0));coin bouche droit
    StopDrawing() 
    
     
    ; ********************************************************
    ; *********** creation et dessin d'un sprite *******************
    
    CreateSprite(1,32,32)
    StartDrawing(SpriteOutput(1))
        Circle(16,16,16,RGB(255,0,15)) ; la tete
        
        Circle( 10,10,5,RGB(0,250,255)); oeil gauche
        Circle( 10,10,2,RGB(0,0,0)); pupille gauche
        
        Circle( 22,10,5,RGB(0,250,255));oeil droit
        Circle( 22,10,2,RGB(0,0,0)); pupille droite
        
        Box (10,22,10,5,RGB(0,0,0)) ;bouche
        Box (7,20,4,4,RGB(0,0,0));coin bouche gauche
        Box (20,20,4,4,RGB(0,0,0));coin bouche droit
    StopDrawing() 
    
    
    ; ********************************************************
    
    
    Repeat 
        ; On dessine nos Sprites
        If a=1
           
                DisplaySprite(0, x, hauteur_ecran/2)
           DisplaySprite(1, x2, hauteur_ecran/2)
        Else 
                DisplaySprite(1, x2, hauteur_ecran/2)
             DisplaySprite(0, x, hauteur_ecran/2)
    EndIf
    
    
        ; *** fait avancer notre sprite ***
        x=x+Pas_x
        y=y+Pas_y
        x2=x2+Pas_x2
        y2=y2+Pas_y2
        ; ****************************
        
        ; *** les tests pour surveiller les sorties d'ecran ***
        If x>largeur_ecran -32; le sprite va sortir par la droite de l'ecran (on retire 32 car c'est la largeur du sprite)
            Pas_x=-Pas_x ; on inverse le sens du deplacement X en mettant une valeur inverse 
        EndIf
        If x<0 ; le sprite va sortir par la gauche de l'ecran
            Pas_x=-Pas_x ; on inverse le sens du deplacement X en mettant une valeur inverse 
            a=1
        EndIf
        ; ** pour les Y
        If y>hauteur_ecran-32 ; le sprite va sortir par le Bas de l'ecran (on retire 32 car c'est la hauteur du sprite)
            Pas_y=-Pas_y ; on inverse le sens du deplacement Y en mettant une valeur inverse 
        EndIf
        If y<0 ; me sprite va sortir par le Haut de l'ecran
            Pas_y=-Pas_y ; on inverse le sens du deplacement Y en mettant une valeur inverse 
        EndIf
        
        
        If x2>largeur_ecran -32; le sprite va sortir par la droite de l'ecran (on retire 32 car c'est la largeur du sprite)
            Pas_x2=-Pas_x2 ; on inverse le sens du deplacement X en mettant une valeur inverse 
        EndIf
        If x2<0 ; le sprite va sortir par la gauche de l'ecran
            Pas_x2=-Pas_x2 ; on inverse le sens du deplacement X en mettant une valeur inverse 
            a=0
        EndIf
        ; ** pour les Y
        If y2>hauteur_ecran-32 ; le sprite va sortir par le Bas de l'ecran (on retire 32 car c'est la hauteur du sprite)
            Pas_y2=-Pas_y2 ; on inverse le sens du deplacement Y en mettant une valeur inverse 
        EndIf
        If y2<0 ; me sprite va sortir par le Haut de l'ecran
            Pas_y2=-Pas_y2 ; on inverse le sens du deplacement Y en mettant une valeur inverse 
        EndIf
        
        ; *********************************************
        StartDrawing(ScreenOutput())
            DrawText(10, 580, "Touche Esc pour quitter." , RGB(242, 249, 85), RGB(0, 0, 0))
        StopDrawing()
        
        FlipBuffers() 
        ClearScreen(RGB(0,0,0))
        
        
      
        
        ExamineKeyboard()
    Until KeyboardPushed(#PB_Key_Escape)
    
Else
    MessageRequester("Erreur", "Impossible d'ouvrir un écran en 800 * 600 - 32 bits!", 0)
EndIf

End    

Publié : lun. 18/mai/2009 10:52
par TazNormand
@Dobro : pourquoi utiliser une API pour la résolution de l'écran, et pas les fonctions Desktop ?
Ces fonctions sont trop lourdes ?

c'est une question, pas un étalage de science, je précise :oops:

Publié : lun. 18/mai/2009 11:04
par jbernard13
TazNormand, c'est la méthode de programmer de Dobro ...

Publié : lun. 18/mai/2009 11:09
par TazNormand
et toi, Jbernard13, c'est quoi ta méthode ? :wink:

Publié : lun. 18/mai/2009 11:39
par Backup
TazNormand a écrit :@Dobro : pourquoi utiliser une API pour la résolution de l'écran, et pas les fonctions Desktop ?
Ces fonctions sont trop lourdes ?

c'est une question, pas un étalage de science, je précise :oops:
pas besoin de préciser !!
tu peut bien être meilleur programmeur que moi , a vrais dire, je m'en fou :lol:

pour moi l'essentiel c'est d'arriver a faire ce qu'on veux , chacun sa méthode

cependant , pour le coup Jb13 n'a pas tout a fait tord !!

j'utilise l'Api, parceque ça tiens en une seule ligne ! (pas besoin de faire un ExamineDesktops() )

:)


c'est plus pratique a mon gout ! :)