Je suis en train de créer un moteur de mouvement pour mon jeu de haut en bas en 2D, mais je suis resté bloqué en essayant de résoudre le problème suivant :
- Le joueur peut se déplacer en utilisant les touches fléchées, qui vous accélèrent dans les directions respectives. Il y a une friction, donc vous arrêtez de bouger après avoir relâché les touches, mais pas instantanément.
- Lorsque vous tenez deux touches perpendiculaires, vous accélérez dans cette direction de 45° à la même vitesse que sur un axe.
- Il existe une vitesse maximale à partir de laquelle vous ne pouvez pas accélérer. en marchant Cela limite également votre vitesse de marche maximale, évidemment. Vous pouvez vous faire assommer, et donc dépasser cette vitesse cependant.
- Si vous vous déplacez plus vite que la vitesse de marche maximale, vous pouvez ralentir plus rapidement si vous maintenez les touches dans la ou les directions opposées.
Pseudocode pour le premier point, sans friction :
gameTick(){
tempX += LeftKeyHeld ? -1 : 0;
tempX += RightKeyHeld ? 1 : 0;
tempY += UpKeyHeld ? -1 : 0;
tempY += DownKeyHeld ? 1 : 0;
ratio = 0.71;
if( |tempX| == |tempY| ) {
tempX =tempX* ratio;
tempY =tempY* ratio;
}
player.x += tempX;
player.y += tempY;
}
Je peux résoudre le problème de la friction (en obtenant la longueur du vecteur de mouvement, en la réduisant de la friction, en la projetant à nouveau avec le même rapport x:y), mais je ne parviens pas à obtenir la vitesse maximale.
J'ai essayé une solution consistant à ne pas permettre au joueur de marcher du tout lorsqu'il dépasse la vitesse maximale, mais cela viole le point 4. De plus, cela a eu le désagréable effet secondaire que lorsque vous vous déplacez à la vitesse maximale vers la gauche, et que vous commencez à appuyer vers le bas, la direction du mouvement ne change pas, ou à peine.
J'ai ensuite commencé à réfléchir à de nombreux produits, différences et autres choses avec les vecteurs, mais la plupart du temps, je n'arrivais plus à suivre ou je rencontrais les premiers problèmes.
Donc, en conclusion, quelqu'un pourrait-il expliquer un système qui remplit tous les points ci-dessus, ou indiquer un article qui explique comment un tel système pourrait être mis en œuvre ? Ne vous inquiétez pas si vous proposez quelque chose de complexe, je peux comprendre même des concepts difficiles avec un peu de temps.
Merci pour votre aide !