cette fonction me retourne un pointeur , je l'utilise pour identifier l'engrenage.
mais lorsque je veut créer un deuxième engrenage , j'ai un "invalid memory" qui apparait sur un allocatememory()...
Voila le code :
Code : Tout sélectionner
InitSprite() : InitKeyboard() : InitMouse() : InitSprite3D()
OpenScreen(800,600,32,"") : UsePNGImageDecoder()
Structure Vertex
x.f
y.f
EndStructure
Structure Engrenage
*Vertices.i
NbVertices.i
x.f
y.f
Angle.f
Radius.l
EndStructure
Procedure.i MakeEngrenage(X,Y,Radius,NbTheet,TheetHeight)
Protected Sub = 5
Protected AngleStep = 360 / ((NbTheet*2)*Sub)
*E.Engrenage = AllocateMemory( SizeOf(Engrenage) )
*E\Vertices = AllocateMemory( SizeOf(Vertex) * AngleStep )
*E\NbVertices = 360 / AngleStep
*E\Radius =Radius
*E\x = X
*E\y = Y
Radius_ = Radius
For i = 0 To 360 / AngleStep
C+1
C%Sub
If C=Sub-1
D+1
D%2
If D=1
Radius_ = Radius +TheetHeight
EndIf
If D=0
Radius_ = Radius
EndIf
EndIf
X_.f = X + Radius_ * Cos( ( i * AngleStep) * #PI / 180 )
Y_.f = Y + Radius_ * Sin ( ( i * AngleStep) * #PI / 180 )
PokeF(*E\Vertices+ ( i * SizeOf(Vertex) + OffsetOf(Vertex\x)) ,X_ )
PokeF(*E\Vertices+ ( i * SizeOf(Vertex) + OffsetOf(Vertex\y)) ,Y_ )
Next
ProcedureReturn *E
EndProcedure
Procedure DrawEngrenage(*Engrenage.Engrenage)
StartDrawing(ScreenOutput())
With *Engrenage
For i = 0 To \NbVertices-1
x1.f = PeekF(\Vertices + ( i *SizeOf(Vertex) + OffsetOf(Vertex\x)))
y1.f = PeekF(\Vertices + ( i *SizeOf(Vertex) + OffsetOf(Vertex\y)))
x2.f = PeekF(\Vertices + ( (i+1) *SizeOf(Vertex) + OffsetOf(Vertex\x)))
y2.f = PeekF(\Vertices + ( (i+1) *SizeOf(Vertex) + OffsetOf(Vertex\y)))
LineXY(x1,y1,x2,y2,$000000)
Next
; On ferme
x1 = PeekF(\Vertices + ( 1*SizeOf(Vertex) + OffsetOf(Vertex\x)))
y1 = PeekF(\Vertices + ( 1*SizeOf(Vertex) + OffsetOf(Vertex\y)))
x2 = PeekF(\Vertices + ( \NbVertices *SizeOf(Vertex) + OffsetOf(Vertex\x)))
y2 = PeekF(\Vertices + ( \NbVertices *SizeOf(Vertex) + OffsetOf(Vertex\y)))
LineXY(x1,y1,x2,y2,$000000)
DrawingMode(#PB_2DDrawing_Outlined)
Circle(\X,\Y,\Radius/1.5,$000000)
EndWith
StopDrawing()
EndProcedure
A= MakeEngrenage(400,300,150,10,20)
Debug "A ok"
B = MakeEngrenage(400,300,150,10,20)
Debug "B ok"
Repeat
ExamineKeyboard()
ClearScreen($FFFFFF)
DrawEngrenage(A)
DrawEngrenage(B)
FlipBuffers(0)
Until KeyboardPushed(#PB_Key_Escape)