Re: Les polygones
Publié : lun. 23/nov./2020 18:25
@SPH : Tu comptes en faire quoi de tes polygones ?
Code : Tout sélectionner
EnableExplicit
; Contexte graphique et brosse
Global HDC, Brush
; Points x, y du polygone
Global Dim Points.l(8)
; Premier point
Points(0)=100 ;X
Points(1)=100 ;y
; Second point
Points(2)=280 ;X
Points(3)=150 ;y
; Troisiéme point
Points(4)=400 ;X
Points(5)=400 ;y
; Quatriéme point
Points(6)=100 ;X
Points(7)=300 ;y
; Fenetre et ecran graphique 2D
InitSprite()
OpenWindow(0, 0, 0, 800, 600, "Dessin d'un polygone",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)
ClearScreen(RGB(255, 255, 255))
; Récupération du contexte graphique
HDC = StartDrawing(ScreenOutput())
; Création du brosse de couleur
Brush = CreateSolidBrush_(RGB(154, 205, 50))
; Sélection du contexte graphique et de la brosse que nous allons utiliser
SelectObject_(HDC, Brush)
; Dessin du polygone de quatre points
Polygon_(HDC, @Points(), 4)
StopDrawing()
; Loop : N'importe quelle touche pour quitter
Repeat : Until WaitWindowEvent() = #WM_CHAR
Code : Tout sélectionner
;code Dobro
; mis en Purebasic 4.20
#dobro=1
#Police=1
#Sprite=1
; #PI=3.1415926
Declare polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,r.b,coul_remp.l)
Declare remplis(*hdc,x,y,couleur_remplissage)
; ***********************************
resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello",#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
WindowID = WindowID(1)
ecran= OpenWindowedScreen(WindowID,0,0,800, 600, 1, 0,0)
resultat = InitMouse()
Repeat
ExamineMouse()
Event=WindowEvent()
If MouseButton(2)
End
EndIf
x.l=400 ;location x
y.l=300 ; location y
taille.l=300
angle.l=3 ; pour un triangle 4 pour un carre , 8 pour un octogone ect ...
rotation.f=180
For tp=0 To 360
; Delay (200)
r=1 ; remplis ou pas !!
rotation.f=tp
color.l=RGB($FF,$FF,$FF) ; couleur du tour$
coul_remp.l=RGB($F9,$FE,$8B) ; couleur du remplissage !
c=c+1
polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,r,coul_remp.l)
If c=50
angle.l=angle+1
If angle>10: angle=3:EndIf
c=0
EndIf
FlipBuffers():; affiche l'ecran
ClearScreen(RGB(0,0,0))
ExamineMouse()
Event=WindowEvent()
If MouseButton(2)
End
EndIf
Next tp
Until Event=#PB_Event_CloseWindow
Procedure polygone(x.l,y.l,taille.l,angle.l,rotation.f,color.l,r.b,coul_remp.l)
;by Dobro
rotation.f= rotation.f*0.01745329
Alpha.f=2*(#PI/angle)
For t.l=1 To angle
d1.f=(t-1)*Alpha+rotation.f
d3.f=t*Alpha+rotation.f
*dc=StartDrawing(ScreenOutput() )
DrawingMode(4)
LineXY(x+taille*Sin(d1),y+taille*Cos(d1),x+taille*Sin(d3),y+taille*Cos(d3),color.l); polygone vide
StopDrawing()
Next t
If r=1
*dc=StartDrawing(ScreenOutput() )
DrawingMode(4)
remplis(*dc,x,y,coul_remp.l )
StopDrawing()
EndIf
EndProcedure
Procedure remplis(*hdc,x,y,couleur_remplissage)
;by Dobro
pinceau=CreateSolidBrush_(couleur_remplissage)
SelectObject_(*hdc,pinceau)
ExtFloodFill_(*hdc,x,y,GetPixel_(*hdc,x,y),#FLOODFILLSURFACE)
DeleteObject_(pinceau)
ReleaseDC_(WindowID(1),*hdc)
EndProcedure
Code : Tout sélectionner
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
Define.f KeyX, KeyY, MouseX, MouseY
If InitEngine3D()
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(1, 0, 0, 200, 100, "", #PB_Window_SystemMenu)
If Screen3DRequester()
CreateMaterial(0, LoadTexture(0, "White.jpg"))
SetMaterialColor(0, #PB_Material_AmbientColor, -1)
tt=0
For y=-10000 To 10000 Step 250
For x=-15000 To 15000 Step 250
Couleur=Random($ffffff,$7f7f7f)
CreateMesh(tt)
MeshVertexPosition(-100, 100, z)
MeshVertexColor(Couleur)
MeshVertexPosition(100, 100, z)
MeshVertexColor(Couleur)
MeshVertexPosition(100, -100, z)
MeshVertexColor(Couleur)
MeshVertexPosition(-100, -100, z)
MeshVertexColor(Couleur)
MeshFace(2, 3, 0)
MeshFace(0, 1, 2)
FinishMesh(#True)
CreateEntity(tt, MeshID(tt), MaterialID(0))
EntityLookAt(tt,0,0,1)
MoveEntity(tt,x,y,0)
tt=tt+1
;If tt>=100000 : Break :EndIf
Next
Next
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 0, 0, 30000, #PB_Absolute)
Repeat
t=ElapsedMilliseconds()
Screen3DEvents()
;For i=0 To tt-1
;RotateEntity(i, 0, 0, 1, #PB_Relative)
;Next
RenderWorld()
Screen3DStats()
FlipBuffers()
t=ElapsedMilliseconds()-t
StartDrawing(WindowOutput(1))
DrawText(5,5,Str(tt)+" entity")
DrawText(5,25,Str(t)+" ")
StopDrawing()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf
End
Code : Tout sélectionner
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
Define.f KeyX, KeyY, MouseX, MouseY
If InitEngine3D()
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(1, 0, 0, 200, 100, "", #PB_Window_SystemMenu)
If Screen3DRequester()
CreateMaterial(0, LoadTexture(0, "White.jpg"))
SetMaterialColor(0, #PB_Material_AmbientColor, -1)
z=0
tt=0
CreateMesh(tt)
For y=-12000 To 12000 Step 250
For x=-16000 To 16000 Step 250
Couleur=Random($ffffff,$7f7f7f)
MeshVertexPosition(-100+x, 100+y, z)
MeshVertexColor(Couleur)
MeshVertexPosition(100+x, 100+y , z)
MeshVertexColor(Couleur)
MeshVertexPosition(100+x, -100+y, z)
MeshVertexColor(Couleur)
MeshVertexPosition(-100+x, -100+y, z)
MeshVertexColor(Couleur)
MeshFace(2+tt, 3+tt, 0+tt)
MeshFace(0+tt, 1+tt, 2+tt)
tt=tt+4
Next
Next
FinishMesh(#True)
CreateEntity(0, MeshID(0), MaterialID(0))
EntityLookAt(0,0,0,1)
;MoveEntity(tt,x,y,0)
tt=tt+1
;If tt>=100 : Break :EndIf
;Next
;Next
Debug Str(tt)+" entity"
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 0, 0, 30000, #PB_Absolute)
Repeat
t=ElapsedMilliseconds()
Screen3DEvents()
;For i=0 To tt-1
;RotateEntity(0, 0, 0, 1, #PB_Relative)
;Next
RenderWorld()
Screen3DStats()
FlipBuffers()
t=ElapsedMilliseconds()-t
StartDrawing(WindowOutput(1))
DrawText(5,5,Str(tt/4)+" entity")
DrawText(5,25,Str(t)+" ")
StopDrawing()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf
End
Code : Tout sélectionner
Procedure.f RandomFloat(Maximum.f = 1.0, Minimum.f=0.0)
ProcedureReturn (Maximum-Minimum) * 4.6566128752457969241e-10 * Random(2147483647) + Minimum
EndProcedure
If OpenWindow(0,0,0,1280,800,#Null$,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
If OpenGLGadget(1,0,0,1280,800)
; Volume de visualisation
glMatrixMode_(#GL_PROJECTION)
glOrtho_(0, 1280, 800, 0, -1, 1)
; Activation de la transparence
glEnable_(#GL_BLEND)
glBlendFunc_(#GL_SRC_ALPHA, #GL_ONE_MINUS_SRC_ALPHA)
timer=ElapsedMilliseconds()
For n = 1 To 100000
x = Random(1280)
y = Random(800)
glColor4f_(RandomFloat(), RandomFloat(), RandomFloat(), RandomFloat(1, 0.1))
glBegin_(#GL_POLYGON)
glVertex2f_(x, y)
glVertex2f_(x+100, y+100)
glVertex2f_(x + 50, y + 150)
glEnd_()
Next
; Flip
SetGadgetAttribute(1, #PB_OpenGL_FlipBuffers, #True)
timer=ElapsedMilliseconds()-timer
Debug timer
EndIf
Repeat : Until WaitWindowEvent() = #WM_CHAR
EndIf
Je n'ai jamais dis que je ferais un jeu avec 100000 polygones. J'ai testé la rapidité de l'affichage de polygones en en appliquant 100000. C'est pas pareil.La remarque désagréable : Je pense que le jeu que tu souhaites créer (La suite de Another World) n'utilisera pas 100.000 polygones simultanément. Te lancer dans ce type de jeu avec une connaissance faible en OpenGL me parait compliquer et vouer à l'échec.