2011-03-10 6 views
1

Donc, je comprends que, pour obtenir un mouvement indépendant du taux de trame, je dois multiplier la vitesse de base par (1000/delta). Cela fonctionne sur des valeurs qui représentent la vitesse, mais quand j'essaye ceci avec une variable d'accélération, par exemple. gravité, ça ne marchera pas, ce n'est même pas indépendant du taux de trame.Framerate accélération indépendante

Existe-t-il une formule différente pour les variables d'accélération, ou est-ce que j'oublie quelque chose d'autre?

Exemple:

var Multiplier:Number = (GetDeltaTime())/(1000/30); 
jumpVelocity = -21 * Multiplier //works 
gravity = 1.5 * Multiplier //dosn't work 

Ceci est appelé au début de chaque trame

Modifier: trouvé une solution, je devais carré du temps delta. Pas sûr à 100% pourquoi cela fonctionne, mais c'est le cas.

Alors:

jumpVelocity = -21 * Multiplier //unchanged 
gravity = 1.5 * Math.pow(Multiplier,2) //works now 
+1

Je ne sais rien sur actionscript, mais je connais la physique et cela n'a aucun sens pour moi. Connaissez-vous les unités? Pourriez-vous nous donner quelques chiffres, et nous dire ce qui ne va pas (pas seulement "ça ne marchera pas")? – Beta

+0

Les unités sont des pixels/30e de seconde. Fondamentalement, tout fonctionne sauf l'accélération, la gravité et la friction. Tout cela modifie la vitesse, pas les coordonnées. À des fréquences d'images plus élevées, ces valeurs semblent augmenter (par exemple accélération plus rapide, gravité plus élevée). – lordSimon

Répondre

2

Fondamentalement, ce que vous voulez faire est de mesurer le temps écoulé depuis la dernière image (le « temps de trame »), et d'ajouter que dans un accumulateur.

Vous retransmettez ensuite l'état de votre partie par "pas de temps fixes" (par exemple 1/30ème de seconde) et soustrayez cette durée simulée de l'accumulateur jusqu'à ce qu'elle soit inférieure à un pas de temps.

Ainsi, par exemple:

    accumulateur
  • commence à 0
  • pas de temps fixe réglé à 33ms

  • une trame passe à 20 ips, le temps de trame est 1000ms/20 = 50ms

  • 50ms ont été ajoutés à l'accumulateur
  • l'état du jeu est transféré de 1 pas de temps fixe (33ms), ce temps est soustrait de accumulateur
  • accumulateur est maintenant 17ms, ce qui est inférieur à un pas de temps fixe -> état du jeu se fait la mise à jour
  • continuent à l'image suivante

  • 1 cadre passe à 10fps, le temps de trame a été 1000ms/10 = 100ms

  • 100ms ajouté à l'accumulateur
  • accumulateur
  • est maintenant 117ms
  • état de jeu est transmis par une étape de temps fixe (33ms), que le temps est soustraite de l'accumulateur
  • accumulateur
  • est maintenant 84ms, ce qui est plus d'un pas de temps fixé -> état du jeu ne se fait pas la mise à jour
  • état de jeu est transmis par une étape de temps fixe (33ms), que le temps est soustraite de l'accumulateur
  • accumulateur
  • est maintenant 51MS, qui est plus d'un pas de temps fixé -> état du jeu ne se fait pas la mise à jour
  • état de jeu est transmis par une étape de temps fixe (33ms), que le temps est soustrait de l'accumulateur
  • accumulateur
  • est maintenant 18ms, ce qui est inférieur à un pas de temps fixe -> l'état du jeu est terminé.
  • passez au cadre suivant

Il existe un excellent article de Glenn Fiedler à propos de ce problème. Vous pouvez le trouver here.

+0

Merci pour votre aide, mais j'avais déjà lu cet article auparavant. J'ai décidé de ne pas l'utiliser parce que, comme indiqué dans la dernière section de l'article, un nombre différent de mesures pourrait être prises à chaque image, ce qui rend le clapot. L'article offre une solution pour cela, mais je travaille en flash et ce serait trop lent. – lordSimon

+1

@simon Pour clarifier: Toute l'idée avec la physique des pas de temps fixe est qu'elle n'a pas l'air agitée. En fait, si vous allez un peu plus loin et interpolez les états (qui sont mentionnés à la fin de l'article), vous obtiendrez les résultats les plus fluides et les plus esthétiques possible dans n'importe quel jeu, n'importe quelle simulation. Peut-être que [ce lien] (http://www.gamepoetry.com/blog/2008/04/11/frame-based-code-sucks/) aidera. Jetez un coup d'œil aux deux exemples de swfs, faites "Frame Based Case Study" et "Timer Based Case Study" et dites-moi ce qui vous semble saccadé:) –