Part of pictures, articles, images on this page are copyrighted by Mojang AB.
Il s'agit d'un projet visant à reproduire le célèbre jeu de bac à sable "Minecraft" dans le langage de programmation "Python".
** Article précédent: "[# 2] Créez Minecraft avec Python.-Dessin de modèle et implémentation du lecteur-" **
La dernière fois, nous avons tout fait, du dessin d'un modèle à l'aide de textures de test à la mise en œuvre d'une perspective de joueur.
Ne pensez-vous pas que le mouvement du joueur que vous avez implémenté la dernière fois n'est pas naturel? Ceci est dû au fait que ** "ne bouge que lorsqu'une touche est enfoncée" **. Dans la plupart des jeux 3D, les joueurs se déplacent en douceur, mais en interne, les mouvements des joueurs et des objets ont été conçus.
Lorsque vous souhaitez déplacer un objet ou une entité dans le temps, par exemple, si vous itérez avec une instruction for
ou while
, ** la vitesse de chaque image dépend des performances de l'ordinateur **, ce qui est vrai. Dans un sens, on ne peut pas l'appeler «temps réel».
Difficile à expliquer. Je suis désolé si c'est difficile à comprendre.
Le mouvement non naturel est probablement dû au fait que ** la vitesse du joueur est constante ** et ** ne glisse pas **. Même si vous donnez un coup de pied dans une boîte en carton, cela ne s'arrête généralement pas avec «Kyu!» À moins que ce ne soit un endroit où la force de frottement fonctionne.
** DeltaTime
** appelé " dt (DeltaTime) " est la clé pour améliorer le mouvement du joueur.
Le delta time
représente ** le nombre de secondes écoulées entre le traitement de la dernière image et l'exécution de cette image **.
Plus précisément, nous utiliserons le temps delta pour présenter le concept de ** `` Inertie '' ** aux joueurs.
La fonction ʻon_key_press () transmet des informations au joueur depuis le moment où le bouton du clavier est enfoncé jusqu'à ce qu'il soit relâché, donc si une valeur est définie comme **
n** pendant que la touche est enfoncée, alors **
n Il augmente proportionnellement au temps que vous maintenez enfoncé `**.
Dans le programme, nous avons défini n
comme velocity_x
et velocity_z
, respectivement.
* Velocity = speed </ font>
#Événement de mise à jour du joueur
def update(self, dt, keys):
if keys[key.W]:#front
self.position[0] += dx #Traitement normal des déplacements
self.position[2] -= dz #Traitement normal des déplacements
self.velocity_x += dt * 10 #dt est une très petite valeur donc multipliez par 10
À ce rythme, la «vitesse» augmentera indéfiniment proportionnellement à la durée pendant laquelle vous appuyez dessus. Par conséquent, la valeur de "vitesse" est réduite par une certaine règle au moment de "mise à jour".
Réglez ensuite la vitesse maximale et vérifiez si la valeur est négative ou dépasse la vitesse maximale. Si la valeur est négative, elle revient à «0», et si elle dépasse la vitesse maximale, elle revient à la vitesse maximale.
player.update()Dans la fonction
#Soustrayez la valeur actuelle divisée par 50
self.velocity_x -= self.velocity_x / 50
self.velocity_z -= self.velocity_z / 50
#S'il s'agit d'une valeur négative, il sera renvoyé à 0.
if self.velocity_x < 0: self.velocity_x = 0
if self.velocity_z < 0: self.velocity_z = 0
max_inertia_speed = 0.2 #Glissement proportionnel à la grandeur de la valeur
#Si la vitesse maximale est dépassée, revenir à la vitesse maximale
if self.velocity_x > max_inertia_speed: self.velocity_x = max_inertia_speed
if self.velocity_z > max_inertia_speed: self.velocity_z = max_inertia_speed
#Une inertie qui fonctionne pour avancer
self.position[0] += self.velocity_x * dx #Ajouter aux coordonnées actuelles en tenant compte de la rotation
self.position[2] -= self.velocity_z * dz #Soustraire des coordonnées actuelles, en tenant compte de la rotation
Si vous l'essayez, vous pouvez voir qu'il a l'inertie comme indiqué ci-dessous. Vous pouvez également voir que la «Vitesse» dans la fenêtre de débogage supérieure gauche diminue proportionnellement au temps. Avec cela, la contre-nature a finalement disparu. J'ai pu reproduire le mouvement original de Minecraft.
Il ne prend pas en charge le mouvement diagonal.
C'est le plus grand défi pour réaliser Minecraft sans utiliser d'outils tels que Unity. Si tous les blocs sont «1.0» × «1.0», il peut être implémenté relativement facilement (cela semble possible), mais en considérant qu'un jugement de collision personnalisé (par exemple, un bloc d'escalier ou une porte) est implémenté pour chaque bloc. J'ai l'impression que c'est un très grand mur.
Dans Minecraft, ** ʻAABB (Axis-Aligned Bounding Box) `** vous permet de définir librement le jugement de collision de bloc et le cadre de délimitation apparent. Je veux également l'implémenter en Python. Est-ce dur pour la pierre? Personnellement, je ne peux que penser à décompiler Minecraft et à lire le code source obscurci avec des tripes.
Si quelqu'un est familier avec le jugement de collision, veuillez nous donner quelques conseils dans la section commentaires.
La situation actuelle est comme celle-ci. * Le gif n'a pas pu être téléchargé en raison de la taille de la vidéo. </ font> Si le jugement de collision réussit, il ne vous reste plus qu'à coder.
Recommended Posts