[# 3] Créez Minecraft avec Python. -Amélioration du mouvement du joueur (concept d'inertie) et jugement de collision-

Part of pictures, articles, images on this page are copyrighted by Mojang AB.

minecraft.png

Aperçu

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-" **

Que faire cette fois

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.

Mouvement de joueur amélioré

sq6py-82p4x.gif 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. bo5ie-4w21m.gif

Pourquoi le mouvement n'est-il pas naturel?

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.

Solution

** 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. p8r6m-2cy1g.gif Avec cela, la contre-nature a finalement disparu. J'ai pu reproduire le mouvement original de Minecraft.

problème

Il ne prend pas en charge le mouvement diagonal.

Mise en œuvre du jugement de collision

p4xs6-53ohi.gif 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. image.png

Continuer

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