Re: Labyrinthe 3D - début d'un nouveau projet
Publié : dim. 13/mars/2011 12:51
THE commande pour du Hack n Slash 

Forums PureBasic - Français
https://www.purebasic.fr/french/
La misère ^^j'ai lamentablement égaré ma clé USBavec la plupart de mes dernières sources...
Code : Tout sélectionner
; Xdji, Aout 2011
; Pb 4.6 beta 4
; Special Greatings to Comtois & G-Rom for their Work
#CameraSpeed =0.05
#Hauteur = 1
#PB_Engine_Relative_Rotation=16
#PB_Engine_Euler_Rotation=64
Define.f x, y, z, u, v
Define.l Co
Define.w t1, t2, t3
InitEngine3D()
InitSprite()
InitSprite3D()
InitKeyboard()
InitMouse()
ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "char")
;- Génération de la police de caractère
LoadImage(0,"Data/police.bmp")
For j =0 To 46:GrabImage(0,1,j*6,0,6,7)
CreateSprite(j,6,7,#PB_Sprite_Texture):TransparentSpriteColor(j, 0)
StartDrawing(SpriteOutput(j)):DrawImage(ImageID(1),0,0): StopDrawing()
CreateSprite3D(j, j):Next
AntialiasingMode(#PB_AntialiasingMode_x6)
;WorldDebug(#PB_World_DebugEntity)
Add3DArchive("/Data/", #PB_3DArchive_FileSystem)
Add3DArchive("/", #PB_3DArchive_FileSystem)
;---- Matière
LoadTexture(0,"Sol00.jpg")
LoadTexture(1,"Colonne.jpg")
CreateMaterial(0, TextureID(0))
CreateMaterial(1, TextureID(1))
;---- Mesh
CreateMesh(0)
Restore Sommet_carre
For i=0 To 3
Read.f x : Read.f y : Read.f z
Read.l Co
Read.f u : Read.f v
AddMeshVertex(x, y, z)
MeshVertexColor(Co)
MeshVertexTextureCoordinate(u, v)
Next i
For i=0 To 1
Read.w t1 : Read.w t2 : Read.w t3
AddMeshFace(t1, t2, t3)
Next i
FinishMesh()
;-- Creation d'une face rectangulaire
CreateMesh(1)
Restore Sommet_rectangle
For i=0 To 3
Read.f x : Read.f y : Read.f z
Read.l Co
Read.f u : Read.f v
AddMeshVertex(x, y, z)
MeshVertexColor(Co)
MeshVertexTextureCoordinate(u, v)
Next i
For i=0 To 1
Read.w t1 : Read.w t2 : Read.w t3
AddMeshFace(t1, t2, t3)
Next i
FinishMesh()
;-- Creation d'une facette de colonne
CreateMesh(2)
Restore Sommet_colonne
For i=0 To 3
Read.f x : Read.f y : Read.f z
Read.l Co
Read.f u : Read.f v
AddMeshVertex(x, y, z)
MeshVertexColor(Co)
MeshVertexTextureCoordinate(u, v)
Next i
For i=0 To 1
Read.w t1 : Read.w t2 : Read.w t3
AddMeshFace(t1, t2, t3)
Next i
FinishMesh()
;---- Entity
;-- creation de 6 entity pour chacune des 6 faces d'un cube
CreateEntity(0,MeshID(0), MaterialID(0)) ; devant
CreateEntity(1,MeshID(0), MaterialID(0)) ; bas
CreateEntity(2,MeshID(0), MaterialID(0)) ; droite
CreateEntity(3,MeshID(0), MaterialID(0)) ; haut
CreateEntity(4,MeshID(0), MaterialID(0)) ; gauche
CreateEntity(5,MeshID(0), MaterialID(0)) ; derriere
;-- positionne chaque entity pour former les 6 faces du cube
RotateEntity(0,0,0,-90) ; devant
RotateEntity(1,90,0,0) ; face du bas
RotateEntity(2,0,90,0) ; coté à droite
RotateEntity(3,270,0,0) ; haut
RotateEntity(4,0,270,0) ; coté à gauche
RotateEntity(5,180,0,-90) ; face arrière
;-- creation de 6 entity pour chacune des 6 faces d'un pavé
CreateEntity(6,MeshID(1), MaterialID(0),-5,0,0) ; devant
CreateEntity(7,MeshID(0), MaterialID(0),-5,0,0) ; bas
CreateEntity(8,MeshID(1), MaterialID(0),-5,0,0) ; droite
CreateEntity(9,MeshID(0), MaterialID(0),-5,0,0) ; haut
CreateEntity(10,MeshID(1), MaterialID(0),-5,0,0) ; gauche
CreateEntity(11,MeshID(1), MaterialID(0),-5,0,0) ; derriere
;-- positionne chaque entity pour former les 6 faces du pavé
RotateEntity(6,0,0,0) ; devant
RotateEntity(7,90,0,0) ; face du bas
RotateEntity(8,0,90,0) ; coté à droite
RotateEntity(9,90,0,0) ; haut
RotateEntity(10,0,270,0) ; coté à gauche
RotateEntity(11,180,0,180) ; face arrière
;-- creation d'une colonne
x.f=0
y.f=0
angle=0
rayon=1
For j = 1 To 72
x=rayon*Cos(Radian(Angle))
y=rayon*Sin(Radian(Angle))
CreateEntity(12+j,MeshID(2), MaterialID(1),10+x,0,10+y) ; derriere
RotateEntity(12+j,0,90-angle,0) ; devant
angle=angle+5
Next
; Create Static geometry
StaticGeometry = CreateStaticGeometry(#PB_Any, 100000, 100000, 100000, #False)
;-- Création d'un sol
For j = 1 To 200
For i = 1 To 200
AddStaticGeometryEntity(StaticGeometry, 3, j, 0, i)
Next i
Next j
;-- Création d'un plafond
For j = 1 To 200
For i = 1 To 200
AddStaticGeometryEntity(StaticGeometry, 1, j, 5, i)
Next i
Next j
For j = 1 To 100
x=Random(200)
y=Random(5)+1
z=Random(200)
AddStaticGeometryEntity(StaticGeometry, 0, x, y, z)
AddStaticGeometryEntity(StaticGeometry, 1, x, y, z)
AddStaticGeometryEntity(StaticGeometry, 2, x, y, z)
AddStaticGeometryEntity(StaticGeometry, 3, x, y, z)
AddStaticGeometryEntity(StaticGeometry, 4, x, y, z)
AddStaticGeometryEntity(StaticGeometry, 5, x, y, z)
Next
For i = 1 To 20
x=Random(200)
z=Random(200)
angle=0
For j = 1 To 72
AddStaticGeometryEntity(StaticGeometry, 12+j, x+(rayon*Cos(Radian(angle))), 0, z+(rayon*Sin(Radian(angle))))
angle=angle+5
Next
Next
; Build the Static geometry
BuildStaticGeometry(StaticGeometry)
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,-10,0,0)
CameraLookAt(0,0, 0, 0)
CameraFOV(0,45)
Deltaz.i=#Hauteur*2
;-
;-- Gestion des textes
;Chaine qui indique l'ordre des lettres contenues dans l'image
Global Strig$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789-"
; Déclaration de la procédre qui affiche les textes
; (Texte à afficher, position Y, taille, n° de sprite, max aléatoire pour faire trembler la lettre)
Declare AffT(TextMenu01$,y.i,sz.i,sprite.i,rnd.i)
; le texte est automatiquement centré
; Text$ = TExt à afficher
; y =position y du text
; sz =Taille de la police (sert pour le zomm des lettres et de l'espacement)
; sp =Pointe sur le sprite A de la bonne police
; rnd =valeur de tremblement des lettres
Procedure AffT(Text$,y.i,sz.i,sp.i,rnd.i)
sx=0:For i=1 To Len(Text$):For j=1 To Len(Strig$)
If Mid(Text$,i,1)=Mid(Strig$,j,1):a=sz+2
DisplaySprite3D(sp+j-1,sx+Random(rnd)+400-(Len(Text$)*a)/2,y+Random(rnd),200)
sx=sx+sz+2:j=Len(Strig$):EndIf :Next:Next
EndProcedure
;-
;- BIG LOOP
Repeat
ExamineMouse()
ExamineKeyboard()
ClearScreen(0)
;--- Gère la camera Cavier et souris
If KeyboardPushed(#PB_Key_Up)
KeyY.f = -#CameraSpeed
ElseIf KeyboardPushed(#PB_Key_Down)
KeyY.f = #CameraSpeed
Else
KeyY = 0
EndIf
If KeyboardPushed(#PB_Key_Right)
BougeX.f = -#CameraSpeed/2
ElseIf KeyboardPushed(#PB_Key_Left)
BougeX = #CameraSpeed/2
Else
BougeX = 0
EndIf
Yaw.f = MouseDeltaX() / 10
Pitch.f = MouseDeltaY() / 10
RotateCamera(0, -Pitch, Yaw, 0, #PB_Engine_Relative_Rotation | #PB_Engine_Euler_Rotation)
MoveCamera (0, KeyX-BougeX, -CameraY(0)+Deltaz, KeyY)
RenderWorld()
Start3D()
AffT(Str(CountRenderedTriangles())+" TRIANGLES",0,6,0,0)
AffT(Str(Engine3DFrameRate(#PB_Engine3D_Current))+" FPS",10,6,0,0)
Stop3D()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
End
;{ Définition des surfaces composées de 2 triangles chacune
DataSection
Sommet_carre:
Data.f -0.5,0.5,0.5
Data.l $00FF00
Data.f 0,0
Data.f 0.5,0.5,0.5
Data.l $00FF00
Data.f 0,1
Data.f 0.5,-0.5,0.5
Data.l $00FF00
Data.f 1,1
Data.f -0.5,-0.5,0.5
Data.l $00FF00
Data.f 1,0
;Face
Data.w 2,1,0
Data.w 0,3,2
Sommet_rectangle:
Data.f -0.5,1,0.5
Data.l $00FF00
Data.f 0,0
Data.f 0.5,1,0.5
Data.l $00FF00
Data.f 0,1
Data.f 0.5,-1,0.5
Data.l $00FF00
Data.f 1,1
Data.f -0.5,-1,0.5
Data.l $00FF00
Data.f 1,0
;Face
Data.w 2,1,0
Data.w 0,3,2
Sommet_colonne:
Data.f -0.1,4.5,0.1
Data.l $00FF00
Data.f 0,0
Data.f 0.1,4.5,0.1
Data.l $00FF00
Data.f 0,1
Data.f 0.1,0.5,0.1
Data.l $00FF00
Data.f 1,1
Data.f -0.1,0.5,0.1
Data.l $00FF00
Data.f 1,0
;Face
Data.w 2,1,0
Data.w 0,3,2
EndDataSection
;}