Comment faire le plein avec le moteur de physique Corona SDK Partie 1

Vue d'ensemble

Tout le monde aime un bon jeu de physique, mais avouons-le: c'est beaucoup plus amusant quand on fait sauter des trucs! Ce tutoriel va vous montrer comment utiliser le moteur physique Corona pour créer des explosions dans votre jeu..

Installer

Comme un peu de gestion, commençons par créer un fichier build.settings avec le code suivant:

 settings = orientation = default = "landscapeRight", pris en charge = "landscapeLeft", "landscapeRight"

Les détails derrière toutes les options de ce fichier sont au-delà de la portée de ce didacticiel. Les paramètres ci-dessus forceront l'orientation du périphérique mobile en mode paysage ou horizontal. Comme nous n’avons qu’un seul ensemble de graphiques, forcer l’orientation paysage simplifiera la tâche..

La physique

Ensuite, nous allons commencer par configurer notre moteur physique dans notre fichier main.lua:

 physics local = require ("physics") physics.start () display.setStatusBar (display.HiddenStatusBar)

Facile non? Corona est génial! Dans cette section, nous avons également inclus une ligne pour masquer la barre d'état. Cela nous permet de prendre en charge la totalité de l'écran de l'appareil mobile sans aucun composant natif.

Graphique

Maintenant que les bases sont terminées, ajoutons un joli arrière-plan et centrons sa position par rapport au centre de l'appareil mobile:

 local background = display.newImage ("bricks.png", 0, 0, true) background.x = display.contentWidth / 2 background.y = display.contentHeight / 2

Dans le code ci-dessus, nous ajoutons une image d'arrière-plan à la scène avec la méthode display.newImage. Sa position initiale dans le coin supérieur gauche est 0,0 comme indiqué par les 2ème et 3ème paramètres. Par défaut, Corona positionnera les images avec un point d'ancrage exactement au centre. Nous utilisons les méthodes x, y sur l'objet d'arrière-plan pour positionner le point d'ancrage de l'image au centre exact de l'écran..

Avant d'ajouter des objets dynamiques à l'écran, ajoutons un étage sur lequel ils peuvent s'asseoir:

 local floor = display.newImage ("floor.png", 0, 280, true) physics.addBody (floor, "statique", friction = 0.5)

Nous ajoutons une image comme pour l'arrière-plan, en la plaçant au bas de l'écran. L'objet de sol est ensuite ajouté à la scène en tant que corps physique "statique". "Statique" dans ce cas signifie que l'objet va interagir avec d'autres objets de physique sur l'écran mais ne sera pas affecté par la gravité ou par aucune force d'inertie provenant d'objets en mouvement.

Objets dynamiques

Notre prochaine étape sera de mettre en place un ensemble de caisses empilées de manière précaire qui ne demandent qu'à être secouées:

 caisses locales =  pour i = 1, 5 pour j = 1, 5 pour les caisses [i] = display.newImage ("crate.png", 140 + (i * 50), 220 - (j * 50)) physics.addBody (caisses [i], densité = 0.2, friction = 0.1, rebond = 0.5) fin fin

Le code ci-dessus peut paraître complexe au début, mais il est en réalité très simple. Nous avons parcouru deux boucles imbriquées pour créer un ensemble de caisses de 5 mètres de large et de 5 mètres de haut en incrémentant les valeurs x et y. Chacune de ces caisses est ajoutée à la scène en tant que corps "dynamique". "Dynamique", bien que ce ne soit pas spécifié dans le code, est le type par défaut pour tous les corps physiques. Nous avons ajouté quelques paramètres pour déterminer le comportement de l'objet lorsque des forces sont appliquées. La valeur de la densité pour chaque caisse sera importante ultérieurement lorsque nous déterminerons la force de notre explosion. Plus les objets sont denses, plus la force nécessaire pour les déplacer est importante. Tu veux essayer quelque chose d'amusant? Augmentez la valeur de rebond à 1,0 et observez ce qui se passe dans les caisses.

Poser la bombe

Phew! Prêt pour la partie amusante? Faisons sauter ces choses. Le principe sous-jacent à la création d'explosions est de déterminer l'épicentre d'une explosion et le rayon de l'explosion et d'affecter tous les objets qui en font partie. Pour cet exemple, l'épicentre de l'explosion sera déterminé par l'endroit où nous touchons l'écran. Commençons par ajouter ce comportement:

 cercle local = "" fonction locale setBomb (événement) if (event.phase == "a commencé"), puis cercle = display.newCircle (event.x, event.y, 80) circle.myName =? circle? cercle: setFillColor (0,0,0, 0) physics.addBody (cercle, "statique", isSensor = true) circle.collision = onLocalCollision cercle: addEventListener ("collision", cercle) termine si (event.phase = = "terminé") puis entourez: removeSelf () end end background: addEventListener ("touch", setBomb)

Ici, nous avons défini une méthode appelée setBomb qui génère un cercle invisible de rayon 80. Le cercle est positionné à l'endroit où l'utilisateur a touché l'écran. Le corps physique que nous ajoutons a un paramètre spécial appelé isSensor défini sur true. Les objets capteurs sont présents dans le moteur physique mais ne sont pas affectés par la gravité ni n’affectent les autres objets. Dans ce cas, nous utilisons un objet capteur simplement pour détecter les caisses qui le touchent. Le contact sera déterminé en écoutant les événements de collision entre les caisses et notre capteur. Toute caisse qui entre en collision avec notre capteur se trouve à l'intérieur du rayon de souffle et sera donc affectée par la force de l'explosion.

Kaboom!

La méthode suivante sera exécutée lors de la détection d'une collision entre un objet et le capteur créé dans le code ci-dessus..

* À titre d'information, la méthode suivante doit être définie dans le code avant la méthode setBomb ci-dessus. Pour des raisons de flux, nous l’avons placé plus tard dans le tutoriel..

 fonction locale onLocalCollision (self, event) if (event.phase == "commencé" et self.myName == "circle"), puis forcex locale = event.other.x-self.x locale forcey = event.other.y- self.y-20 if (forcex < 0) then forcex = 0-(80 + forcex)-12 else forcex = 80 - forcex+12 end event.other:applyForce( forcex, forcey, self.x, self.y ) end end

L'idée de base de cette méthode est d'appliquer une force sur tout objet qui est entré en collision avec notre cercle de capteurs. Nous avons créé deux variables appelées forcex et forcey. Nous utilisons la distance entre le centre de la caisse et le centre de notre cercle de capteurs pour déterminer la force de la force que nous appliquerons. En faisant cela, nous créons un moyen pour un homme pauvre de diminuer la force de l’explosion plus l’objet est éloigné de l’épicentre de l’explosion. Tous ces chiffres dépendent fortement des propriétés physiques des objets que nous explosons.

* Remarque: les forces sous forme de valeurs numériques sont beaucoup plus élevées que les propriétés de densité, de frottement et de rebond des objets. N'hésitez pas à jouer avec ces valeurs pour obtenir des résultats intéressants!

Conclusion

Et là nous l'avons. Ce tutoriel devrait fournir un excellent point de départ pour créer toutes sortes de jeux sympas comportant des explosions. Prenez le temps d'expérimenter les propriétés et les valeurs de toutes les variables de cet exercice..

Dans la partie II de ce didacticiel, nous ajouterons quelques cloches et sifflets supplémentaires au cadre d'explosion pour le rendre encore plus destructeur.!

Laissez des commentaires et laissez-moi savoir ce que vous pensez de la partie I.