Effectivement, ya des méthodes simples et efficaces !
Méthode utile pour les déplacements de tirs

Héhé, je n'ai pas de fait de macros mais j'ai tout précalculé (je limite un max le calcul en temps-réel) . Hier soir, j'ai trouvé un peu de courage au fond du puits et j'ai codé le truc .G-Rom a écrit :Evite de les utilisé en tps réel. Pour etre au top reprend le code de Dobro, fait des macro a la place des procédures, ( d'ailleurs les nom ne sont pas explicite, newX() est plus approprié ) utilise des table precalculé des cos/sin et tu sera au top
Code : Tout sélectionner
; Mad Race
; Cool Dji, Septembre 2010, PB 4.50
InitSprite() : InitKeyboard() : InitSprite3D() :InitEngine3D()
Procedure.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f) ; DEGREE
A.f = x1-x2
b.f = y1-y2
c.f = -Sqr(A*A+b*b)
Angle.f = ACos(A/c)*180/#PI
If y1 < y2 : Angle=360-Angle : EndIf
ProcedureReturn Abs(Angle - 360)
EndProcedure
;Tableau qui stock les coordonnées du circuit
Global Dim cx.f(10000),Dim cy.f(10000),Dim cz.f(10000)
Structure vecteur3f
x.f
y.f
z.f
EndStructure
A.vecteur3f
B.vecteur3f
C.vecteur3f
Dir.vecteur3f
Global Accel.f
; liste de points recalculés avec un espacement normés
nbnewpoints=0
Global Dim Dx.f(nbnewpoints),Dim Dy.f(nbnewpoints),Dim Dz.f(nbnewpoints)
OpenScreen(800, 600, 32, "Circuit")
; Création de deux sprites qui servent à visualiser le circuit et la position de la camera
CreateSprite(0, 5,5,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
Circle(3, 3, 2, RGB(255,255,255))
StopDrawing()
CreateSprite3D(0, 0)
CreateSprite(1, 5,5,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
Circle(3, 3, 2, RGB(255,0,0))
StopDrawing()
CreateSprite3D(1, 1)
Sprite3DQuality(1)
; Charge la texture pour le Billboard
Add3DArchive("\", #PB_3DArchive_FileSystem)
CreateMaterial(1, LoadTexture(0,"flare.bmp")):DisableMaterialLighting(1, 1)
MaterialBlendingMode(1,#PB_Material_Add)
CreateBillboardGroup(10,MaterialID(1),5,5)
CreateMaterial(2, LoadTexture(1,"flare1.bmp")):DisableMaterialLighting(2, 1)
MaterialBlendingMode(2,#PB_Material_Add)
CreateBillboardGroup(11,MaterialID(2),5,5)
; Charge le fichier de points (x,y) qui constitue le circuit
OpenFile(0,"Savepoints.txt")
nbsavepoints=Val(ReadString(0))
j=0
k=0
i=0
For j=1 To nbsavepoints
ang.f=ang+0.05:If ang=360:ang=0:EndIf
cx(j)=Val(ReadString(0))/10 ; les coordonnées sont stockées sur un grand nombre
cy(j)=Val(ReadString(0))/10 ; la division permet de récupérer des décimaux pour plus tard : héhéhéhé
cz(j)=Sin(ang)*50 ; ajoute du relief avec un sinus pour l'instant
Next
CloseFile(0)
; on retravaille la courbe pour obtenir un nombre de points séparés par un segment de unité 1 en 3D
; là, je découpe tous les segments entre les points en
; autant de tronçon de longueur 1 en 3d
k=0
j=0
For j=1 To nbsavepoints-1
A\x = cx(j) ; point de départ
A\y = cy(j)
A\z = cz(j)
B\x = cx(j+1) ; point d'arrivée
B\y = cy(j+1)
B\z = cz(j+1)
C\x = A\x
C\y = A\y
C\z = A\z
; calcul la longueur du segment en 3d
; cette longueur deviendra le nombre de tronçons du segment de longueur 1
Lenght.f = Sqr( (A\x - B\x) * (A\x - B\x) + (A\y - B\y) * (A\y - B\y) + (A\z - B\z) * (A\z - B\z) )
Lenght=Lenght*4 ; ce coef permet de définir un segment encore plus petit = augmente la précision du déplacement
nbnewpoints=nbnewpoints+Lenght
ReDim Dx(nbnewpoints): ReDim Dy(nbnewpoints): ReDim Dz(nbnewpoints)
If Lenght<>0 ; Prevent div 0
Dir\x = (B\x - A\x) / (Lenght)
Dir\y = (B\y - A\y) / (Lenght)
Dir\z = (B\z - A\z) / (Lenght)
EndIf
For i= 1 To Lenght
k=k+1
Dx(k)=C\x + Dir\x*i ; calcul les coordonnées des nouveaux points
Dy(k)=C\y + Dir\y*i
Dz(k)=C\z + Dir\z*i
Next
cx(j+1)=Dx(k) ; remplace les coordonnées de l'ancien point par les
cy(j+1)=Dy(k) ; nouvelles coordonnées recalculées.
cz(j+1)=Dz(k) ; et prends ce point comme nouveau point de départ pour le prochain calcul...
Next
For j=1 To nbnewpoints
i=i+1:If i>100
i=0
k1=k1+1
AddBillboard(k1,11,dx(j),dz(j),dy(j))
If j>1
X1.f=dx(j)
Y1.f=dy(j)
X2.f=dx(j-1)
Y2.f=dy(j-1)
Angle = ReturnDegAngle(X1,Y1,X2,Y2)
EndIf
For l=0 To 1
k=k+1
Distance = 10;Random(10);
X3.f = X2 + Distance * Cos( (Angle - 90) * #PI/180)
Y3.f = Y2 + Distance * Sin( (Angle - 90) * #PI/180)
AddBillboard(k,10,X3,dz(j),Y3) ;
k=k+1
Distance = 10;Random(10)
X4.f = X2 + Distance * Cos( (Angle + 90) * #PI/180)
Y4.f = Y2 + Distance * Sin( (Angle + 90) * #PI/180)
AddBillboard(k,10,X4,dz(j),Y4)
Next
EndIf
Next
HideBillboardGroup(10, 0)
HideBillboardGroup(11, 0)
dl=nbnewpoints
dl=0
CreateCamera(0, 0, 0, 100, 100)
SkyBox("Space.bmp")
;-
;- BIG LOOP
Repeat
FlipBuffers()
;ing+1:If ing>0:ing=0:dl=dl+1:If dl=nbnewpoints-20:dl=1:EndIf:EndIf
dl=dl+accel :If dl>nbnewpoints-50:dl=1:EndIf
CameraLocate(0,dx(dl),dz(dl)+15,dy(dl)):CameraLookAt(0,dx(dl+50),dz(dl+50)+15,dy(dl+50))
RenderWorld()
If Start3D()
For j=1 To nbnewpoints
DisplaySprite3D(0,dx(j)/10,dy(j)/10,200)
Next
DisplaySprite3D(1,dx(dl)/10,dy(dl)/10,200)
EndIf
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Space)
If accel+5<50 :accel+1 : EndIf ; Edit je mets 50 pour éviter le bug de fin de parcours avec le 50 de CameraLookAt (Patch provisoire)
Else
accel-1: If accel<0:accel=0:EndIf
EndIf
Until KeyboardPushed(#PB_Key_Escape):
End
Code : Tout sélectionner
CreateSprite(0, 5,5,#PB_Sprite_Texture)