; English forum: http://purebasic.myforums.net/viewtopic.php?t=8367&highlight= ; Author: Comtois ; Date: 16. November 2003 ;******************************************* ;** Comtois ** 15/11/03 ** Matrice / Vagues ** ;******************************************* ;-Initialisation #ScreenWidth = 800 : #ScreenHeight = 600 : #ScreenDepth = 32 If InitEngine3D()=0 MessageRequester("Erreur", "Impossible d'initialiser la 3D , Vérifiez la présence de la DLL Engine3D.dll", 0) End ElseIf InitSprite() = 0 Or InitKeyboard() = 0 MessageRequester("Erreur", "Impossible d'initialiser DirectX 7 Ou plus", 0) End ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "DemoMatrice" ) = 0 MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 ) End EndIf ;-Variables Globales Global AngleVague.f ,vitesse.f ,decaleX.f ,decaleZ.f ,hauteur.f AngleVague = Random(360) vitesse = 3.0 decaleX = 23 decaleZ = 0 hauteur = 4 ;- Declaration des procédures Declare Matrice(NbpointsX.l,NbpointsZ.l) ;-Constantes Global addpoint.l, addtriangle.l, addtexture.l #NbX= 30 ; nombre de facettes #NbZ= 30 ; nombre de facettes ;-Mémoires Mesh addpoint = AllocateMemory(12 * (#NbX + 1 )* (#NbZ + 1 )) addtriangle = AllocateMemory(12 * #NbX * #NbZ * 4) addtexture = AllocateMemory(12 * (#NbX + 1 )* (#NbZ + 1 )) Matrice(#NbX , #NbZ) ;-Mesh CreateMesh(0) SetMeshData(0, 0, addpoint , (#NbX + 1 )* (#NbZ + 1 )) SetMeshData(0, 1, addtriangle , (#NbX ) * (#NbZ ) * 4) SetMeshData(0, 2, addtexture , (#NbX + 1 )* (#NbZ + 1 )) ;-Texture UsePNGImageDecoder() ;LoadTexture(0,"purebasiclogoNew.png") ; <<< pourquoi ça plante quand je mets juste ça ? LoadImage(0,"..\gfx\purebasiclogoNew.png") ; alors que l'image se charge ? Je verrai ça plus tard CreateTexture(0,256,256) StartDrawing(TextureOutput(0)) DrawImage(UseImage(0),0,0) DrawingMode(4) Box(1,1,254,254,RGB(255,255,255)) StopDrawing() ;- MAterial CreateMaterial(0,TextureID(0)) MaterialFilteringMode(0 , #PB_Material_Trilinear ) ;-Entity CreateEntity(0, MeshID(0), MaterialID(0)) RotateEntity(0,0,45,0) ScaleEntity(0, 10, 10, 10) ;-Camera CreateCamera(0, 0, 0, 100, 100) CameraLocate(0,0,350,350) CameraLookAt(0,0,0,0) ;-Procédures Procedure Matrice(FX.l,FZ.l) adresse=addpoint For b=0 To FZ For a=0 To FX PokeF(adresse, a - FX/2) : PokeF(adresse + 4, 0 ) : PokeF(adresse + 8, b - FZ/2) ;PokeF(adresse, a ) : PokeF(adresse + 4, 0 ) : PokeF(adresse + 8, b ) adresse + 12 Next a Next b adresse=addtriangle Nb = FX + 1 For b=0 To FZ - 1 For a=0 To FX - 1 P1 = a + (b * Nb) P2 = a + 1 + (b * Nb) P3 = a + ((b + 1) * Nb) P4 = a + 1 + ((b + 1) * Nb) PokeW(adresse , P3) : PokeW(adresse + 2, P2) : PokeW(adresse + 4, P1) PokeW(adresse + 6, P2) : PokeW(adresse + 8, P3) : PokeW(adresse + 10, P4) PokeW(adresse + 12, P1) : PokeW(adresse + 14, P2) : PokeW(adresse + 16, P3) PokeW(adresse + 18, P4) : PokeW(adresse + 20, P3) : PokeW(adresse + 22, P2) adresse + 24 Next a Next b adresse=addtexture For b=0 To FZ For a=0 To FX px.f = a/FX pz.f = b/FZ PokeF(adresse, px) : PokeF(adresse + 4, pz) adresse + 8 Next a Next b EndProcedure Procedure.f wrapvalue( angle.f ) ;Permet de toujours avoir un angle compris entre 0° et 360° While angle < 0 angle + 360 Wend While angle - 360 >= 0 angle - 360 Wend ProcedureReturn angle EndProcedure Procedure.f Cosd( angle.f ) ;calcule le cos d'un angle en degré a.f = angle * 0.0174533 ProcedureReturn Cos( a ) EndProcedure Procedure.f Sind( angle.f ) ;calcule le sin d'un angle en degré a.f = angle * 0.0174533 ProcedureReturn Sin( a ) EndProcedure Procedure vagues() ; Modification sur l'axe des Y adresse = addpoint + 4 For z = 0 To #NbZ For x = 0 To #NbX Sommet.f = Sind(AngleVague + (x * decaleX) + (z * decaleZ)) * hauteur PokeF(adresse, Sommet) adresse + 12 Next x Next z SetMeshData(0, 0, addpoint , (#NbX + 1 )* (#NbZ + 1 )) EndProcedure Procedure AffAide() StartDrawing(ScreenOutput()) DrawingMode(1) FrontColor(255,255,255) Locate(0,0) DrawText("[F1] / [F2] => Change Mode affichage") Locate(0,20) DrawText("[PageUp] / [PageDown] => Hauteur : " + StrF(hauteur)) Locate(0,40) DrawText("[Flèche Haut] / [Flèche bas] => DecaleZ : " + Str(decaleZ)) Locate(0,60) DrawText("[Flèche Gauche] / [Flèche droite] => DecaleX : " + Str(decaleX)) StopDrawing() EndProcedure ;-Boucle principale Repeat ClearScreen(0, 0, 0) ExamineKeyboard() AffAide() If KeyboardReleased(#PB_Key_F1) :ClearScreen(0, 0, 0): CameraRenderMode(0, #PB_Camera_Wireframe) : EndIf If KeyboardReleased(#PB_Key_F2) :ClearScreen(0, 0, 0): CameraRenderMode(0, #PB_Camera_Textured) : EndIf If KeyboardReleased(#PB_Key_PageUp) : hauteur + 0.5 : EndIf If KeyboardReleased(#PB_Key_PageDown) : hauteur - 0.5 : EndIf If KeyboardReleased(#PB_Key_Up) : decaleZ + 1 : EndIf If KeyboardReleased(#PB_Key_Down) : decaleZ - 1 : EndIf If KeyboardReleased(#PB_Key_Left) : decaleX - 1 : EndIf If KeyboardReleased(#PB_Key_Right) : decaleX + 1 : EndIf AngleVague = wrapvalue(AngleVague + vitesse) vagues() RotateEntity(0,0,0,0.1) RenderWorld() FlipBuffers() Until KeyboardPushed(#PB_Key_Escape) ; ExecutableFormat=Windows ; FirstLine=1 ; DisableDebugger ; EOF