Question bête

Sujets variés concernant le développement en PureBasic
HateBreed
Messages : 13
Inscription : mer. 02/juin/2004 20:55
Localisation : Canada, Québec
Contact :

Question bête

Message par HateBreed »

ya combien de port j'crois que c de 1 à 65000
je suis pas alors je demande thx
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je confirme ! pour moi c'est la bonne reponse ! :)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

même pas vrai :
mais elles peuvent aller en réalité de 0 à 65000).
ça commence pas à 1 :wink:
regarde
CreateNetworkServer()
Dernière modification par Oliv le jeu. 03/juin/2004 22:19, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

@oliv

tu la sort d'ou ta citation ??? 8O
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

si je me permet de la doc de PB
et je crois que c'est 65635 ?
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

1 à 65535
"Qui baise trop bouffe un poil." P. Desproges
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

j'était pas loin :!:
HateBreed
Messages : 13
Inscription : mer. 02/juin/2004 20:55
Localisation : Canada, Québec
Contact :

Message par HateBreed »

:o
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

CreateNetworkServer()

Syntaxe

Resultat = CreateNetworkServer(Port)
Description

Crée un nouveau serveur réseau sur l'ordinateur local sur le port spécifié. Les valeurs du port peuvent aller de 6000 à 7000 (ce sont les valeurs recommandées, mais elles peuvent aller en réalité de 0 à 65000). Un nombre quelconque de serveurs peuvent tourner simultanément sur la même machine, mais jamais avec le même numéro de port. Si Resultat = 0, le serveur ne peut être créé (port déjà utilisé), sinon, le serveur a été normalement créé et est prêt à tourner.

Port : Numéro de port pour ce serveur.
OS Supportés

Windows, AmigaOS, Linux

Network - Index
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

3D et screen-saver

Message par Backup »

il semble impossible de faire un extincteur d'ecran si l'on fait appel
a la 3D de pure !!

quelqu'un peut confirmer ça ?? :)

j'ai essaye de rfaire l'exemple de comtois en extincteur

voici le listing en "normal"
mais j'ai legerement changer le truc pour que ça marche tous seul

mais si j'essai de le passer en screensaver ca plant avec un message
relatif au runtime de c++ !!!!!!! :(

Code : Tout sélectionner

 ;-Constantes
;/ Ecran
#ScreenWidth = 800
#ScreenHeight = 600
#ScreenDepth = 32
;/ Mesh
Enumeration
    #MeshMatrice
    #MeshCube
EndEnumeration
;-Structures
Structure Vecteur
    x.f
    y.f
    Z.f
EndStructure
Structure Lumiere
    Couleur.l
    x.f
    y.f
    Z.f
EndStructure 
Structure Matrice
    Largeur.f
    Profondeur.f
    NbFacetteX.l     
    NbFacetteZ.l     
    FaceVisible.l      ; si = #True on double les triangles pour voir l'entité des deux côtés
    NbPointX.l
    NbPointZ.l
    Nbtriangle.l
    TailleFacetteX.f   ; Je ne sais pas si je vais garder cette méthode
    TailleFacetteZ.f   ; Je ne sais pas si je vais garder cette méthode 
    TailleTextureX.l
    TailleTextureZ.l
    PointIDMemory.l
    TriangleIDMemory.l
    TextureIDMemory.l
    NormaleIDMemory.l
EndStructure
Structure Vague
    decaleX.l
    decaleZ.l
    Hauteur.l
    Angle.l
    Vitesse.l
EndStructure 
Structure Camera
    AngleX.l       ; angle de la camera
    AngleY.l
    VitesseRotation.l
    SensRotation.l ; Sens et Vitesse de Rotation
    Distance.l     ; distance entre la camera et le perso
    Hauteur.l      ; hauteur de la camera
    ToucheHaut.l
    ToucheBas.l
    ToucheAvance.l
    ToucheRecul.l
    ToucheAngleHaut.l
    ToucheAngleBas.l
    Vue.l
EndStructure
Structure Parametres
    AngleX.f         ; 
    AngleY.f         ;
    AngleZ.f         ; 
    PosX.l           ;position en x sur la map du robot
    PosZ.l           ;position en z sur la map du robot
    Sens.l           ;Vitesse et Sens de Rotation du robot
    Pas.l            ;Valide déplacement   
EndStructure
;{- Variables
Global Matrice.Matrice
Global Lumiere.Lumiere
Global Vague.Vague
Global Camera.Camera
Global Joueur.Parametres
Global Largeur.f,Longueur.f
Camera\Hauteur=69
Camera\Distance=145
Camera\AngleY = 0
Camera\VitesseRotation = 2
Camera\ToucheHaut=#PB_Key_Pad6
Camera\ToucheBas=#PB_Key_Pad3
Camera\ToucheAvance=#PB_Key_Pad5
Camera\ToucheRecul=#PB_Key_Pad2
Camera\ToucheAngleHaut=#PB_Key_Pad4 
Camera\ToucheAngleBas=#PB_Key_Pad1
Camera\Vue = 1
;{- Matrice
;/Paramètres de la matrice (à renseigner)
Matrice\Largeur    = 1000
Matrice\Profondeur = 1000
Matrice\NbFacetteX = 50
Matrice\NbFacetteZ = 50
Matrice\FaceVisible = #True ; #True double les triangles pour rendre visible l'autre face de la matrice
Matrice\TailleTextureX = 512
Matrice\TailleTextureZ = 512   
;/Quelques informations complémentaires sur la matrice ( Calculées )
If Matrice\FaceVisible
    Matrice\Nbtriangle = 4
Else
    Matrice\Nbtriangle = 2
EndIf 
Matrice\NbPointX = Matrice\NbFacetteX + 1
Matrice\NbPointZ = Matrice\NbFacetteZ + 1
Matrice\TailleFacetteX = Matrice\Largeur / Matrice\NbFacetteX
Matrice\TailleFacetteZ = Matrice\Profondeur / Matrice\NbFacetteZ
Matrice\PointIDMemory    = AllocateMemory(12 * Matrice\NbPointX * Matrice\NbPointZ)
Matrice\TriangleIDMemory = AllocateMemory(12 * Matrice\NbFacetteX * Matrice\NbFacetteZ * Matrice\Nbtriangle)
Matrice\TextureIDMemory  = AllocateMemory(12 * Matrice\NbPointX * Matrice\NbPointZ) 
Matrice\NormaleIDMemory  = AllocateMemory(12 * Matrice\NbPointX * Matrice\NbPointZ) 
Dim Points.Vecteur(Matrice\NbPointX * Matrice\NbPointZ) ; A supprimer en écrivant directement dans la mémoire normales!!
;}
;}
;{- Declare
Declare calculVecteurNorme(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
Declare produitVectoriel(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
Declare Matrice()
Declare TextureMatrice(x.l,Z.l,Notexture.l)
Declare NormalesMatrice()
Declare vagues()
Declare.f GetHeight(Xp.f,Zp.f)
Declare HauteurPoint(x.l, Z.l, Hauteur.f)
Declare HauteurFacette(x.l, Z.l, Hauteur.f)
Declare.f WrapValue(Angle.f)
Declare.f NewXValue( x.f , Angle.f , NbUnite.f )
Declare.f NewZValue( Z.f , Angle.f , NbUnite.f )
Declare.f EcartAngle( angle1.f , angle2.f )
Declare.f CurveAngle( Actuelle.f , Cible.f , P.f )
Declare.f CurveValue( Actuelle.f , Cible.f , P.f )
Declare GestionCamera()
;}   
 ;-Matrice
Procedure calculVecteurNorme(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
    x.f = *v2\x - *v1\x
    y.f = *v2\y - *v1\y
    Z.f = *v2\Z - *v1\Z
    d.f = Sqr(x * x + y * y + Z * Z)
    *n\x =x / d
    *n\y =y / d
    *n\Z =Z / d
    *n\x =x 
    *n\y =y 
    *n\Z =Z   
EndProcedure
Procedure produitVectoriel(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
    *n\x = *v1\y * *v2\Z - *v1\Z * *v2\y
    *n\y = *v1\Z * *v2\x - *v1\x * *v2\Z
    *n\Z = *v1\x * *v2\y - *v1\y * *v2\x
EndProcedure
Procedure Matrice()
    Adresse1 = Matrice\PointIDMemory    ; Adresse Points
    Adresse2 = Matrice\TextureIDMemory  ; Adresse Texture
    adresse3 = Matrice\TriangleIDMemory ; Adresse triangles
    Index = 6 * Matrice\Nbtriangle
    For b = 0 To Matrice\NbFacetteZ
        bx = b * Matrice\NbPointX
        bx1 = bx + Matrice\NbPointX
        For a = 0 To Matrice\NbFacetteX
            ;/Points
            PokeF(Adresse1, (a - Matrice\NbFacetteX / 2) * Matrice\TailleFacetteX)
            PokeF(Adresse1 + 4, 0)
            PokeF(Adresse1 + 8, (b - Matrice\NbFacetteZ / 2) * Matrice\TailleFacetteZ)
            Adresse1 + 12
            ;/Texture
            PokeF(Adresse2, a / Matrice\NbFacetteX)
            PokeF(Adresse2 + 4, b / Matrice\NbFacetteZ)
            Adresse2 + 8
            ;/Triangles
            If b < Matrice\NbFacetteZ And a < Matrice\NbFacetteX
                P1 = a + bx
                P2 = P1 + 1
                P3 = a + bx1
                P4 = P3 + 1
                PokeL(adresse3, P4 << 16 + P1)         
                PokeL(adresse3 + 4, P1 << 16 + P2)
                PokeL(adresse3 + 8, P4 << 16 + P3)
                If Matrice\FaceVisible
                    PokeL(adresse3 + 12, P2 << 16 + P1)
                    PokeL(adresse3 + 16, P4 << 16 + P3)
                    PokeL(adresse3 + 20, P2 << 16 + P3)
                EndIf
                adresse3 + Index
            EndIf 
        Next
    Next
EndProcedure
Procedure NormalesMatrice()
    Vecteur1.Vecteur
    Vecteur2.Vecteur
    
    P1.Vecteur ; Point 1 de la Facette
    P2.Vecteur ; Point 2 de la Facette 
    P3.Vecteur ; Point 3 de la Facette
    P4.Vecteur ; Point 4 de la Facette
    
    Normale1.Vecteur ; Normale Triangle 1 de la Facette Points 1,2,3
    Normale2.Vecteur ; Normale Triangle 2 de la Facette Points 2,4,3
    
    adresse = Matrice\PointIDMemory + 4
    AdrNormale = Matrice\NormaleIDMemory
    
    For Z = 0 To Matrice\NbFacetteZ - 1
        zx = Z * Matrice\NbPointX
        zx1 = zx + Matrice\NbPointX
        For x = 0 To Matrice\NbFacetteX - 1
            
            NoPoint1 = x + zx
            P1\x = x
            P1\y = PeekF(adresse + NoPoint1 * 12)
            P1\Z = Z
            NoPoint2 = NoPoint1 + 1
            P2\x = x + 1
            P2\y = PeekF(adresse + NoPoint2 * 12)
            P2\Z = Z
            NoPoint3 = x + zx1
            P3\x = x 
            P3\y = PeekF(adresse + NoPoint3 * 12)
            P3\Z = Z + 1
            NoPoint4 = NoPoint3 + 1
            P4\x = x + 1
            P4\y = PeekF(adresse + NoPoint4 * 12)
            P4\Z = Z + 1
            
            calculVecteurNorme(@P1,@P2,@Vecteur1)
            calculVecteurNorme(@P1,@P4,@Vecteur2)
            produitVectoriel(@Vecteur2,@Vecteur1,@Normale1)
            calculVecteurNorme(@P2,@P4,@Vecteur1)
            calculVecteurNorme(@P2,@P3,@Vecteur2)
            produitVectoriel(@Vecteur2,@Vecteur1,@Normale2)
            ;Voir pour faire ces calculs directement dans la mémoire Normales !
            Points(NoPoint1)\x + Normale1\x
            Points(NoPoint1)\y + Normale1\y
            Points(NoPoint1)\Z + Normale1\Z
            Points(NoPoint2)\x + Normale1\x + Normale2\x
            Points(NoPoint2)\y + Normale1\y + Normale2\y
            Points(NoPoint2)\Z + Normale1\Z + Normale2\Z
            Points(NoPoint3)\x + Normale1\x + Normale2\x
            Points(NoPoint3)\y + Normale1\y + Normale2\y
            Points(NoPoint3)\Z + Normale1\Z + Normale2\Z
            Points(NoPoint4)\x + Normale2\x
            Points(NoPoint4)\y + Normale2\y
            Points(NoPoint4)\Z + Normale2\Z
            
        Next x
    Next Z 
    
    For Z = 0 To Matrice\NbFacetteZ 
        For x = 0 To Matrice\NbFacetteX 
            Distance.f = Sqr(Points(No)\x * Points(No)\x + Points(No)\y * Points(No)\y + Points(No)\Z * Points(No)\Z)
            Points(No)\x / Distance
            Points(No)\y / Distance
            Points(No)\Z / Distance
            PokeF(AdrNormale    , Points(No)\x)
            PokeF(AdrNormale + 4, Points(No)\y)
            PokeF(AdrNormale + 8, Points(No)\Z)
            No + 1
            AdrNormale + 12
        Next x
    Next Z 
    SetMeshData(0, 3, Matrice\NormaleIDMemory , Matrice\NbPointX * Matrice\NbPointZ)
EndProcedure
Procedure vagues()
    If Animation
        Vague\Angle = (Vague\Angle + Vague\Vitesse) % 360
    EndIf
    adresse = Matrice\PointIDMemory + 4
    For Z = 0 To Matrice\NbFacetteZ
        For x = 0 To Matrice\NbFacetteX
            Sommet.f = Sin(0.0174533 * (Vague\Angle + (x * Vague\decaleX) + (Z * Vague\decaleZ))) * Vague\Hauteur
            PokeF(adresse, Sommet)
            adresse + 12
        Next x
    Next Z
    SetMeshData(0, 0, Matrice\PointIDMemory, Matrice\NbPointX * Matrice\NbPointZ)
EndProcedure
Procedure.f GetHeight(Xp.f,Zp.f)
    ;Si quelqu'un a plus simple pour connaitre la hauteur d'un point je suis preneur :)
    P1.Vecteur
    P2.Vecteur
    P3.Vecteur
    P4.Vecteur
    ;Determine les points du plan
    x=Int(Xp/Matrice\TailleFacetteX)
    Z=Int(Zp/Matrice\TailleFacetteZ) 
    adresse = Matrice\PointIDMemory
    zx = Z * Matrice\NbPointX
    
    R1 = x + zx
    R2 = R1 + 1
    R3 = x + zx + Matrice\NbPointX
    R4 = R3 + 1
    
    adr = adresse + R1 * 12
    P1\x = PeekF(adr)
    P1\y = PeekF(adr + 4)
    P1\Z = PeekF(adr + 8)
    
    adr = adresse + R2 * 12
    P2\x=PeekF(adr)
    P2\y=PeekF(adr + 4)
    P2\Z=PeekF(adr + 8)
    
    adr = adresse + R3 * 12
    P3\x=PeekF(adr)
    P3\y=PeekF(adr + 4)
    P3\Z=PeekF(adr + 8)
    
    adr = adresse + R4 * 12
    P4\x=PeekF(adr)
    P4\y=PeekF(adr + 4)
    P4\Z=PeekF(adr + 8)
    
    Xw.f=(Xp-Matrice\Largeur/2)-P1\x-(Matrice\TailleFacetteX/2)
    Zw.f=(Zp-Matrice\Profondeur/2)-P1\Z-(Matrice\TailleFacetteZ/2) 
    If Zw-Xw<0
        a.f=(Xp-Matrice\Largeur/2)-P1\x
        d.f=P2\x-P1\x
        g.f=P4\x-P1\x
        e.f=P2\y-P1\y
        h.f=P4\y-P1\y
        c.f=(Zp-Matrice\Profondeur/2)-P1\Z
        f.f=P2\Z-P1\Z
        i.f=P4\Z-P1\Z
        y.f = (((c*e*g)-(c*d*h)+(a*f*h)-(a*e*i))/(f*g-d*i))+P1\y
    Else
        a.f=(Xp-Matrice\Largeur/2)-P1\x
        d.f=P3\x-P1\x
        g.f=P4\x-P1\x
        e.f=P3\y-P1\y
        h.f=P4\y-P1\y
        c.f=(Zp-Matrice\Profondeur/2)-P1\Z
        f.f=P3\Z-P1\Z
        i.f=P4\Z-P1\Z
        y.f = (((c*e*g)-(c*d*h)+(a*f*h)-(a*e*i))/(f*g-d*i))+P1\y
    EndIf 
    ProcedureReturn y
EndProcedure
Procedure HauteurPoint(x.l, Z.l, Hauteur.f)
    ;élève un point x,z de la matrice à la hauteur "Hauteur"
    If x > -1 And x <= Matrice\NbFacetteX And Z > -1 And Z <= Matrice\NbFacetteZ
        adresse = Matrice\PointIDMemory + 4
        adresse = adresse + (x + (Z * Matrice\NbPointX )) * 12
        PokeF(adresse, Hauteur)
        SetMeshData(0, 0, Matrice\PointIDMemory, Matrice\NbPointX * Matrice\NbPointZ)
        ProcedureReturn #True
    Else
        ProcedureReturn #False
    EndIf 
EndProcedure
Procedure HauteurFacette(x.l, Z.l, Hauteur.f)
    ;élève une facette de la matrice
    If x > 0 And x <= Matrice\NbFacetteX And Z > 0 And Z <= Matrice\NbFacetteZ
        adresse = Matrice\PointIDMemory + 4
        adresse + (x + (Z * Matrice\NbPointX )) * 12
        PokeF(adresse, Hauteur)
        adresse - 12
        PokeF(adresse, Hauteur)
        adresse  - (Matrice\NbFacetteX + 1) * 12
        PokeF(adresse, Hauteur)
        adresse + 12
        PokeF(adresse, Hauteur)
        SetMeshData(0, 0, Matrice\PointIDMemory, Matrice\NbPointX * Matrice\NbPointZ)
        ProcedureReturn #True
    Else
        ProcedureReturn #False
    EndIf 
EndProcedure
;-3D
Procedure.f WrapValue(Angle.f)
    Angle/360
    Angle-Int(Angle)
    If Angle<0
        ProcedureReturn (Angle+1)*360
    Else
        ProcedureReturn Angle*360
    EndIf
EndProcedure
Procedure.f NewXValue( x.f , Angle.f , NbUnite.f )
    ;à utiliser conjointement avec NewZvalue pour calculer une position de <NbUnite> dans la direction <angle>
    Valeur.f = x + Cos(Angle * 0.0174533) * NbUnite
    ProcedureReturn Valeur
EndProcedure
Procedure.f NewZValue( Z.f , Angle.f , NbUnite.f )
    ;à utiliser conjointement avec NewXvalue pour calculer une position de <NbUnite> dans la direction <angle>
    Valeur.f = Z - Sin(Angle * 0.0174533) * NbUnite
    ProcedureReturn Valeur
EndProcedure
Procedure.f EcartAngle( angle1.f , angle2.f )
    Delta.f=angle2-angle1
    If Delta>180
        ProcedureReturn Delta-360
    ElseIf Delta<=-180
        ProcedureReturn Delta+360
    Else
        ProcedureReturn Delta
    EndIf   
EndProcedure 
Procedure.f CurveAngle( Actuelle.f , Cible.f , P.f )
    ;Calcule un angle progressif allant de la valeur actuelle à la valeur cible
    Delta.f = EcartAngle( Actuelle , Cible )
    If P > 1000 : P = 1000 : EndIf
    Valeur.f = Actuelle + ( Delta * P / 1000 )
    ProcedureReturn WrapValue( Valeur )
EndProcedure
Procedure.f CurveValue( Actuelle.f , Cible.f , P.f )
    ;Calcule une valeur progressive allant de la valeur actuelle à la valeur cible
    Delta.f = Cible - Actuelle
    If P > 1000 : P = 1000 : EndIf
    Valeur.f = Actuelle + Round(( Delta * P / 1000 ),1)
    ProcedureReturn Valeur
EndProcedure
Procedure GestionCamera()
    PosXCamera.f = NewXValue(EntityX(0) , Joueur\AngleX + 180 , Camera\Distance)
    PosZCamera.f = NewZValue(EntityZ(0) , Joueur\AngleX + 180 , Camera\Distance)
    PosYCamera.f = EntityY(0) + Camera\Hauteur
    CameraLocate(0 , PosXCamera , PosYCamera , PosZCamera)
    CameraLookAt(0 , EntityX(0) , EntityY(0) + Camera\AngleY , EntityZ(0))     
EndProcedure
Procedure SuiviCube()
    ;Calcule les coordonnées des 4 coins du cube
    ;Les entitys permettent de vérifier que le calcul des coins est correct
    ;Distance du centre à chaque coin ( l'objet est carré )
    DistanceCoin.f=Sqr(32*32+32*32)/2
    ;Coin Avant Gauche
    AngleCoin.f=WrapValue(Joueur\AngleX+45)
    AvantGaucheX.f=NewXValue(EntityX(0),AngleCoin,DistanceCoin)
    AvantGaucheZ.f=NewZValue(EntityZ(0),AngleCoin,DistanceCoin)
    EntityLocate(2,AvantGaucheX,EntityY(0),AvantGaucheZ)
    ;Coin Avant Droit
    AngleCoin=WrapValue(Joueur\AngleX-45)
    AvantDroitX.f=NewXValue(EntityX(0),AngleCoin,DistanceCoin)
    AvantDroitZ.f=NewZValue(EntityZ(0),AngleCoin,DistanceCoin)
    EntityLocate(3,AvantDroitX,EntityY(0),AvantDroitZ)
    ;Coin Arrière Gauche
    AngleCoin=WrapValue(Joueur\AngleX+135)
    ArriereGaucheX.f=NewXValue(EntityX(0),AngleCoin,DistanceCoin)
    ArriereGaucheZ.f=NewZValue(EntityZ(0),AngleCoin,DistanceCoin)
    EntityLocate(4,ArriereGaucheX,EntityY(0),ArriereGaucheZ)
    ;Coin Arrière Droit
    AngleCoin=WrapValue(Joueur\AngleX-135)
    ArriereDroitX.f=NewXValue(EntityX(0),AngleCoin,DistanceCoin)
    ArriereDroitZ.f=NewZValue(EntityZ(0),AngleCoin,DistanceCoin)
    EntityLocate(5,ArriereDroitX,EntityY(0),ArriereDroitZ)
    
    ;Hauteur des coins
    AvantGaucheH.f=GetHeight(AvantGaucheX,AvantGaucheZ)
    AvantDroitH.f=GetHeight(AvantDroitX,AvantDroitZ)
    ArriereGaucheH.f=GetHeight(ArriereGaucheX,ArriereGaucheZ)
    ArriereDroitH.f=GetHeight(ArriereDroitX,ArriereDroitZ)
    ;écarts Largeur / Longueur devrait permettre de calculer l'angle d'inclinaison !
    Largeur=((AvantDroitH-AvantGaucheH)+(ArriereDroitH-ArriereGaucheH))/2.0
    Longueur=((ArriereGaucheH-AvantGaucheH)+(ArriereDroitH-AvantDroitH))/2.0
    
    ;Corrige la hauteur ( 3 c'est la moitié de l'épaisseur de l'objet)
    HauteurCentre.f=GetHeight(EntityX(0),EntityZ(0)) + 3
    MoyenneHauteur.f=(AvantGaucheH+AvantDroitH+ArriereGaucheH+ArriereDroitH)/4.0
    If MoyenneHauteur>HauteurCentre
        HauteurCentre=MoyenneHauteur
    EndIf
    EntityLocate(0,EntityX(0),HauteurCentre,EntityZ(0))
    ;Et maintenant , il ne manque plus que la rotation pour que l'objet suive les contours !!
    ; mais c'est là que ça coince !
    
    ;Extrait de l'exemple que j'ai utilisé ( ceux qui connaissent darkbasic l'auront reconnu )
    ; dans cet exemple , ne pas tenir compte de mx et mz c'est le décalage de la matrice , donc = 0
    ;Syntaxe Foot# => c'est un flottant.
    ;La partie intéressante c'est celle ci ( ne pas tenir compte de l'objet 1)
    ;Comment arriver à ce résultat ??
    ; 
    ;-
    ;/>>>  rotate object 2,WrapValue(length#/4.0),0,WrapValue(across#/4.0)  <<<<<
    ;-
    
    ;   rem Calculate four x+Z coordinates For each corner
    ;     foot#=110
    ;     ta#=WrapValue(a#-45)
    ;     frontleftx#=NewXValue(x#,ta#,foot#) : frontleftz#=NewZValue(Z#,ta#,foot#)
    ;     ta#=WrapValue(a#+45)
    ;     frontrightx#=NewXValue(x#,ta#,foot#) : frontrightz#=NewZValue(Z#,ta#,foot#)
    ;     ta#=WrapValue(a#+225)
    ;     backleftx#=NewXValue(x#,ta#,foot#) : backleftz#=NewZValue(Z#,ta#,foot#)
    ;     ta#=WrapValue(a#+135)
    ;     backrightx#=NewXValue(x#,ta#,foot#) : backrightz#=NewZValue(Z#,ta#,foot#)
    ;     
    ;     rem Calculate degree of tilting from corner heights
    ;     frontlefth#=get ground height(1,frontleftx#-mx#,frontleftz#-mz#)
    ;     frontrighth#=get ground height(1,frontrightx#-mx#,frontrightz#-mz#)
    ;     backlefth#=get ground height(1,backleftx#-mx#,backleftz#-mz#)
    ;     backrighth#=get ground height(1,backrightx#-mx#,backrightz#-mz#)
    ;     across#=((frontrighth#-frontlefth#)+(backrighth#-backlefth#))/2.0
    ;     length#=((backlefth#-frontlefth#)+(backrighth#-frontrighth#))/2.0
    ;     
    ;     rem Update tank model
    ;     h#=get ground height(1,x#-mx#,Z#-mz#)
    ;     trackh#=(frontlefth#+frontrighth#+backlefth#+backrighth#)/4.0
    ;     If trackh#>h# then h#=trackh#
    ;       position object 1,x#,h#,Z#
    ;       yrotate object 1,a#
    ;       rotate object 2,WrapValue(length#/4.0),0,WrapValue(across#/4.0)
EndProcedure
 ;{- Initialisation
If InitEngine3D() = 0
    MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
    End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
    MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
    End
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "Démo PlateForme" ) = 0
    MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
    End
EndIf
;}
;{- Dessine la matrice
Matrice()
For a=1 To Matrice\NbFacetteX
    HauteurFacette(a,1,40)
    HauteurFacette(a,Matrice\NbFacetteZ,40)
Next a 
For b=1 To Matrice\NbFacetteZ
    HauteurFacette(1,b,40)
    HauteurFacette(Matrice\NbFacetteX,b,40)
Next b
For b=Matrice\NbFacetteZ/2 - 11 To Matrice\NbFacetteZ/2 + 11
    For a=Matrice\NbFacetteX/2 - 11 To Matrice\NbFacetteX/2 + 11
        Cond1 = a>=Matrice\NbFacetteX/2 - 8 And a<=Matrice\NbFacetteX/2 - 2
        Cond2 = a>=Matrice\NbFacetteX/2 + 2 And a<=Matrice\NbFacetteX/2 + 8
        Cond3 = b>=Matrice\NbFacetteZ/2 - 8 And b<=Matrice\NbFacetteZ/2 - 2
        cond4 = b>=Matrice\NbFacetteZ/2 + 2 And b<=Matrice\NbFacetteZ/2 + 8
        If (Cond1 Or Cond2) And (Cond3 Or cond4)
            HauteurFacette(a,b,40)
        Else
            HauteurFacette(a,b,80)
        EndIf 
    Next a
Next b
NormalesMatrice()
;}
;{- Mesh
;/Mesh
CreateMesh(#MeshMatrice)
SetMeshData(#MeshMatrice, 0, Matrice\PointIDMemory   , Matrice\NbPointX * Matrice\NbPointZ)
SetMeshData(#MeshMatrice, 1, Matrice\TriangleIDMemory, Matrice\NbFacetteX * Matrice\NbFacetteZ * Matrice\Nbtriangle)
SetMeshData(#MeshMatrice, 2, Matrice\TextureIDMemory , Matrice\NbPointX * Matrice\NbPointZ) 
SetMeshData(#MeshMatrice, 3, Matrice\NormaleIDMemory , Matrice\NbPointX * Matrice\NbPointZ) 
CreateMesh(#MeshCube) ;Cube
SetMeshData(#MeshCube,#PB_Mesh_Vertices     , ?CubePoints       , 16)
SetMeshData(#MeshCube,#PB_Mesh_Triangles    , ?CubeTriangles    , 12)
SetMeshData(#MeshCube,#PB_Mesh_UVCoordinates, ?CubeTextures     , 16)
SetMeshData(#MeshCube,#PB_Mesh_Normals      , ?CubeNormales     , 16)
;}
;{- Textures
CreateTexture(1,128, 128)
StartDrawing(TextureOutput(1))
Box(0,0,TextureWidth(1),TextureHeight(1),RGB(200,100,220))
StopDrawing() 
CreateTexture(2,128, 128)
StartDrawing(TextureOutput(2))
Box(0,0,TextureWidth(2),TextureHeight(2),RGB(100,200,130))
StopDrawing()
CreateTexture(3,128, 128)
StartDrawing(TextureOutput(3))
Box(0,0,TextureWidth(2),TextureHeight(2),RGB(255,100,100))
StopDrawing() 
CreateTexture(0, Matrice\TailleTextureX, Matrice\TailleTextureZ)
StartDrawing(TextureOutput(0))
Box(0,0,TextureWidth(0)/2,TextureHeight(0)/2,RGB(0,200,0))
Box(TextureWidth(0)/2,0,TextureWidth(0)/2,TextureHeight(0)/2,RGB(0,0,200))
Box(0,TextureHeight(0)/2,TextureWidth(0)/2,TextureHeight(0)/2,RGB(200,0,0))
Box(TextureWidth(0)/2,TextureHeight(0)/2,TextureWidth(0)/2,TextureHeight(0)/2,RGB(200,200,0))
While bb.f<=TextureHeight(0)
    While aa.f<=TextureWidth(0)
        LineXY(aa,0,aa,TextureHeight(0),RGB(255,255,255))
        LineXY(0,bb,TextureWidth(0),bb,RGB(255,255,255))
        aa + Matrice\TailleTextureX / Matrice\NbPointX
    Wend
    bb + Matrice\TailleTextureZ / Matrice\NbPointZ
    aa = 0
Wend
StopDrawing() 
;}
;{- Material
For a = 0 To 3
    CreateMaterial(a, TextureID( a))
Next a
MaterialShadingMode(0, #PB_Material_Gouraud)
MaterialAmbientColor(0, RGB(225,125,125))
MaterialDiffuseColor(0, RGB(255,255,255))
MaterialSpecularColor(0,RGB(255,0,0))
;}
;{- Entity
;Joueur
CreateEntity(0,MeshID(#MeshCube),MaterialID(1))
ScaleEntity(0,32,6,32)
EntityLocate(0,500,3,500)
Joueur\AngleX = 0
RotateEntity(0,Joueur\AngleX,0,0)
;Sol
CreateEntity(1,MeshID(#MeshMatrice),MaterialID(0))
EntityLocate(1,Matrice\Largeur/2,0,Matrice\Profondeur/2)
;visualise les coins du cube
tr=6
CreateEntity(2,MeshID(#MeshCube),MaterialID(2))
ScaleEntity(2,tr,tr,tr)
CreateEntity(3,MeshID(#MeshCube),MaterialID(2))
ScaleEntity(3,tr,tr,tr)
CreateEntity(4,MeshID(#MeshCube),MaterialID(3))
ScaleEntity(4,tr,tr,tr)
CreateEntity(5,MeshID(#MeshCube),MaterialID(3))
ScaleEntity(5,tr,tr,tr)
;}
;{- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraLocate(0,0,200,0)
;}
;{- Light
AmbientColor(RGB(160,160,160))
CreateLight(0,RGB(155,155,155))
LightLocate(0 , Matrice\Largeur,600,Matrice\Profondeur/2)
;}   
;{- Datas Cube
DataSection
;/Cube
CubePoints:
Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5

Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5
CubeNormales:
Data.f -5,0,-5
Data.f -5,0,5
Data.f 5,0,5
Data.f 5,0,-5
Data.f -5,0,-5
Data.f -5,0,5
Data.f 5,0,5
Data.f 5,0,-5

Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0

CubeTriangles:
Data.w 0,4,7
Data.w 0,7,3
Data.w 1,5,4
Data.w 1,4,0
Data.w 2,6,5
Data.w 2,5,1
Data.w 3,7,6
Data.w 3,6,2
Data.w 9,8,11
Data.w 9,11,10
Data.w 12,13,14
Data.w 12,14,15
CubeTextures:
;original
Data.f 0,1
Data.f 1,1
Data.f 0,1
Data.f 1,1

Data.f 0,0
Data.f 1,0
Data.f 0,0
Data.f 1,0

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1
EndDataSection
;}

Speed=6
Repeat
    If ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Left)
            Joueur\AngleX = WrapValue( Joueur\AngleX + 1 )
            RotateEntity(0,1 , 0, 0 )
        ElseIf KeyboardPushed(#PB_Key_Right)
            Joueur\AngleX = WrapValue( Joueur\AngleX - 1 )
            RotateEntity(0, -1 , 0, 0 )
        EndIf
        ;If KeyboardPushed(#PB_Key_Up)
        Pas = Speed
        ;ElseIf KeyboardPushed(#PB_Key_Down)
        ;Pas = -Speed
        ;Else
        ;   Pas=0
        ;EndIf
        If KeyboardPushed(#PB_Key_Pad4)
            Joueur\AngleY + 0.1 : RotateEntity(0,0,0.1,0)
        EndIf
        If KeyboardPushed(#PB_Key_Pad1)
            Joueur\AngleY - 0.1 : RotateEntity(0,0,-0.1,0)
        EndIf 
        If KeyboardPushed(#PB_Key_Pad5)
            Joueur\AngleZ + 0.1 : RotateEntity(0,0,0,0.1)
        EndIf
        If KeyboardPushed(#PB_Key_Pad2)
            Joueur\AngleZ - 0.1 : RotateEntity(0,0,0,-0.1)
        EndIf
        If KeyboardReleased(#PB_Key_F4) : AfficheAide = 1 - AfficheAide : EndIf
    EndIf 
    dx.f=Cos( Joueur\AngleX * 0.0174533) * Pas
    dz.f=-Sin( Joueur\AngleX * 0.0174533) * Pas
    ;****1
    If EntityX(0)+dx>(Matrice\Largeur)-150
        dob1+1
        If dob<270
            Joueur\AngleX = WrapValue(Joueur\AngleX-1)
            RotateEntity(0, -1 , 0, 0 )
        EndIf
        If dob1>270
            dob1=0
        EndIf
        dx=(Matrice\Largeur)-150
    EndIf
    ;***3
    If EntityX(0)+dx<(150)
        dob3+1
        If dob3<90
            Joueur\AngleX = WrapValue( Joueur\AngleX-1)
            RotateEntity(0, -1 , 0, 0 )
        EndIf
        dx=(Matrice\Largeur)-Largeur+150
        If dob3>90
           dob3=0
        EndIf
        
    EndIf
    ;**4
    If EntityZ(0)+dz<(150)
        dob4+1
        If dob4<90
            Joueur\AngleX = WrapValue(Joueur\AngleX-1)
            RotateEntity(0, -1 , 0, 0 )
        EndIf
        If dob4>90
            dob4=0
        EndIf
        dz=(Matrice\Profondeur)-Profondeur+150
    EndIf
    
    
    ;**2
    
    If EntityZ(0)+dz>(Matrice\Profondeur)-150
        dob2+1
        If dob2<180
            Joueur\AngleX = WrapValue(Joueur\AngleX-1)
            RotateEntity(0, -1 , 0, 0 )
        EndIf
        dz=(Matrice\Profondeur)+150
        If dob2>180
            dob2=0
        EndIf
    EndIf
    
    
    
    
    
    
    
    If EntityX(0) + dx > 0 And EntityX(0) + dx < Matrice\Largeur
        If EntityZ(0) + dz > 0 And EntityZ(0) + dz < Matrice\Profondeur
            MoveEntity( 0 , dx , 0, dz )
        EndIf 
    EndIf
    SuiviCube()
    ;h.f=GetHeight(EntityX(0),EntityZ(0))+3
    ;EntityLocate(0,EntityX(0),h,EntityZ(0))
    GestionCamera()
    RenderWorld()
    StartDrawing(ScreenOutput())
    DrawingMode(1)
    FrontColor(255,255,255)
    Locate(10,10) 
    DrawText("AngleX = "+StrF(Joueur\AngleX,2))
    Locate(10,30) 
    DrawText("AngleY = "+StrF(Joueur\AngleY,2))
    Locate(10,50) 
    DrawText("AngleZ = "+StrF(Joueur\AngleZ,2))
    Locate(10,70) 
    DrawText("Largeur = "+StrF(Largeur,2))
    Locate(10,90) 
    DrawText("Longueur = "+StrF(Longueur,2))
    Locate(10,110) 
    DrawText("dx = "+StrF(EntityX(0)+dx,2))
    Locate(10,130) 
    DrawText("dz = "+StrF(EntityZ(0)+dz,2))
    
    StopDrawing()
    FlipBuffers()
    ;Delay(10)
Until KeyboardPushed(#PB_Key_Escape)
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Dobro,

Ton code fonctionne bien chez moi.

Par contre j'ai ermarqué dans certains cas ce genre de message d'erreur qui est du aux limitations de ma carte graphique (le m^me prog plante chez moi et fonctionne ailleurs).

En tout cas ton prog est au point.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

non t'a pas compris !!
au dessus c'est le code de comtois legerement modifie pour qu'il fonctionne
tous seul sans utiliser les touches fleche !!

moi mon probleme c'est de le mettre en screen-saver


comme ca :

Code : Tout sélectionner

; Matrix Cree Par Dobro
; ici les initialisations des variables et tableaux 
;"/s" pour le lancer
;"/c:" + un nombre pour le faire Paramétrer
;"/p", espace, et un nombre qd son nom est simplement séletionné dans la boîte des propriétés du bureau

;Sinon, un truc tout con:
;Code:

;OpenConsole()
;p$=ProgramParameter()
;While p$
;    PrintN(p$)
;    p$=ProgramParameter()
;Wend
;Input()
 
;
Enumeration
    #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
    #code
    #Text_0
EndEnumeration

 ;-Constantes
;/ Ecran
#ScreenWidth = 800
#ScreenHeight = 600
#ScreenDepth = 32
;/ Mesh
Enumeration
    #MeshMatrice
    #MeshCube
EndEnumeration
;-Structures
Structure Vecteur
    x.f
    y.f
    Z.f
EndStructure
Structure Lumiere
    Couleur.l
    x.f
    y.f
    Z.f
EndStructure 
Structure Matrice
    Largeur.f
    Profondeur.f
    NbFacetteX.l     
    NbFacetteZ.l     
    FaceVisible.l      ; si = #True on double les triangles pour voir l'entité des deux côtés
    NbPointX.l
    NbPointZ.l
    Nbtriangle.l
    TailleFacetteX.f   ; Je ne sais pas si je vais garder cette méthode
    TailleFacetteZ.f   ; Je ne sais pas si je vais garder cette méthode 
    TailleTextureX.l
    TailleTextureZ.l
    PointIDMemory.l
    TriangleIDMemory.l
    TextureIDMemory.l
    NormaleIDMemory.l
EndStructure
Structure Vague
    decaleX.l
    decaleZ.l
    Hauteur.l
    Angle.l
    Vitesse.l
EndStructure 
Structure Camera
    AngleX.l       ; angle de la camera
    AngleY.l
    VitesseRotation.l
    SensRotation.l ; Sens et Vitesse de Rotation
    Distance.l     ; distance entre la camera et le perso
    Hauteur.l      ; hauteur de la camera
    ToucheHaut.l
    ToucheBas.l
    ToucheAvance.l
    ToucheRecul.l
    ToucheAngleHaut.l
    ToucheAngleBas.l
    Vue.l
EndStructure
Structure Parametres
    AngleX.f         ; 
    AngleY.f         ;
    AngleZ.f         ; 
    PosX.l           ;position en x sur la map du robot
    PosZ.l           ;position en z sur la map du robot
    Sens.l           ;Vitesse et Sens de Rotation du robot
    Pas.l            ;Valide déplacement   
EndStructure
;{- Variables
Global Matrice.Matrice
Global Lumiere.Lumiere
Global Vague.Vague
Global Camera.Camera
Global Joueur.Parametres
Global Largeur.f,Longueur.f
Camera\Hauteur=69
Camera\Distance=145
Camera\AngleY = 0
Camera\VitesseRotation = 2
Camera\ToucheHaut=#PB_Key_Pad6
Camera\ToucheBas=#PB_Key_Pad3
Camera\ToucheAvance=#PB_Key_Pad5
Camera\ToucheRecul=#PB_Key_Pad2
Camera\ToucheAngleHaut=#PB_Key_Pad4 
Camera\ToucheAngleBas=#PB_Key_Pad1
Camera\Vue = 1
;{- Matrice
;/Paramètres de la matrice (à renseigner)
Matrice\Largeur    = 1000
Matrice\Profondeur = 1000
Matrice\NbFacetteX = 50
Matrice\NbFacetteZ = 50
Matrice\FaceVisible = #True ; #True double les triangles pour rendre visible l'autre face de la matrice
Matrice\TailleTextureX = 512
Matrice\TailleTextureZ = 512   
;/Quelques informations complémentaires sur la matrice ( Calculées )
If Matrice\FaceVisible
    Matrice\Nbtriangle = 4
Else
    Matrice\Nbtriangle = 2
EndIf 
Matrice\NbPointX = Matrice\NbFacetteX + 1
Matrice\NbPointZ = Matrice\NbFacetteZ + 1
Matrice\TailleFacetteX = Matrice\Largeur / Matrice\NbFacetteX
Matrice\TailleFacetteZ = Matrice\Profondeur / Matrice\NbFacetteZ
Matrice\PointIDMemory    = AllocateMemory(12 * Matrice\NbPointX * Matrice\NbPointZ)
Matrice\TriangleIDMemory = AllocateMemory(12 * Matrice\NbFacetteX * Matrice\NbFacetteZ * Matrice\Nbtriangle)
Matrice\TextureIDMemory  = AllocateMemory(12 * Matrice\NbPointX * Matrice\NbPointZ) 
Matrice\NormaleIDMemory  = AllocateMemory(12 * Matrice\NbPointX * Matrice\NbPointZ) 
Dim Points.Vecteur(Matrice\NbPointX * Matrice\NbPointZ) ; A supprimer en écrivant directement dans la mémoire normales!!
;}
;}
;{- Declare
Declare calculVecteurNorme(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
Declare produitVectoriel(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
Declare Matrice()
Declare TextureMatrice(x.l,Z.l,Notexture.l)
Declare NormalesMatrice()
Declare vagues()
Declare.f GetHeight(Xp.f,Zp.f)
Declare HauteurPoint(x.l, Z.l, Hauteur.f)
Declare HauteurFacette(x.l, Z.l, Hauteur.f)
Declare.f WrapValue(Angle.f)
Declare.f NewXValue( x.f , Angle.f , NbUnite.f )
Declare.f NewZValue( Z.f , Angle.f , NbUnite.f )
Declare.f EcartAngle( angle1.f , angle2.f )
Declare.f CurveAngle( Actuelle.f , Cible.f , P.f )
Declare.f CurveValue( Actuelle.f , Cible.f , P.f )
Declare GestionCamera()
;}   
 ;-Matrice
Procedure calculVecteurNorme(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
    x.f = *v2\x - *v1\x
    y.f = *v2\y - *v1\y
    Z.f = *v2\Z - *v1\Z
    d.f = Sqr(x * x + y * y + Z * Z)
    *n\x =x / d
    *n\y =y / d
    *n\Z =Z / d
    *n\x =x 
    *n\y =y 
    *n\Z =Z   
EndProcedure
Procedure produitVectoriel(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
    *n\x = *v1\y * *v2\Z - *v1\Z * *v2\y
    *n\y = *v1\Z * *v2\x - *v1\x * *v2\Z
    *n\Z = *v1\x * *v2\y - *v1\y * *v2\x
EndProcedure
Procedure Matrice()
    Adresse1 = Matrice\PointIDMemory    ; Adresse Points
    Adresse2 = Matrice\TextureIDMemory  ; Adresse Texture
    adresse3 = Matrice\TriangleIDMemory ; Adresse triangles
    Index = 6 * Matrice\Nbtriangle
    For b = 0 To Matrice\NbFacetteZ
        bx = b * Matrice\NbPointX
        bx1 = bx + Matrice\NbPointX
        For a = 0 To Matrice\NbFacetteX
            ;/Points
            PokeF(Adresse1, (a - Matrice\NbFacetteX / 2) * Matrice\TailleFacetteX)
            PokeF(Adresse1 + 4, 0)
            PokeF(Adresse1 + 8, (b - Matrice\NbFacetteZ / 2) * Matrice\TailleFacetteZ)
            Adresse1 + 12
            ;/Texture
            PokeF(Adresse2, a / Matrice\NbFacetteX)
            PokeF(Adresse2 + 4, b / Matrice\NbFacetteZ)
            Adresse2 + 8
            ;/Triangles
            If b < Matrice\NbFacetteZ And a < Matrice\NbFacetteX
                P1 = a + bx
                P2 = P1 + 1
                P3 = a + bx1
                P4 = P3 + 1
                PokeL(adresse3, P4 << 16 + P1)         
                PokeL(adresse3 + 4, P1 << 16 + P2)
                PokeL(adresse3 + 8, P4 << 16 + P3)
                If Matrice\FaceVisible
                    PokeL(adresse3 + 12, P2 << 16 + P1)
                    PokeL(adresse3 + 16, P4 << 16 + P3)
                    PokeL(adresse3 + 20, P2 << 16 + P3)
                EndIf
                adresse3 + Index
            EndIf 
        Next
    Next
EndProcedure
Procedure NormalesMatrice()
    Vecteur1.Vecteur
    Vecteur2.Vecteur
    
    P1.Vecteur ; Point 1 de la Facette
    P2.Vecteur ; Point 2 de la Facette 
    P3.Vecteur ; Point 3 de la Facette
    P4.Vecteur ; Point 4 de la Facette
    
    Normale1.Vecteur ; Normale Triangle 1 de la Facette Points 1,2,3
    Normale2.Vecteur ; Normale Triangle 2 de la Facette Points 2,4,3
    
    adresse = Matrice\PointIDMemory + 4
    AdrNormale = Matrice\NormaleIDMemory
    
    For Z = 0 To Matrice\NbFacetteZ - 1
        zx = Z * Matrice\NbPointX
        zx1 = zx + Matrice\NbPointX
        For x = 0 To Matrice\NbFacetteX - 1
            
            NoPoint1 = x + zx
            P1\x = x
            P1\y = PeekF(adresse + NoPoint1 * 12)
            P1\Z = Z
            NoPoint2 = NoPoint1 + 1
            P2\x = x + 1
            P2\y = PeekF(adresse + NoPoint2 * 12)
            P2\Z = Z
            NoPoint3 = x + zx1
            P3\x = x 
            P3\y = PeekF(adresse + NoPoint3 * 12)
            P3\Z = Z + 1
            NoPoint4 = NoPoint3 + 1
            P4\x = x + 1
            P4\y = PeekF(adresse + NoPoint4 * 12)
            P4\Z = Z + 1
            
            calculVecteurNorme(@P1,@P2,@Vecteur1)
            calculVecteurNorme(@P1,@P4,@Vecteur2)
            produitVectoriel(@Vecteur2,@Vecteur1,@Normale1)
            calculVecteurNorme(@P2,@P4,@Vecteur1)
            calculVecteurNorme(@P2,@P3,@Vecteur2)
            produitVectoriel(@Vecteur2,@Vecteur1,@Normale2)
            ;Voir pour faire ces calculs directement dans la mémoire Normales !
            Points(NoPoint1)\x + Normale1\x
            Points(NoPoint1)\y + Normale1\y
            Points(NoPoint1)\Z + Normale1\Z
            Points(NoPoint2)\x + Normale1\x + Normale2\x
            Points(NoPoint2)\y + Normale1\y + Normale2\y
            Points(NoPoint2)\Z + Normale1\Z + Normale2\Z
            Points(NoPoint3)\x + Normale1\x + Normale2\x
            Points(NoPoint3)\y + Normale1\y + Normale2\y
            Points(NoPoint3)\Z + Normale1\Z + Normale2\Z
            Points(NoPoint4)\x + Normale2\x
            Points(NoPoint4)\y + Normale2\y
            Points(NoPoint4)\Z + Normale2\Z
            
        Next x
    Next Z 
    
    For Z = 0 To Matrice\NbFacetteZ 
        For x = 0 To Matrice\NbFacetteX 
            Distance.f = Sqr(Points(No)\x * Points(No)\x + Points(No)\y * Points(No)\y + Points(No)\Z * Points(No)\Z)
            Points(No)\x / Distance
            Points(No)\y / Distance
            Points(No)\Z / Distance
            PokeF(AdrNormale    , Points(No)\x)
            PokeF(AdrNormale + 4, Points(No)\y)
            PokeF(AdrNormale + 8, Points(No)\Z)
            No + 1
            AdrNormale + 12
        Next x
    Next Z 
    SetMeshData(0, 3, Matrice\NormaleIDMemory , Matrice\NbPointX * Matrice\NbPointZ)
EndProcedure
Procedure vagues()
    If Animation
        Vague\Angle = (Vague\Angle + Vague\Vitesse) % 360
    EndIf
    adresse = Matrice\PointIDMemory + 4
    For Z = 0 To Matrice\NbFacetteZ
        For x = 0 To Matrice\NbFacetteX
            Sommet.f = Sin(0.0174533 * (Vague\Angle + (x * Vague\decaleX) + (Z * Vague\decaleZ))) * Vague\Hauteur
            PokeF(adresse, Sommet)
            adresse + 12
        Next x
    Next Z
    SetMeshData(0, 0, Matrice\PointIDMemory, Matrice\NbPointX * Matrice\NbPointZ)
EndProcedure
Procedure.f GetHeight(Xp.f,Zp.f)
    ;Si quelqu'un a plus simple pour connaitre la hauteur d'un point je suis preneur :)
    P1.Vecteur
    P2.Vecteur
    P3.Vecteur
    P4.Vecteur
    ;Determine les points du plan
    x=Int(Xp/Matrice\TailleFacetteX)
    Z=Int(Zp/Matrice\TailleFacetteZ) 
    adresse = Matrice\PointIDMemory
    zx = Z * Matrice\NbPointX
    
    R1 = x + zx
    R2 = R1 + 1
    R3 = x + zx + Matrice\NbPointX
    R4 = R3 + 1
    
    adr = adresse + R1 * 12
    P1\x = PeekF(adr)
    P1\y = PeekF(adr + 4)
    P1\Z = PeekF(adr + 8)
    
    adr = adresse + R2 * 12
    P2\x=PeekF(adr)
    P2\y=PeekF(adr + 4)
    P2\Z=PeekF(adr + 8)
    
    adr = adresse + R3 * 12
    P3\x=PeekF(adr)
    P3\y=PeekF(adr + 4)
    P3\Z=PeekF(adr + 8)
    
    adr = adresse + R4 * 12
    P4\x=PeekF(adr)
    P4\y=PeekF(adr + 4)
    P4\Z=PeekF(adr + 8)
    
    Xw.f=(Xp-Matrice\Largeur/2)-P1\x-(Matrice\TailleFacetteX/2)
    Zw.f=(Zp-Matrice\Profondeur/2)-P1\Z-(Matrice\TailleFacetteZ/2) 
    If Zw-Xw<0
        a.f=(Xp-Matrice\Largeur/2)-P1\x
        d.f=P2\x-P1\x
        g.f=P4\x-P1\x
        e.f=P2\y-P1\y
        h.f=P4\y-P1\y
        c.f=(Zp-Matrice\Profondeur/2)-P1\Z
        f.f=P2\Z-P1\Z
        i.f=P4\Z-P1\Z
        y.f = (((c*e*g)-(c*d*h)+(a*f*h)-(a*e*i))/(f*g-d*i))+P1\y
    Else
        a.f=(Xp-Matrice\Largeur/2)-P1\x
        d.f=P3\x-P1\x
        g.f=P4\x-P1\x
        e.f=P3\y-P1\y
        h.f=P4\y-P1\y
        c.f=(Zp-Matrice\Profondeur/2)-P1\Z
        f.f=P3\Z-P1\Z
        i.f=P4\Z-P1\Z
        y.f = (((c*e*g)-(c*d*h)+(a*f*h)-(a*e*i))/(f*g-d*i))+P1\y
    EndIf 
    ProcedureReturn y
EndProcedure
Procedure HauteurPoint(x.l, Z.l, Hauteur.f)
    ;élève un point x,z de la matrice à la hauteur "Hauteur"
    If x > -1 And x <= Matrice\NbFacetteX And Z > -1 And Z <= Matrice\NbFacetteZ
        adresse = Matrice\PointIDMemory + 4
        adresse = adresse + (x + (Z * Matrice\NbPointX )) * 12
        PokeF(adresse, Hauteur)
        SetMeshData(0, 0, Matrice\PointIDMemory, Matrice\NbPointX * Matrice\NbPointZ)
        ProcedureReturn #True
    Else
        ProcedureReturn #False
    EndIf 
EndProcedure
Procedure HauteurFacette(x.l, Z.l, Hauteur.f)
    ;élève une facette de la matrice
    If x > 0 And x <= Matrice\NbFacetteX And Z > 0 And Z <= Matrice\NbFacetteZ
        adresse = Matrice\PointIDMemory + 4
        adresse + (x + (Z * Matrice\NbPointX )) * 12
        PokeF(adresse, Hauteur)
        adresse - 12
        PokeF(adresse, Hauteur)
        adresse  - (Matrice\NbFacetteX + 1) * 12
        PokeF(adresse, Hauteur)
        adresse + 12
        PokeF(adresse, Hauteur)
        SetMeshData(0, 0, Matrice\PointIDMemory, Matrice\NbPointX * Matrice\NbPointZ)
        ProcedureReturn #True
    Else
        ProcedureReturn #False
    EndIf 
EndProcedure
;-3D
Procedure.f WrapValue(Angle.f)
    Angle/360
    Angle-Int(Angle)
    If Angle<0
        ProcedureReturn (Angle+1)*360
    Else
        ProcedureReturn Angle*360
    EndIf
EndProcedure
Procedure.f NewXValue( x.f , Angle.f , NbUnite.f )
    ;à utiliser conjointement avec NewZvalue pour calculer une position de <NbUnite> dans la direction <angle>
    Valeur.f = x + Cos(Angle * 0.0174533) * NbUnite
    ProcedureReturn Valeur
EndProcedure
Procedure.f NewZValue( Z.f , Angle.f , NbUnite.f )
    ;à utiliser conjointement avec NewXvalue pour calculer une position de <NbUnite> dans la direction <angle>
    Valeur.f = Z - Sin(Angle * 0.0174533) * NbUnite
    ProcedureReturn Valeur
EndProcedure
Procedure.f EcartAngle( angle1.f , angle2.f )
    Delta.f=angle2-angle1
    If Delta>180
        ProcedureReturn Delta-360
    ElseIf Delta<=-180
        ProcedureReturn Delta+360
    Else
        ProcedureReturn Delta
    EndIf   
EndProcedure 
Procedure.f CurveAngle( Actuelle.f , Cible.f , P.f )
    ;Calcule un angle progressif allant de la valeur actuelle à la valeur cible
    Delta.f = EcartAngle( Actuelle , Cible )
    If P > 1000 : P = 1000 : EndIf
    Valeur.f = Actuelle + ( Delta * P / 1000 )
    ProcedureReturn WrapValue( Valeur )
EndProcedure
Procedure.f CurveValue( Actuelle.f , Cible.f , P.f )
    ;Calcule une valeur progressive allant de la valeur actuelle à la valeur cible
    Delta.f = Cible - Actuelle
    If P > 1000 : P = 1000 : EndIf
    Valeur.f = Actuelle + Round(( Delta * P / 1000 ),1)
    ProcedureReturn Valeur
EndProcedure
Procedure GestionCamera()
    PosXCamera.f = NewXValue(EntityX(0) , Joueur\AngleX + 180 , Camera\Distance)
    PosZCamera.f = NewZValue(EntityZ(0) , Joueur\AngleX + 180 , Camera\Distance)
    PosYCamera.f = EntityY(0) + Camera\Hauteur
    CameraLocate(0 , PosXCamera , PosYCamera , PosZCamera)
    CameraLookAt(0 , EntityX(0) , EntityY(0) + Camera\AngleY , EntityZ(0))     
EndProcedure
Procedure SuiviCube()
    ;Calcule les coordonnées des 4 coins du cube
    ;Les entitys permettent de vérifier que le calcul des coins est correct
    ;Distance du centre à chaque coin ( l'objet est carré )
    DistanceCoin.f=Sqr(32*32+32*32)/2
    ;Coin Avant Gauche
    AngleCoin.f=WrapValue(Joueur\AngleX+45)
    AvantGaucheX.f=NewXValue(EntityX(0),AngleCoin,DistanceCoin)
    AvantGaucheZ.f=NewZValue(EntityZ(0),AngleCoin,DistanceCoin)
    EntityLocate(2,AvantGaucheX,EntityY(0),AvantGaucheZ)
    ;Coin Avant Droit
    AngleCoin=WrapValue(Joueur\AngleX-45)
    AvantDroitX.f=NewXValue(EntityX(0),AngleCoin,DistanceCoin)
    AvantDroitZ.f=NewZValue(EntityZ(0),AngleCoin,DistanceCoin)
    EntityLocate(3,AvantDroitX,EntityY(0),AvantDroitZ)
    ;Coin Arrière Gauche
    AngleCoin=WrapValue(Joueur\AngleX+135)
    ArriereGaucheX.f=NewXValue(EntityX(0),AngleCoin,DistanceCoin)
    ArriereGaucheZ.f=NewZValue(EntityZ(0),AngleCoin,DistanceCoin)
    EntityLocate(4,ArriereGaucheX,EntityY(0),ArriereGaucheZ)
    ;Coin Arrière Droit
    AngleCoin=WrapValue(Joueur\AngleX-135)
    ArriereDroitX.f=NewXValue(EntityX(0),AngleCoin,DistanceCoin)
    ArriereDroitZ.f=NewZValue(EntityZ(0),AngleCoin,DistanceCoin)
    EntityLocate(5,ArriereDroitX,EntityY(0),ArriereDroitZ)
    
    ;Hauteur des coins
    AvantGaucheH.f=GetHeight(AvantGaucheX,AvantGaucheZ)
    AvantDroitH.f=GetHeight(AvantDroitX,AvantDroitZ)
    ArriereGaucheH.f=GetHeight(ArriereGaucheX,ArriereGaucheZ)
    ArriereDroitH.f=GetHeight(ArriereDroitX,ArriereDroitZ)
    ;écarts Largeur / Longueur devrait permettre de calculer l'angle d'inclinaison !
    Largeur=((AvantDroitH-AvantGaucheH)+(ArriereDroitH-ArriereGaucheH))/2.0
    Longueur=((ArriereGaucheH-AvantGaucheH)+(ArriereDroitH-AvantDroitH))/2.0
    
    ;Corrige la hauteur ( 3 c'est la moitié de l'épaisseur de l'objet)
    HauteurCentre.f=GetHeight(EntityX(0),EntityZ(0)) + 3
    MoyenneHauteur.f=(AvantGaucheH+AvantDroitH+ArriereGaucheH+ArriereDroitH)/4.0
    If MoyenneHauteur>HauteurCentre
        HauteurCentre=MoyenneHauteur
    EndIf
    EntityLocate(0,EntityX(0),HauteurCentre,EntityZ(0))
    ;Et maintenant , il ne manque plus que la rotation pour que l'objet suive les contours !!
    ; mais c'est là que ça coince !
    
    ;Extrait de l'exemple que j'ai utilisé ( ceux qui connaissent darkbasic l'auront reconnu )
    ; dans cet exemple , ne pas tenir compte de mx et mz c'est le décalage de la matrice , donc = 0
    ;Syntaxe Foot# => c'est un flottant.
    ;La partie intéressante c'est celle ci ( ne pas tenir compte de l'objet 1)
    ;Comment arriver à ce résultat ??
    ; 
    ;-
    ;/>>>  rotate object 2,WrapValue(length#/4.0),0,WrapValue(across#/4.0)  <<<<<
    ;-
    
    ;   rem Calculate four x+Z coordinates For each corner
    ;     foot#=110
    ;     ta#=WrapValue(a#-45)
    ;     frontleftx#=NewXValue(x#,ta#,foot#) : frontleftz#=NewZValue(Z#,ta#,foot#)
    ;     ta#=WrapValue(a#+45)
    ;     frontrightx#=NewXValue(x#,ta#,foot#) : frontrightz#=NewZValue(Z#,ta#,foot#)
    ;     ta#=WrapValue(a#+225)
    ;     backleftx#=NewXValue(x#,ta#,foot#) : backleftz#=NewZValue(Z#,ta#,foot#)
    ;     ta#=WrapValue(a#+135)
    ;     backrightx#=NewXValue(x#,ta#,foot#) : backrightz#=NewZValue(Z#,ta#,foot#)
    ;     
    ;     rem Calculate degree of tilting from corner heights
    ;     frontlefth#=get ground height(1,frontleftx#-mx#,frontleftz#-mz#)
    ;     frontrighth#=get ground height(1,frontrightx#-mx#,frontrightz#-mz#)
    ;     backlefth#=get ground height(1,backleftx#-mx#,backleftz#-mz#)
    ;     backrighth#=get ground height(1,backrightx#-mx#,backrightz#-mz#)
    ;     across#=((frontrighth#-frontlefth#)+(backrighth#-backlefth#))/2.0
    ;     length#=((backlefth#-frontlefth#)+(backrighth#-frontrighth#))/2.0
    ;     
    ;     rem Update tank model
    ;     h#=get ground height(1,x#-mx#,Z#-mz#)
    ;     trackh#=(frontlefth#+frontrighth#+backlefth#+backrighth#)/4.0
    ;     If trackh#>h# then h#=trackh#
    ;       position object 1,x#,h#,Z#
    ;       yrotate object 1,a#
    ;       rotate object 2,WrapValue(length#/4.0),0,WrapValue(across#/4.0)
EndProcedure
 

Procedure Open_Window_0()
    If OpenWindow(#Window_0, 293, 129, 249, 109,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "config")
        If CreateGadgetList(WindowID())
            StringGadget(#code, 40, 50, 170, 30, "", #PB_String_Password)
            TextGadget(#Text_0, 10, 20, 90, 20, "ENTREZ le Code")
        EndIf
    EndIf
EndProcedure




#Police=1
;*********** pour le screensaver
Param.s = Left(ProgramParameter(), 2)
If Param = "/p"
    End
EndIf

If Param = "/c" :;l'utilisateur veut paramettrer le screensaver !
    Open_Window_0():; jouvre ma fenetre ( cree a partir de visual designer)
    Repeat
        Texte$ = GetGadgetText(#code):;je recupere le contenu de ma boite de config
        If Texte$="dobro":;si le gars tappe le code "dobro"
            dobro=1:; c'est bon on affiche pas la surimpression
            code$="ok":;on se prepare a ecrire le mot "ok" dans un fichier
            Resultat = OpenFile(1, "matrix.ini") :;on cree le fichier
            WriteStringN(code$) :; on ecrit dedans "ok"
            CloseFile(1)
        Else
            dobro=0:; la le mec a pas rentré le bon code
        EndIf
    Until WindowEvent() = #PB_Event_CloseWindow :; le gars a fermé la boite de config
EndIf

GetCursorPos_(SourisOrigine.POINT)
ShowCursor_(0)
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN)
EcranY = GetSystemMetrics_(#SM_CYSCREEN)

If ReadFile(1, "matrix.ini"):;en temps normal on commence par regarder si le screen saver est enregistré
    code$ = ReadString() :; on lit le contenu de "matrix.ini"
    CloseFile(1)
EndIf
 
If code$="ok":; bon le gars est enregistré
    dobro=1:; ce flag va retirer la surimpression
Else
    dobro=0:; il n'est pas enregistrer donc on affiche la surimpression
EndIf
;************ c'est tout pour le parametrage du screen saver



GetCursorPos_(SourisOrigine.POINT)
ShowCursor_(0)
; ***********************************
Resultat = InitSprite()
Resultat = InitSprite3D() 
FontID = LoadFont(#Police, "system", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN)
EcranY = GetSystemMetrics_(#SM_CYSCREEN)
;NbSprite = EcranX / 40 * 3
NbSprite =12
OpenWindow(1, 0, 0, EcranX, EcranY, #PB_Window_BorderLess | #PB_Window_Invisible, "Dos 3.10")
SetWindowPos_(WindowID(), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) ; fenêtre toujours au premier plan
OpenWindowedScreen(WindowID(), 0, 0, EcranX, EcranY, 1, 0, 0)

; faire ici les initialisations du pre affichage
;{- Initialisation
If InitEngine3D() = 0
    MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
    End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
    MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
    End
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "Démo PlateForme" ) = 0
    MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
    End
EndIf
;}
;{- Dessine la matrice
Matrice()
For a=1 To Matrice\NbFacetteX
    HauteurFacette(a,1,40)
    HauteurFacette(a,Matrice\NbFacetteZ,40)
Next a 
For b=1 To Matrice\NbFacetteZ
    HauteurFacette(1,b,40)
    HauteurFacette(Matrice\NbFacetteX,b,40)
Next b
For b=Matrice\NbFacetteZ/2 - 11 To Matrice\NbFacetteZ/2 + 11
    For a=Matrice\NbFacetteX/2 - 11 To Matrice\NbFacetteX/2 + 11
        Cond1 = a>=Matrice\NbFacetteX/2 - 8 And a<=Matrice\NbFacetteX/2 - 2
        Cond2 = a>=Matrice\NbFacetteX/2 + 2 And a<=Matrice\NbFacetteX/2 + 8
        Cond3 = b>=Matrice\NbFacetteZ/2 - 8 And b<=Matrice\NbFacetteZ/2 - 2
        cond4 = b>=Matrice\NbFacetteZ/2 + 2 And b<=Matrice\NbFacetteZ/2 + 8
        If (Cond1 Or Cond2) And (Cond3 Or cond4)
            HauteurFacette(a,b,40)
        Else
            HauteurFacette(a,b,80)
        EndIf 
    Next a
Next b
NormalesMatrice()
;}
;{- Mesh
;/Mesh
CreateMesh(#MeshMatrice)
SetMeshData(#MeshMatrice, 0, Matrice\PointIDMemory   , Matrice\NbPointX * Matrice\NbPointZ)
SetMeshData(#MeshMatrice, 1, Matrice\TriangleIDMemory, Matrice\NbFacetteX * Matrice\NbFacetteZ * Matrice\Nbtriangle)
SetMeshData(#MeshMatrice, 2, Matrice\TextureIDMemory , Matrice\NbPointX * Matrice\NbPointZ) 
SetMeshData(#MeshMatrice, 3, Matrice\NormaleIDMemory , Matrice\NbPointX * Matrice\NbPointZ) 
CreateMesh(#MeshCube) ;Cube
SetMeshData(#MeshCube,#PB_Mesh_Vertices     , ?CubePoints       , 16)
SetMeshData(#MeshCube,#PB_Mesh_Triangles    , ?CubeTriangles    , 12)
SetMeshData(#MeshCube,#PB_Mesh_UVCoordinates, ?CubeTextures     , 16)
SetMeshData(#MeshCube,#PB_Mesh_Normals      , ?CubeNormales     , 16)
;}
;{- Textures
CreateTexture(1,128, 128)
StartDrawing(TextureOutput(1))
Box(0,0,TextureWidth(1),TextureHeight(1),RGB(200,100,220))
StopDrawing() 
CreateTexture(2,128, 128)
StartDrawing(TextureOutput(2))
Box(0,0,TextureWidth(2),TextureHeight(2),RGB(100,200,130))
StopDrawing()
CreateTexture(3,128, 128)
StartDrawing(TextureOutput(3))
Box(0,0,TextureWidth(2),TextureHeight(2),RGB(255,100,100))
StopDrawing() 
CreateTexture(0, Matrice\TailleTextureX, Matrice\TailleTextureZ)
StartDrawing(TextureOutput(0))
Box(0,0,TextureWidth(0)/2,TextureHeight(0)/2,RGB(0,200,0))
Box(TextureWidth(0)/2,0,TextureWidth(0)/2,TextureHeight(0)/2,RGB(0,0,200))
Box(0,TextureHeight(0)/2,TextureWidth(0)/2,TextureHeight(0)/2,RGB(200,0,0))
Box(TextureWidth(0)/2,TextureHeight(0)/2,TextureWidth(0)/2,TextureHeight(0)/2,RGB(200,200,0))
While bb.f<=TextureHeight(0)
    While aa.f<=TextureWidth(0)
        LineXY(aa,0,aa,TextureHeight(0),RGB(255,255,255))
        LineXY(0,bb,TextureWidth(0),bb,RGB(255,255,255))
        aa + Matrice\TailleTextureX / Matrice\NbPointX
    Wend
    bb + Matrice\TailleTextureZ / Matrice\NbPointZ
    aa = 0
Wend
StopDrawing() 
;}
;{- Material
For a = 0 To 3
    CreateMaterial(a, TextureID( a))
Next a
MaterialShadingMode(0, #PB_Material_Gouraud)
MaterialAmbientColor(0, RGB(225,125,125))
MaterialDiffuseColor(0, RGB(255,255,255))
MaterialSpecularColor(0,RGB(255,0,0))
;}
;{- Entity
;Joueur
CreateEntity(0,MeshID(#MeshCube),MaterialID(1))
ScaleEntity(0,32,6,32)
EntityLocate(0,500,3,500)
Joueur\AngleX = 0
RotateEntity(0,Joueur\AngleX,0,0)
;Sol
CreateEntity(1,MeshID(#MeshMatrice),MaterialID(0))
EntityLocate(1,Matrice\Largeur/2,0,Matrice\Profondeur/2)
;visualise les coins du cube
tr=6
CreateEntity(2,MeshID(#MeshCube),MaterialID(2))
ScaleEntity(2,tr,tr,tr)
CreateEntity(3,MeshID(#MeshCube),MaterialID(2))
ScaleEntity(3,tr,tr,tr)
CreateEntity(4,MeshID(#MeshCube),MaterialID(3))
ScaleEntity(4,tr,tr,tr)
CreateEntity(5,MeshID(#MeshCube),MaterialID(3))
ScaleEntity(5,tr,tr,tr)
;}
;{- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraLocate(0,0,200,0)
;}
;{- Light
AmbientColor(RGB(160,160,160))
CreateLight(0,RGB(155,155,155))
LightLocate(0 , Matrice\Largeur,600,Matrice\Profondeur/2)
;}   
;{- Datas Cube
DataSection
;/Cube
CubePoints:
Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5

Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5
CubeNormales:
Data.f -5,0,-5
Data.f -5,0,5
Data.f 5,0,5
Data.f 5,0,-5
Data.f -5,0,-5
Data.f -5,0,5
Data.f 5,0,5
Data.f 5,0,-5

Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0

CubeTriangles:
Data.w 0,4,7
Data.w 0,7,3
Data.w 1,5,4
Data.w 1,4,0
Data.w 2,6,5
Data.w 2,5,1
Data.w 3,7,6
Data.w 3,6,2
Data.w 9,8,11
Data.w 9,11,10
Data.w 12,13,14
Data.w 12,14,15
CubeTextures:
;original
Data.f 0,1
Data.f 1,1
Data.f 0,1
Data.f 1,1

Data.f 0,0
Data.f 1,0
Data.f 0,0
Data.f 1,0

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1
EndDataSection
;}


Speed=6




Repeat :;boucle principale
    
    ;If ExamineKeyboard()
        ;If KeyboardPushed(#PB_Key_Left)
          ;  Joueur\AngleX = WrapValue( Joueur\AngleX + 1 )
         ;   RotateEntity(0,1 , 0, 0 )
       ; ElseIf KeyboardPushed(#PB_Key_Right)
       ;     Joueur\AngleX = WrapValue( Joueur\AngleX - 1 )
       ;     RotateEntity(0, -1 , 0, 0 )
       ; EndIf
        ;If KeyboardPushed(#PB_Key_Up)
        Pas = Speed
        ;ElseIf KeyboardPushed(#PB_Key_Down)
        ;Pas = -Speed
        ;Else
        ;   Pas=0
        ;EndIf
        ;If KeyboardPushed(#PB_Key_Pad4)
       ;     Joueur\AngleY + 0.1 : RotateEntity(0,0,0.1,0)
       ; EndIf
       ; If KeyboardPushed(#PB_Key_Pad1)
       ;     Joueur\AngleY - 0.1 : RotateEntity(0,0,-0.1,0)
      ;  EndIf 
      ;  If KeyboardPushed(#PB_Key_Pad5)
      ;      Joueur\AngleZ + 0.1 : RotateEntity(0,0,0,0.1)
      ;  EndIf
       ; If KeyboardPushed(#PB_Key_Pad2)
      ;      Joueur\AngleZ - 0.1 : RotateEntity(0,0,0,-0.1)
      ;  EndIf
       ; If KeyboardReleased(#PB_Key_F4) : AfficheAide = 1 - AfficheAide : EndIf
    ;EndIf 
    dx.f=Cos( Joueur\AngleX * 0.0174533) * Pas
    dz.f=-Sin( Joueur\AngleX * 0.0174533) * Pas
    ;****1
    If EntityX(0)+dx>(Matrice\Largeur)-150
        dob1+1
        If dob<270
            Joueur\AngleX = WrapValue(Joueur\AngleX-1)
            RotateEntity(0, -1 , 0, 0 )
        EndIf
        If dob1>270
            dob1=0
        EndIf
        dx=(Matrice\Largeur)-150
    EndIf
    ;***3
    If EntityX(0)+dx<(150)
        dob3+1
        If dob3<90
            Joueur\AngleX = WrapValue( Joueur\AngleX-1)
            RotateEntity(0, -1 , 0, 0 )
        EndIf
        dx=(Matrice\Largeur)-Largeur+150
        If dob3>90
            dob3=0
        EndIf
        
    EndIf
    ;**4
    If EntityZ(0)+dz<(150)
        dob4+1
        If dob4<90
            Joueur\AngleX = WrapValue(Joueur\AngleX-1)
            RotateEntity(0, -1 , 0, 0 )
        EndIf
        If dob4>90
            dob4=0
        EndIf
        dz=(Matrice\Profondeur)-Profondeur+150
    EndIf
    
    
    ;**2
    
    If EntityZ(0)+dz>(Matrice\Profondeur)-150
        dob2+1
        If dob2<180
            Joueur\AngleX = WrapValue(Joueur\AngleX-1)
            RotateEntity(0, -1 , 0, 0 )
        EndIf
        dz=(Matrice\Profondeur)+150
        If dob2>180
            dob2=0
        EndIf
    EndIf
    
    
    
    
    
    
    
    If EntityX(0) + dx > 0 And EntityX(0) + dx < Matrice\Largeur
        If EntityZ(0) + dz > 0 And EntityZ(0) + dz < Matrice\Profondeur
            MoveEntity( 0 , dx , 0, dz )
        EndIf 
    EndIf
    SuiviCube()
    ;h.f=GetHeight(EntityX(0),EntityZ(0))+3
    ;EntityLocate(0,EntityX(0),h,EntityZ(0))
    GestionCamera()
    RenderWorld()
    ;StartDrawing(ScreenOutput())
    ;DrawingMode(1)
    ;FrontColor(255,255,255)
    ;Locate(10,10) 
    ;DrawText("AngleX = "+StrF(Joueur\AngleX,2))
    ;Locate(10,30) 
    ;DrawText("AngleY = "+StrF(Joueur\AngleY,2))
    ;Locate(10,50) 
    ;DrawText("AngleZ = "+StrF(Joueur\AngleZ,2))
    ;Locate(10,70) 
    ;DrawText("Largeur = "+StrF(Largeur,2))
    ;Locate(10,90) 
    ;DrawText("Longueur = "+StrF(Longueur,2))
    ;Locate(10,110) 
    ;DrawText("dx = "+StrF(EntityX(0)+dx,2))
    ;Locate(10,130) 
    ;DrawText("dz = "+StrF(EntityZ(0)+dz,2))
    
    
    
    
    
    FlipBuffers():;affichage
    ClearScreen(0,0,0):; eface l'ecran pour image suivante
    
    GetCursorPos_(Souris.POINT):; test le curseur de la souris
Until WindowEvent() = #PB_Event_CloseWindow Or Souris\x <> SourisOrigine\x Or Souris\y <> SourisOrigine\y
ShowCursor_(1)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

si ça marche ,faut juste ne pas appeler plusieurs fois initSprite() , et puis l'appeler après initengine3D() et aussi supprimer openscreen() vu que tu fais une fenêtre . et ensuite c'est bon.

J'ai vu aussi que tu avais ajouté ça

Code : Tout sélectionner

  ;ClearScreen(0,0,0):; eface l'ecran pour image suivante 
ça ne sert à rien avec la 3D , puisque tout est effacé par l'affichage 3D.
Pour afficher un truc à l'écran , il faut le faire par dessus la 3D , donc après le renderworld.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Tiens voila un code qui fonctionne ( enfin y'a encore du ménage à faire )
J'ai conservé les flèches gauche et droite pour diriger le bolide ,c'est quand même plus marrant un screensaver interactif :)
http://perso.wanadoo.fr/comtois/sources/screensaver.pb
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ça tombe bien j'etait encore en train de ma prendre le choux dessus !!
et j'en ai marre !!! :D
Répondre