Je travaille sur un jeu que vous contrôlez un trébuchet pour lancer des balles à l'adversaire.
C'est comme un jeu appelé 'Medieval Siege'. Lorsque le trébuchet balance son bras, le joueur doit saisir le meilleur moment pour appuyer sur le bouton et relâcher le ballon. Ensuite, la balle volera à l'angle tangent. Mon problème en ce moment est que le bras du trébuchet oscille trop vite pour que le joueur saisisse le bon moment. Pendant ce temps, il doit être aussi rapide sinon il ne peut pas lancer assez loin. Et il y a une minuscule corde reliant la balle et le bras du trébuchet, si le bras oscille trop lentement, la balle est juste accrochée à la corde lorsque le bras bouge.
Je résous le problème en basculant la taille des pas, chaque fois que le bras oscille, je change la taille des pas de 1/60 à 1/200. Et une fois que le joueur a relâché le ballon, il revient à 1/60.
Cela fonctionne plutôt bien, sauf que mon jeu est multijoueur avec mise en réseau. Changer d'étape peut donc poser problème.
Une autre solution à laquelle je peux penser est de lui permettre de balancer lentement, mais lorsque le joueur relâche la balle, j'ajoute manuellement de la vitesse sur la balle tout en gardant sa direction. Je n'aime pas vraiment cette solution car elle a l'air fausse et j'ai toujours le problème que la balle est juste accrochée à la corde, à moins que je ne fasse de la corde très très courte ..
Merci de faire la lumière là-dessus, merci!
ÉDITER
Merci pour la contribution de tout le monde, je résous le problème en ralentissant le balancement du bras et lorsque le joueur relâche la balle, saisit la vitesse de la balle et deux fois. Cela ressemble exactement à la modification de la taille des pas. Il y a juste une chose supplémentaire que je dois faire. Parce que le bras oscille très lentement, la balle est simplement suspendue à l'extrémité du bras au lieu de se balancer. J'ai résolu ce problème en appliquant une force égale à la force gravitationnelle sur le ballon pendant et uniquement pendant la période de swing. Ensuite, il ne pend plus là, mais se balance avec le bras.
La réponse de @MrCranky est détaillée et semble faisable, donc je l'accepterais. :)
la source
Réponses:
Instinctivement, je dirais que nous manquons une partie substantielle du contexte nécessaire pour répondre, qui est "pourquoi l'aspect multijoueur vous empêche-t-il de changer le pas de temps?"
Si vous essayez de partager une simulation physique sur une connexion réseau, eh bien, c'est généralement une chose assez difficile à faire. Les simulations divergent très facilement, et surtout avec les connexions réseau qui peuvent perdre des paquets, il est très difficile de garder les choses ensemble.
La réponse simple et la plus robuste à votre question est d'utiliser un pas de temps variable. Lorsque vous approchez du moment de la décision, au lieu de mettre à jour votre simulation physique d'une seconde pour chaque seconde du monde réel qui passe, mettez-la à jour d'une demi-seconde ou un autre nombre approprié. Comme il s'agit d'un effet d'intégration, vous pourrez probablement vous en sortir en accrochant simplement le taux de mise à jour au taux inférieur pendant la fenêtre de décision, mais vous pouvez également interpoler rapidement vers le bas pour le taux inférieur. Quoi qu'il en soit, vous lisez essentiellement la simulation physique au ralenti. Il doit se comporter parfaitement avec précision, juste assez lentement pour que le joueur puisse prendre sa décision. Je n'envisagerais aucun autre moyen de tromper la physique pour la faire fonctionner, ils fonctionneront probablement tous horriblement et ne se sentiront pas `` bien ''.
Nous revenons donc à la mise en œuvre du réseau. Sans plus d'informations, je suppose que vous avez deux choix. Premièrement, si vous travaillez en parallèle avec l'autre partie en réseau. Ainsi, lorsqu'un joueur doit ralentir pour prendre sa décision, ralentissez les deux également. Cela sera probablement ennuyeux et étrange pour le joueur qui ne tire pas, car cela perturbera ses propres temps de réaction.
Pour le second, imaginez deux trébuchets se tirant dessus. Le trébuchet met 10 secondes à lancer et la fenêtre de tir commence à T + 5s. P1 démarre le cycle de tir à T + 0s, et à T + 5s ralentit leur simulation physique locale de 50%. Il leur faudra 15 ans pour jouer tout au long du cycle. Donc à T + 5s, P1 dit à P2 de commencer à lire le cycle de lancement de 10s à pleine vitesse. Donc P1 voit le cycle du trébuchet prendre 15 secondes, P2 le voit prendre 10 secondes, mais les deux joueurs voient le cycle se terminer à T + 15 secondes. Lorsque P1 libère réellement, ils indiquent à P2 à quel moment dans le cycle théorique ils ont libéré. Donc, si P1 sort à T + 10s, c'est en fait à 7,5s tout au long du cycle de lancement de 10s. P2 peut alors afficher la libération à T + 12,5 s (7,5 s dans sa lecture locale du cycle), et les simulations des deux joueurs auraient dû lancer le projectile au même point physique du cycle.
Donc, dans cette deuxième approche, vous ne simulez plus au pas. Vous exécutez deux simulations indépendantes, mais suivez plutôt les entrées des joueurs. Si les deux sont informés que le joueur a libéré à 7,5 s dans le cycle de lancement, ils devraient tous les deux s'entendre sur l'endroit où le projectile atterrira. Dans la pratique cependant, cela risque de diverger très rapidement et vous devrez synchroniser les états de simulation d'une manière ou d'une autre.
la source
Pourquoi ne pas simplement copier / adapter ce qui existe déjà et fonctionne dans des cas similaires?
la source
Si votre trébuchet se déplace trop vite, la solution évidente serait d'échelonner le temps pour le ralentir. C'est-à-dire que pour chaque seconde de temps réel, ne faites que 0,1 seconde par exemple dans votre simulation physique. Maintenant, du point de vue du joueur, la balle se déplacera 10 fois plus lentement.
En fait, il existe un autre moyen d'obtenir le même effet: au lieu de mettre à l'échelle le temps, il suffit de mettre à l'échelle toutes vos constantes physiques qui sont en unités, y compris le temps. Par exemple, l'accélération gravitationnelle a des unités de vitesse / temps = distance / temps², donc si la gravité est la seule constante de votre jeu, la réduire d'un facteur 100 = 10² produit le même effet que de ralentir le temps d'un facteur 10 .
Bien sûr, si votre modèle physique comprend d'autres constantes avec des unités de temps (ou vitesse = distance / temps, ou accélération = distance / temps², etc.), vous devrez aussi les mettre à l'échelle si vous voulez garder les trajectoires identiques .
Notez qu'il y a une limite à jusqu'où vous pouvez pratiquement aller avec ceci: si vous ralentissez le temps par, disons, un facteur de 100, votre trébuchet sera vraiment facile à contrôler, mais vos joueurs s'ennuieront également à attendre le balles pour flotter lentement après les avoir tirées. Si c'est un problème, vous devrez peut-être recourir à des astuces plus avancées comme celles suggérées dans d'autres réponses, telles que l'utilisation d'une mise à l'échelle très lente pendant que le trébuchet tire, mais passer à une échelle de temps plus rapide une fois que la balle a été lancée.
la source