Question bête
Publié : jeu. 03/juin/2004 15:02
ya combien de port j'crois que c de 1 à 65000
je suis pas alors je demande thx
je suis pas alors je demande thx
ça commence pas à 1mais elles peuvent aller en réalité de 0 à 65000).
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
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)
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)
Code : Tout sélectionner
;ClearScreen(0,0,0):; eface l'ecran pour image suivante