Apprêt
Dans certains jeux, si vous frappez un ennemi, il sautera des dégâts internes de la voiture de l'ennemi
Ce mécanisme de dégâts rend la "barre de sang" cachée dans un endroit plus profond qui n'est pas facile à découvrir par les joueurs. Il améliore également la jouabilité et l'authenticité du jeu, impose des exigences plus élevées pour la précision des opérations du joueur et ajoute beaucoup de magie scène
Pouvons-nous obtenir cet effet dans Scratch ?
Explication détaillée
Prenons un char comme exemple, sa structure principale interne a probablement : moteur, râtelier à munitions, membre, bloc de culasse (et plus)
Commencer par le principe de jugement
D'une manière générale, quand on pense à une pure collision de données, on pense à calculer la distance entre deux points pour construire une boîte de collision circulaire :
Bien sûr, vous pouvez également mettre les deux côtés au carré en même temps, puis comparer le carré de la distance, éliminant ainsi le besoin de l'opération racine carrée.
Si la distance de Manhattan est utilisée, une boîte de collision carrée avec une longueur diagonale de 2d et une rotation de 45 degrés par rapport à l'axe x sera formée.
Cela évite la multiplication
Ensuite, si nous suivons cette ligne de pensée, nous pouvons créer une liste pour stocker les coordonnées xy de chaque composant par rapport à la carrosserie de la voiture
À ce moment, lorsque l'obus frappe la carrosserie de la voiture, le calcul des dommages est effectué et le flux de code est à peu près le suivant :
"
Répétez (étapes de mouvement de boulet de canon) fois {
] parcourent la liste des modules, chaque élément est défini sur a[n]{
]] Déterminer si l'obus touche un[n]
]} déplacer (étape)
}
''
Évidemment, la complexité temporelle de cette méthode est O(n²) , ce qui n'est pas assez rapide
Alors, quelle est la meilleure façon ?
Allons droit au but!
méthode de la grille
La puissance de calcul de Scratch est limitée, nous pouvons abstraire et brouiller la structure interne du réservoir dans une grille, et chaque grille est remplie d'un module
Par exemple:
Corps:
armure | armure | armure |
---|---|---|
piste | conducteur | piste |
piste | porte-munitions | piste |
piste | moteur | piste |
piste | moteur | piste |
tourelle:
armure | bloc de culasse | armure |
---|---|---|
Longueur de la voiture | bloc de culasse | canonnier |
porte-munitions | bloc de culasse | porte-munitions |
De cette façon, nous pouvons effectuer des calculs simples sur les coordonnées de la coque par rapport à la carrosserie de la voiture pour calculer dans quelle grille elle se trouve
(Le code spécifique peut être exploré par vous-même)
Ensuite, le code de calcul des dommages à ce moment est le suivant :
'''
Répétez (étapes de mouvement de boulet de canon) fois {
] Calculer la grille où se trouve la coque
] Module pour juger du coup d'obus
] déplacer (taille du pas)
}
'''
Bien sûr, cette méthode nécessite une taille de pas appropriée (généralement approximativement égale à la longueur du côté de la grille)
Évidemment, la complexité temporelle de cette méthode est O(n), et l'augmentation du nombre total de grilles a peu d'effet sur la vitesse d'exécution du code.
Ensuite, le problème de la méthode de détermination a été résolu, et le problème suivant est de savoir comment convertir les coordonnées absolues des coques en coordonnées relatives à la carrosserie du véhicule
Il peut être résolu avec la formule de l'axe de rotation :
(Notez que θ ici est l'angle de rotation dans le sens antihoraire à partir de la direction positive de l'axe x, et la direction dans sc est l'angle de rotation dans le sens horaire à partir de la direction positive de l'axe y, c'est-à-dire la formule angle=90 direction °-sc)
Bien sûr, si vous savez que la formule de transformation triangulaire peut être simplifiée, je ne le préciserai pas ici
En fin de compte, il vous suffit de les combiner, d'ajouter une interface graphique pour refléter les résultats des dégâts, et vous pouvez y arriver !