Pure1945 !!!
Le principe que tu utilises consiste à compenser un retard en multipliant par un facteur temps, ça donne un truc de ce genre ,si pour un FPS normal de 75 , tu te déplaces de 4 pixels , on aura :
Si le FPS calculé est de 150 alors le déplacement = 2
Si le FPS calculé est de 75 , alors le déplacement = 4
Si le FPS calculé est de 37,5 alors le déplacement = 8
Dis moi si je me trompe ? c'est bien ainsi que tu fais ?
L'inconvénient de cette méthode ,c'est que ta détection des collisions n'est pas du tout la même si ton FPS est de 150 que s'il est de 37,5 !
si tu as des petits objets de taille inférieure à 8 , il est possible que tu passes au travers avec un mauvais FPS .
alors qu'avec la méthode que je t'ai indiqué , le déplacement est toujours le même quelque soit le FPS, et donc la gestion des collisions est la même aussi.
Si le FPS calculé est de 150 alors le déplacement = 2
Si le FPS calculé est de 75 , alors le déplacement = 4
Si le FPS calculé est de 37,5 alors le déplacement = 8
Dis moi si je me trompe ? c'est bien ainsi que tu fais ?
L'inconvénient de cette méthode ,c'est que ta détection des collisions n'est pas du tout la même si ton FPS est de 150 que s'il est de 37,5 !
si tu as des petits objets de taille inférieure à 8 , il est possible que tu passes au travers avec un mauvais FPS .
alors qu'avec la méthode que je t'ai indiqué , le déplacement est toujours le même quelque soit le FPS, et donc la gestion des collisions est la même aussi.
t'as tout à fait raison !L'inconvénient de cette méthode ,c'est que ta détection des collisions n'est pas du tout la même si ton FPS est de 150 que s'il est de 37,5 !
quoi que du 37,5 hz difficile à trouver

Oui mais adieu le fluidealors qu'avec la méthode que je t'ai indiqué , le déplacement est toujours le même quelque soit le FPS, et donc la gestion des collisions est la même aussi.

tu comprends pourquoi j'ai abandonné toutes ces methodes et en suis revenu au bon vieux :
Code : Tout sélectionner
SetRefreshRate(75)
If OpenScreen(1024,768,32,"") = 0 :SetRefreshRate(0): OpenScreen(1024,768,16,"") :SetFrameRate(75):EndIf
autre soluce : au lieu de calculer le fps en temps reel il suffit de retourner la sync par defaut avec DesktopFrequency() et de calculer le facteur de deplacement avec .
Fini le probleme des collisions , reste fluide , mais bon faut pas que le fsp descende en dessous de la sync sinon ramage serieux.
Fini le probleme des collisions , reste fluide , mais bon faut pas que le fsp descende en dessous de la sync sinon ramage serieux.
Je parlais du FPS , pas de la fréquence de l'écran .t'as tout à fait raison !
quoi que du 37,5 hz difficile à trouver![]()
Et en 3D si tu n'as pas de carte graphique adaptée , tu peux facilement y être au FPS de 30.
Quand j'ai mis mon invader3D sur un forum de "développeurs de jeux" , certains m'ont signalé un FPS supérieur à 300 , et pour eux le jeu était incontrôlable Et pourtant je valide bien la synchro de l'écran avec Flipbuffer() , mais je ne m'étais pas ton truc:
j'ai fait un essai hier soir , et si je désactive la synchro avec l'écran au niveau de ma carte ( ce que font ceux qui se plaignaient de la vitesse) , alors j'ai moi aussi un FPS supérieur à 400 malgré le SetRefreshRate(75) et le Flipbuffer() .SetRefreshRate(75)
If OpenScreen(1024,768,32,"") = 0 :SetRefreshRate(0): OpenScreen(1024,768,16,"") :SetFrameRate(75):EndIf
C'est pour ça que j'en suis venu à utiliser la méthode que je t'ai indiqué , elle permet de prendre en compte aussi bien les configs avec une mauvaise carte graphique que les configs avec un FPS important à cause de la synchro supprimée.
Autre avantage de la méthode c'est qu'en modifiant le paramètre Dt_jeu on peut faire des ralentis , des accélérés , sans rien toucher au code.
Bref , à chacun sa méthode, je voulais juste la signaler ici pour ceux que ça intéresse .
Une chose de bien, serait d’éviter au mieux de présumer de certaines caractéristiques du matériel dont dispose le joueur.hackotedelaplaque a écrit :Selon vos conseils, petite mise à jour avec au choix mode fenêtré ou plein écran.
Par exemple, en proposant le mode plein écran, il serait plus correct de considérer dans un premier temps des caractéristiques physiques de l’écran du joueur, puis de s’y adapter si besoin.
Ainsi pour windows, on trouvera le nécessaire dans le post suivant :
http://purebasic.hmt-forum.com/viewtopi ... aysettings
Malheureusement Pure ne permet pas, à ma connaissance, de connaître les caractéristiques courantes d’un écran quel que soit l’OS.
Cela complèterait parfaitement le jeu d’instructions ExamineScreenModes() et NextScreenMode()
Cependant si certaines personnes peuvent me renseigner sur les instructions équivalentes sur Linux et AmigaOS, ca comblerait cette lacune.
un FPS supérieur à 400 malgré le SetRefreshRate(75) et le Flipbuffer() .
Dsl Comtois ,j'ai l'impression que tu as pas bien lu

bien evidenment avec la sync deactivé le SetRefreshRate(75) est ignoré .
c'est pour cela que je met un SetFrameRate(75) qui limitera le fps a 75 quelle que soit la syncro activée ou pas . (en perdant la fluiditée si deactivée bien sur ! )
Et en 3D si tu n'as pas de carte graphique adaptée , tu peux facilement y être au FPS de 30.
Avec mon principe sans SetRefreshRate(75) oui ,
comme j'ai dis plus haut, pour eviter le problemes decollisions suffit de calculer le facteur de deplacement sans utiliser le fps en temps reel mais plutot avec DesktopFrequency():
Code : Tout sélectionner
facteur_deplacement = 75/ DesktopFrequency()
Ne suportant pas les saccades, j'essais de concevoir des truc optimisés pour une config minimale , eviter que le fsp descende en dessous de la sync .Tampis pour les trop vieilles configs , toutes manieres elles rameront forcement quelle que soit la technique .
C'est tellement plus beau le lisse

Et c'est bien de donner ses methodes , c'est un sujet tres peu abordé et pourtant ô combien essenciel .Bref , à chacun sa méthode, je voulais juste la signaler ici pour ceux que ça intéresse .
j'aimerais bien que tu nous montre un exemple de la tienne

Si si j'ai bien lu , j'ai mal écrit par contreDsl Comtois ,j'ai l'impression que tu as pas bien lu
bien evidenment avec la sync deactivé le SetRefreshRate(75) est ignoré .
c'est pour cela que je met un SetFrameRate(75) qui limitera le fps a 75 quelle que soit la syncro activée ou pas . (en perdant la fluiditée si deactivée bien sur ! )

Ce que je voulais te dire c'est que le SetFrameRate(75) ne limite pas le FPS si la synchro est désactivée , du moins chez moi , as-tu fait des essais en désactivant la synchro de ton écran ???
Pour l'exemple , il se trouve dans mon SpaceInvaders3D , et aussi un petit essai que j'ai fait avec un sprite dans la section trucs et astuces , sous le titre "gestion du temps dans les jeux"
ben la nouvelle librairie "Desktop" te renseigne sur les caractéristiques du bureau , valable pour Window et Linux .Dräc a écrit :Malheureusement Pure ne permet pas, à ma connaissance, de connaître les caractéristiques courantes d’un écran quel que soit l’OS.
Cela complèterait parfaitement le jeu d’instructions ExamineScreenModes() et NextScreenMode()
Cependant si certaines personnes peuvent me renseigner sur les instructions équivalentes sur Linux et AmigaOS, ca comblerait cette lacune.
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
bah, tu fais simplement un test de FPS au début du jeu et si tu vois que le FPS n'est pas celui du setframerate, tu quittes le jeu en disant : "la synchro de l'écran n'est pas activée."
et basta
et basta

Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
sinon, j'ai ça qui traine :
pour réguler un delay afin d'obtenir un FPS entre 30 et 35 dans cet exemple
et la pas de soucis de synchro
Code : Tout sélectionner
#Rapidite_Regulation = 3
Cpt_Temps + 1
If Cpt_Temps = #Rapidite_Regulation
FPS = Int(#Rapidite_Regulation * 1000 / (GetTickCount_() - Temps))
Temps = GetTickCount_()
Cpt_Temps = 0
If FPS < 30 And VitesseJeu > 0
VitesseJeu - 1
ElseIf FPS > 35
VitesseJeu + 1
EndIf
EndIf
Delay(VitesseJeu)
et la pas de soucis de synchro
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Tout à fait Thierrytu fais simplement un test de FPS au début du jeu et si tu vois que le FPS n'est pas celui du setframerate, tu quittes le jeu en disant : "la synchro de l'écran n'est pas activée."

sinon, j'ai ça qui traine :

Avec cette methode il est impossible de faite du fluideun petit essai que j'ai fait avec un sprite dans la section trucs et astuces , sous le titre "gestion du temps dans les jeux"

-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
tu as changé le FPS de mon truc avant de raler ?
la il est sur 30 de FPS donc forcément
Le mieux est de combiner un Setframerate avec ça je trouve
si il y a la synchro, le setframerate fait tout, sinon, mon truc se lance et limite le FPS.

la il est sur 30 de FPS donc forcément

Le mieux est de combiner un Setframerate avec ça je trouve
si il y a la synchro, le setframerate fait tout, sinon, mon truc se lance et limite le FPS.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
lol je vois que tu commence à me connaîtretu as changé le FPS de mon truc avant de raler ?

la il est sur 30 de FPS donc forcément
bien evidenment rien que de voir ce 30 j'avais même pas testé

Si non j'ai testé ton truc avec :
Code : Tout sélectionner
SetRefreshRate(75)
If OpenScreen(1024,768,32,"") = 0 :SetRefreshRate(0): OpenScreen(1024,768,16,"") :SetFrameRate(75):EndIf
;boucle
#Rapidite_Regulation = 3
Cpt_Temps + 1
If Cpt_Temps = #Rapidite_Regulation
fps = Int(#Rapidite_Regulation * 1000 / (GetTickCount_() - Temps))
Temps = GetTickCount_()
Cpt_Temps = 0
If fps < 75 And VitesseJeu > 0
VitesseJeu - 1
ElseIf fps > 75
VitesseJeu + 1
EndIf
EndIf
Debug fps
Delay(VitesseJeu)
------------------------
cela semble marcher

si l'ecran accepte le 75 hz il se calle dessus ,donc hyper fluide
s'il veut pas du 75, SetFrameRate(75) limite le fps ,( pas lisse ,s'ont qu'a avoir un ecran qui accepte le 75 hz , le 60hz en 1024x768 s'a fait mal au yeux

et si la sync est déactivé ton truc regule le fps ( saccadé mais bonne vitesse , s'ont qu'a pas déactiver leur syncro

Merci Soldat Inconnu