J'aimerais comprendre pourquoi lors d'un déplacement mon sprite saccade.
Exemple : le joueur sur un Space Invaders Like (ou même les aliens).
Existe-t-il une solution pour que tout celà devienne fluide ?
Merci d'avance !

Code : Tout sélectionner
;Danilo - Forum Anglais
;- procedures
Procedure InitGameTimer()
Shared _GT_DevCaps.TIMECAPS
timeGetDevCaps_(_GT_DevCaps,SizeOf(TIMECAPS))
timeBeginPeriod_(_GT_DevCaps\wPeriodMin)
EndProcedure
Procedure StopGameTimer()
Shared _GT_DevCaps.TIMECAPS
timeEndPeriod_(_GT_DevCaps\wPeriodMin)
EndProcedure
;- variables
Global player1_move.f, player1_x.f, player1_y.f
;- _program start
;- _Init
If InitSprite()=0 Or InitKeyboard()=0
MessageRequester("ERROR","Cant init DirectX !",#MB_ICONERROR):End
EndIf
If OpenScreen(800,600,32,"Timing")=0
If OpenScreen(800,600,24,"Timing")=0
If OpenScreen(800,600,16,"Timing")=0
MessageRequester("ERROR","Cant open screen !",#MB_ICONERROR):End
EndIf:EndIf:EndIf
If CreateSprite(1,32,32)=0
CloseScreen()
MessageRequester("ERROR","Cant create sprite !",#MB_ICONERROR):End
Else
StartDrawing(SpriteOutput(1))
Box (0,0,32,32,$00FFFF)
Line(0,0,32,32,$000000)
Line(32,0,0,32,$000000)
StopDrawing()
EndIf
player1_speed.f = 0.50
; timer initialisieren
InitGameTimer()
StartTime = TimeGetTime_()
;StartTime = GetTickCount_()
time = StartTime
SetFrameRate(75)
;- _game loop
Repeat
; calculate multiplicator
multiplicator.f = StartTime
StartTime = TimeGetTime_()
;StartTime = GetTickCount_()
multiplicator = StartTime - multiplicator
; calc framerate
If TimeGetTime_()-time >= 1000
;If GetTickCount_()-time >= 1000
time = TimeGetTime_()
;time = GetTickCount_()
FPS = Frames-1
Frames = 1
Else
Frames+1
EndIf
ClearScreen(0,0,0)
; show framerate
StartDrawing(ScreenOutput())
DrawingMode(1):FrontColor($80,$FF,$00)
Locate(50,50):DrawText("FrameRate: "+Str(FPS))
StopDrawing()
ExamineKeyboard()
; calc move-step for player1
player1_move = player1_speed * multiplicator
If KeyboardPushed(#PB_Key_Left)
player1_x - player1_move : EndIf
If KeyboardPushed(#PB_Key_Right)
player1_x + player1_move : EndIf
If KeyboardPushed(#PB_Key_Up)
player1_y - player1_move : EndIf
If KeyboardPushed(#PB_Key_Down)
player1_y + player1_move : EndIf
If player1_x < -32 : player1_x = 800 : EndIf
If player1_x > 800 : player1_x = -32 : EndIf
If player1_y < -32 : player1_y = 600 : EndIf
If player1_y > 600 : player1_y = -32 : EndIf
DisplaySprite(1,player1_x,player1_y)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
;- _program end
StopGameTimer()
Code : Tout sélectionner
; etc ...
#NUM_INVADERS = 50
Global player_1.Player
Global invaders_1.Invaders
Global spacex, spacey
; etc ...
Structure Player
x.w ;position du joueur - x
y.w ;position du joueur - y
width.w ;largeur du sprite
height.w ;hauteur du sprite
speed.f ;vitesse du joueur
fps.w ;frames par secondes du joueur
frameno.w ;numéro courant du frame
frames.Frame[3] ;array of frames to animate
EndStructure
Structure Invaders
x.w ;position des aliens - x
y.w ;position des aliens - y
width.w ;largeur du sprite
height.w ;hauteur du sprite
speed.f ;vitesse des aliens
fps.w ;frames par secondes des aliens
frameno.w ;numéro courant du frame
frames.Frame[3] ;array of frames to animate
EndStructure
; etc ...
Dim aliens.Invaders(#NUM_INVADERS)
;etc ...
; ////////////////////////////////////////////////////////////////////////////////////////
Procedure InitPlayer()
;
; Load player variable
;
; load sprite and set player's initial x,y and speed
result = LoadSprite(#player1,"fighter2.bmp",0)
If result = 0
MessageRequester("b","Problème de chargement des sprites !!!",0)
EndIf
player_1\speed = 2 ; 1 / 0.50 / 0.30
player_1\width = 60
player_1\height = 60
player_1\x = (#SCREEN_WIDTH - player_1\width) /2
player_1\y = 520
; now load the frame data (note: not the bitmap, just the cordinates
startpointx = 0
startpointy = 0
For x = 0 To 2
player_1\frames[x]\x1 = startpointx
player_1\frames[x]\y1 = startpointy
player_1\frames[x]\x2 = startpointx + 60
player_1\frames[x]\y2 = startpointy
startpointx = startpointx + 60
Next
player_1\frameno = 0
EndProcedure
; ////////////////////////////////////////////////////////////////////////////////////////
; ////////////////////////////////////////////////////////////////////////////////////////
Procedure AnimatePlayer()
;
; Animate the player
; Clip the sprite
;
CurrFrame = player_1\frameno
ClipSprite(#player1, player_1\frames[CurrFrame]\x1, player_1\frames[CurrFrame]\y1, player_1\width ,player_1\height)
DisplayTransparentSprite(#player1,player_1\x,player_1\y)
CurrFrame = CurrFrame + 1
If CurrFrame > 2
CurrFrame = 0
EndIf
player_1\frameno = CurrFrame
EndProcedure
; ////////////////////////////////////////////////////////////////////////////////////////
; ////////////////////////////////////////////////////////////////////////////////////////
Procedure InitInvaders()
;
; Load invaders variable
;
; load sprite and set invader's initial x,y and speed
result = LoadSprite(#invaders1,"invaders1.bmp",0)
If result = 0
MessageRequester("b","Problème de chargement des sprites !!!",0)
EndIf
invaders_1\speed = 1
invaders_1\width = 37
invaders_1\height = 25
For x = 0 To #NUM_INVADERS - 1
spacex = spacex + 60
aliens(x)\x = aliens(x)\x + spacex
aliens(x)\y = aliens(x)\y + spacey
If spacex > 550
spacex = 0
spacey = spacey + 40
EndIf
Next x
EndProcedure
; ////////////////////////////////////////////////////////////////////////////////////////
; ////////////////////////////////////////////////////////////////////////////////////////
Procedure AnimateInvaders()
;
; Animate invaders
; Clip the sprite
;
For i = 0 To #NUM_INVADERS - 1
DisplayTransparentSprite(#invaders1,aliens(i)\x,aliens(i)\y)
Next i
; mouvement des vaisseaux à définir ...
EndProcedure
; ////////////////////////////////////////////////////////////////////////////////////////
Ben pour ça tu as besoin de connaitre le nombre de colonnes , et la largeur de ton écrankiller7 a écrit : sinon, encore une petite question : comment centrer mes colonnes de vaisseaux à l'écran par rapport à x ???
Code : Tout sélectionner
;Définition des constantes
#LargeurEcran = 800
#NbColonnesVaisseaux = 3
#NbLignesVaisseaux = 4
#NUM_INVADERS = #NbColonnesVaisseaux * #NbLignesVaisseaux
;et plus loin dans ton InitInvader()
Procedure InitInvaders()
;pour calculer la position de chaque colonne
;tu as juste à faire
EspaceEntreColonne = #LArgeurEcran / (NbColonnesVaisseaux + 1)
EspaceEntreLigne = 40
for a = 1 to #NbColonnesVaisseaux
for b = 1 to #NbLignesVaisseaux
aliens(x)\x = a * EspaceEntreColonne
aliens(x)\y = b * EspaceEntreLigne
x + 1
next b
next a
Code : Tout sélectionner
Sens.b ; déplacement vers la droite = 1 , déplacement vers la gauche = -1
Code : Tout sélectionner
aliens(X)\Sens = 1 ; pour un déplacement vers la droite
Code : Tout sélectionner
For i = 0 To #NUM_INVADERS - 1
; Test de la collision ( le test sera différent selon que tu centres ton sprite ou non par rapport à aliens(i)\x )
; à toi d'adapter , dans ce cas , je considère que le sprite n'est pas centré
If aliens(i)\X + aliens(i)\width > #LargeurEcran Or aliens(i)\X < 0
aliens(i)\Sens * -1 ; on inverse le sens de déplacement de l'alien
aliens(i)\Y + 1 ; et on ajoute une ligne
EndIf
DisplayTransparentSprite(#invaders1,aliens(i)\X+aliens(i)\Sens,aliens(i)\Y)
Next i