J'utilise C # / XNA et on m'a souvent dit de ne pas mélanger le code de mise à jour avec le code de tirage - et je suis certain que ce n'est pas le cas! Mais quelqu'un pourrait-il s'il vous plaît décrire ce qu'est exactement le «code logique»?
Comme on peut le voir ici: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx
[...] assurez-vous de mettre toute votre logique de jeu dans la méthode Update (pas dans Draw!) et tout se déroulera à une vitesse constante.
Je pose cette question car la vitesse de mon jeu fluctue par rapport au FPS. Les FPS lents correspondent aux objets se déplaçant lentement et inversement. Et oui, j'inclus le position += speed * (float)gt.ElapsedGameTime.TotalSeconds;
code attendu .
C'est probablement une grande question de recrue, mais je veux juste être absolument clair sur la définition de cela.
la source
position = speed * ...TotalSeconds
. Remarquez que=
non+=
. Si c'était+=
juste comme vous l'aviez tapé, votre position disparaîtrait presque instantanément de l'écran.gt.ElapsedGameTime.TotalSeconds
est le nombre de secondes écoulées depuis le début du programme. Si vous multipliez votre vitesse par cela, alors après 5 secondes de jeu, votre vitesse sera 5 fois plus rapide (sauf dans le cas particulier où la vitesse est réglée sur 0). Vous ne savez pas quoi d'autre pourrait rendre cela faux, mais je suis intrigué.iii
incrémenter manuellement chaque mise à jour, parce que je ne la veux pas en quelques secondes, je veux des étapes ou des cadres. Je peux voir que votre façon de faire est un moyen valable de coder de manière souple.Réponses:
Cela change-t-il l'état de votre monde de jeu? C'est un code logique.
Affiche-t-il l'état du monde du jeu? C'est du code de rendu.
la source
Votre séparation est correcte si:
la source
Draw()
peut dessiner des images différentes au fil du temps. Par exemple, les images des images-objets animées peuvent continuer à changer. En outre, les objets peuvent continuer à avancer visuellement si le code de rendu utilise une astuce commune et ajoutevelocity * time since last update / period of update
à la position visible des objets (alors que leur position réelle reste inchangée).iff
signifiant si-et-seulement-si?Update
qu'y a-t-il d'autre de désynchronisé? Les entrées du joueur sont manquées, les événements réseau ne sont pas traités, etc.? Le jeu doit être piloté par une seule horloge, avec des "ticks" fixes pour la logique de jeu ou la physique dérivés de cette horloge, et un état graphique dérivé également piloté par cette même horloge.Draw()
de manière à ce que l'image soit toujours la même lorsqu'elle est appelée plusieurs fois de suite. On devrait le faire si possible. Mais il y a des cas où vous ne savez pas à quelle fréquenceDraw()
sera appelée. Par exemple, si vous souhaitez une prise en charge complète (120 FPS réels) pour les nouveaux moniteurs 120hz et que vous activez vsync.What if I want to pause graphics?
Ensuite, vous passez 0 à la place du temps delta réelDraw()
.0
. Vous pouvez avoir des horloges hiérarchiques pour que, par exemple, l'interface utilisateur continue de tourner et s'anime pendant que l'interpolation des caractères s'arrête aussi, très très facilement.Le point ici est la séparation des éléments du modèle qui ne sont pas le modèle.
La logique de jeu est le modèle mentionné dans
Ce sont tous différents, liés, modèles d'architecture logicielle. Mais dans tous les cas, le modèle est la même chose, c'est la logique réelle et l'état réel.
C'est lors de la création d'un logiciel de gestion que l'on parle parfois de logique métier et que certaines des stratégies d'entreprise sont codées. Par exemple, si vous codez quelque chose pour une banque, pour calculer des factures de carte de crédit, la fonctionnalité permettant à une personne de ne pas avoir à payer d’intérêts s’il efface sa dette en moins de 30 jours fait partie de la logique commerciale, elle réside dans la modèle. Il ne vit par exemple pas sur l’une des couches affichées. Le code pour imprimer une facture, par exemple, ne modifie pas le texte en fonction de ses actions. Cet exemple montre peut-être pourquoi vous souhaitez organiser votre code de cette façon.
Il en va de même pour la logique de jeu.
Imaginez qu’à un moment donné votre jeu ait été porté sur une autre console. Il peut être utile d’imaginer quelque chose de vraiment différent de votre cible actuelle. Par exemple, si vous ciblez quelque chose avec une manette de jeu / contrôleur, imaginez que votre jeu soit transféré sur une tablette à écran tactile. La logique de jeu est la partie du code qui ne change pas lorsque vous la portez.
Si votre jeu ressemblait à un jeu de stratégie militaire, imaginez-le converti au jeu de société le plus complexe au monde. La logique de jeu est constituée des sections de code, qui correspondent directement aux lignes du livre de règles. (Pas toutes les lignes du livre de règles, pas celles concernant les pièces en mouvement, mais certaines.).
La logique de jeu est la chose qui ne change jamais, peu importe la forme.
la source