Qu'y a-t-il dans un moteur de physique des projectiles?

Dans cet article, nous examinerons l'utilisation de la physique pour simuler les effets de projectiles dans des jeux comme Angry Birds. Nous examinerons les bases de l'utilisation de la physique 2D dans l'espace du monde du jeu, telles que la création de corps et l'application d'impulsions et de forces..

Moteurs de physique

Pourquoi utiliser un moteur physique? Que fait-il réellement? 

Un moteur physique nous aide à faire deux choses très importantes pour notre jeu:

  1. Détecter collisions entre nos objets dans le jeu.
  2. Simuler les forces et le mouvement résultant de nos objets de ces collisions…

Détection de collision: Les jeux ne seraient pas très amusants si votre personnage tombait à travers le sol avant de pouvoir sauter, ou si, lorsque vous frappiez un ennemi avec le pied, vous tombiez de plein fouet. La détection de collision à l'aide d'un moteur physique permet une écoute de contact très précise et permet de simuler les interactions entre objets les forces.

Simulation de force:Après une collision, que devrait-il se passer? La logique du jeu peut être appelée, vous pouvez rebondir, l'autre objet du jeu peut rebondir, ou vous pouvez simplement ne plus vous déplacer. Tout cela est géré en coulisse, en utilisant les forces calculées du moteur. Mais les forces ne sont pas limitées au contact; d'autres forces, telles que la gravité et les impulsions, peuvent se produire sans que les objets ne se touchent. Les forces affectent les actions dans le jeu et le mouvement des objets, des personnages et même de l'espace-monde lui-même.

.

Nous allons regarder Comment moteurs de physique fonctionnent sous peu, mais d'abord, regardons quoi les moteurs que vous voudrez peut-être utiliser, et Pourquoi vous pouvez décider de les utiliser, en fonction de vos besoins.

Choisir votre moteur

Lorsque vous commencerez à penser à l’utilisation de la physique dans votre jeu, vous devrez décider de la façon dont vous souhaitez aborder le problème et des besoins de votre jeu en termes de simulation. Vous avez deux options pour utiliser la physique:

  1. Utiliser un moteur physique existant.
  2. Créer une simulation physique personnalisée

Utilisation d'un moteur physique existant

Plusieurs excellentes options existent pour les moteurs physiques prédéfinis et prêts à l’emploi. Box2D est l’un des choix les plus populaires pour les jeux 2D. Il s'agit d'un moteur écrit en C ++ natif, mais qui possède des wrappers, des ports et des extensions qui lui permettent d'être utilisé dans presque toutes les plates-formes 2D. Un autre choix populaire est Chipmunk 2D, qui est utilisé dans plusieurs moteurs de jeu classiques, tels que Cocos2D..

Création d'un moteur personnalisé

Dans certains jeux, l'utilisation d'un moteur prédéfini n'est pas nécessairement le choix optimal. L'utilisation d'un moteur physique peut entraîner des frais généraux inutiles lorsque toutes ses fonctions ne sont pas nécessaires. Dans des cas comme de simples jeux de plateforme ou des jeux de type casse-briques (pour lesquels vous n'avez pas besoin de la détection de collision au pixel près ou de certaines des autres fonctionnalités d'un moteur), il peut utiliser inutilement des ressources qui pourraient être mieux utilisées ailleurs. 

Construire votre propre moteur peut vous donner plus de flexibilité par rapport au produit final, mais cela peut aussi compliquer les choses si vous avez affaire à plusieurs instances de personnages et d'objets..

La boucle du jeu

Avant de discuter des propriétés et des détails d’une simulation physique, voyons comment elle est appelée dans la boucle de votre scène de jeu..

La boucle de jeu typique se déroulera comme suit pour chaque image, dans l'ordre:

  1. Contribution
  2. Mise à jour / logique de jeu
  3. Simuler la physique du jeu
  4. Écran de rendu / scène

Cela signifie que le calcul de la physique résultante est la dernière tâche effectuée dans la boucle avant la mise à jour de l'écran. Cela a du sens, car le but de la simulation est de réagir à ce qui s'est passé dans l'espace-monde du jeu.. 

Notez que cette image montre que la physique est simulée à chaque image de votre boucle de jeu. Cela peut entraîner des frais importants si votre simulation devient trop volumineuse ou compliquée. Pour cette raison, il est préférable de limiter la gestion des jeux et des appels à la simulation et à ses auditeurs.. 

Physique à taux fixe ou physique dépendant du cadre

Il est maintenant logique de discuter de deux méthodes différentes d’interrogation de la simulation physique: des taux fixes par rapport aux taux dépendants des trames. Prendre en compte (void) update: méthode cohérente dans la plupart des boucles de jeu. Cette boucle est appelée une fois par image de la scène du jeu. Si votre méthode "simuler la physique" est appelée depuis (void) update:, votre physique du monde de jeu va dépendre de votre taux de trame, et cela pouvez conduire à des simulations saccadées et irréalistes. Sous iOS, cet effet est atténué par l'utilisation de la usePreciseCollisionDetection Propriété booléenne, mais qu'en est-il des autres moteurs? 

Considérez le segment de code suivant:

 CFTimeInterval timeSinceLast = currentTime - self.lastUpdateTimeInterval; self.lastUpdateTimeInterval = currentTime; si (timeSinceLast> 1) timeSinceLast = 1.0 / 60.0; 

Ce code est conçu pour compenser les problèmes liés à la valeur delta pour le temps. Pensez à une situation dans laquelle vous jouez au jeu sur votre téléphone et avez reçu un appel: cela vous aiderait à réinitialiser votre delta au 1/60 attendu (pour un jeu à 60 ips).. 

C’est en fait la première étape d’une discussion sur le découplage de la simulation physique du pas de temps de la (void) update: méthode. Un intervalle de temps modifié contribuerait certainement à un appel de simulation physique plus stable, mais il ne convient pas à toutes les situations. Pour ce faire, nous aurions besoin de réellement retirer appelez la simulation physique à partir de la boucle de rendu du jeu et créez un cycle fixe dans lequel elle pourrait s’exécuter. Par exemple; si votre jeu doit fonctionner à 60 ips, vous réglez la physique pour simuler 60 fois par seconde. Ce découplage élimine tout problème de rendu provoquant des retours agités dans votre simulation physique..

En bref, soyez consciencieux dans votre mise en œuvre de la physique. Si vous utilisez un moteur dans un environnement où vous taxez les ressources système, envisagez une simulation physique à étapes fixes pour maintenir l'équité et la fidélité..

Du sprite au corps physique

UNE lutin est une image rendue à l'écran de votre jeu. Une image-objet n'a pas de propriétés par défaut dans une simulation physique. Vous pouvez "simuler" certains comportements d'un monde physique en utilisant les propriétés d'un sprite telles qu'un cadre de sélection et un appel d'intersection, mais vous devez ensuite écrire vous-même toute la logique résultante. Ne serait-il pas préférable que le jeu puisse gérer tout cela pour nous??

Dans ces extraits, nous créons un sprite:

 SKSpriteNode * sprite = [SKSpriteNode spriteNodeWithImageNamed: @ "image"]; sprite.position = location; [auto addChild: sprite];

… Et appelle une collision entre deux sprites:

-(void) update: (CFTimeInterval) currentTime / * Appelé avant le rendu de chaque image * / if (CGRectIntersectsRect (sprite1.frame, sprite2.frame)) // faire quelque chose

Formes du corps

La physique corps sont des formes "simples" qui définissent la taille approximative et la forme de votre sprite, ou peut-être définissent une zone active de votre sprite. Considérer ce qui suit:

Un corps physique n'est pas prédéfini par l'image de votre sprite et est généralement invisible dans le jeu. Vous créez la forme de manière dynamique, en appelant souvent une méthode pour dessiner la forme qui constituera le corps, ou en utilisant un programme pour vous aider à dessiner et à définir le corps. Vous attachez ensuite le corps à l’image-objet et accédez aux effets simulés et aux propriétés affectées à ce corps..

Vous pouvez avoir plusieurs corps physiques liés à un seul sprite. Prenons, par exemple, un esprit de héros portant une épée. Il serait logique de créer un corps pour le personnage du héros et un autre pour l’épée qu’il porte. Cela vous permettrait de créer une logique de jeu basée sur des collisions entre différents corps.. 

En pseudo-code, la logique ressemblerait à ceci:

// logique physique - (void) physicsCollisionDidOccur commutateur (masque de bits de collision) cas (Player || Sword): // ne rien faire; Pause; case (Player || Enemy): // ouch !!; Pause; case (Sword || Enemy): // fait des dégâts !!; Pause; default: // ne fait rien; Pause; 

Relier le corps physique au sprite

Pensez à la situation d'un jeu de l'espace où vous avez un vaisseau héros et un navire ennemi:

Vous voudrez probablement rendre le corps physique du joueur un peu plus petit que l’image de base du sprite pour deux raisons:

Collision visuelle améliorée: Lorsqu'un joueur entre en collision avec un objet dans votre jeu, en créant ce corps physique plus petit, les images des images-objets se chevauchent temporairement au point de contact, ce qui donne un bel aspect visuel. (Suite à ce point: lorsque vous tracez des valeurs z, gardez le personnage de votre joueur à l'avant de la hiérarchie de la scène.)

L'équité perçue par l'utilisateur: Pour que votre jeu soit "juste" pour le joueur, gardez le corps que vous pouvez entrer en collision limité au corps de l'objet et éloignez-vous des protubérances superflues telles que l'aileron arrière de l'image ci-dessus. De cette façon, il n'y aura pas de "hits à bas prix" pour ennuyer les joueurs de votre jeu. À l'inverse, vous souhaitez généralement que le corps physique ennemi ait au moins la taille de l'image de base; Si nous donnons à notre héros de l'espace un laser pour tirer sur son ennemi, un corps d'ennemi légèrement trop grand rend plus raisonnable l'attrait de notre joueur. Pensez également à cette même approche pour les tuiles d’un jeu de plateforme ou de casse-tête qui nécessite que votre joueur passe d’une plateforme à l’autre. Les joueurs sont habitués à un peu de "grâce" dans ces types de jeux; étendre le corps physique un peu vous aidera à garder votre jeu raisonnablement "juste".

Contraintes de moteur 2D typiques

Il existe deux principaux types d'organismes de physique:

  1. Corps à base de bords
  2. Corps basés sur le volume

Un corps basé sur une arête est une ligne statique immobile qui crée une limite pour la collision avec d'autres corps. Il a un espace négatif en son sein qui n'a d'effet sur aucun corps. Une excellente application de cela serait de créer une frontière autour de votre écran pour contenir tous les corps dans.

Un corps basé sur le volume a un volume et une masse et peut être dynamique ou statique. Parce que ces corps ont une masse importante, les objets rebondissent sur eux et peuvent être affectés par des contacts de force. Les corps basés sur le volume peuvent être de quatre formes principales:

  1. Cercle
  2. Rectangle
  3. Chaîne
  4. Polygone complexe

L'utilisation de corps dans votre moteur physique 2D typique présente certaines contraintes. Voici les deux principales limitations:

Corps de physique convexe 

Si une forme est convexe, cela signifie qu'aucun angle intérieur n'est inférieur à 180 degrés. 

Pour être clair, il peut être possible de faire des simulations physiques sur des formes concaves, mais le coût de traitement est tellement élevé qu’il n’est tout simplement pas réaliste pour la 2D, en particulier lorsqu’il est exécuté sur un appareil de poche ou moins puissant. Concave-comme formes peuvent être construites en reliant deux formes convexes en utilisant quelque chose appelé un Joint statique. Les joints sont une autre fonctionnalité intéressante disponible avec les moteurs 2D, mais sortent du cadre de cette discussion..

Corps de physique rigides

Quand une balle frappe un mur, dans le monde "réel", cela se produit:

De votre personnage lutin peut subir ce type de transformation, mais son corps physique ne peux pas. Vous pouvez contrôler certaines propriétés du corps afin d’affecter son "gonflement", mais il ne peut pas réellement avoir une forme mutable. Ceci est connu comme un Corps rigide, ce qui signifie que le corps lui-même ne peut être ni déformé ni écrasé.

Propriétés d'un corps physique

Voyons rapidement quelles sont certaines des propriétés les plus utiles disponibles dans un corps de physique typique:

  1. Restitution est une mesure de la "rebond" d'un objet. Plus formellement, c'est la mesure de la quantité d'énergie qu'un objet retient après avoir heurté un autre objet..
  2. Densité est la mesure de la "lourdeur" d'un objet. Il est utilisé comme une qualité relative. Par exemple, une pierre serait plus dense qu'une balle. Ainsi, quand la balle frappe la pierre, elle sera plus durement touchée..
  3. Friction est la mesure de la "glissement" d'un objet. Ceci est utilisé lorsqu'un objet glisse le long d'un autre et détermine le temps nécessaire à son arrêt..
  4. Si un corps est dynamique, alors les forces qui lui sont imposées par le monde et d’autres objets auront un effet; si c'est un statique corps, alors ils ne seront pas.
  5. Rotation est généralement une variable booléenne pouvant être définie sur un corps physique. Dans certains cas, vous voudrez peut-être limiter un corps et ne pas lui permettre de pivoter, mais vous souhaitez que des forces soient toujours appliquées à cet objet..

La plupart des moteurs ont plus de propriétés disponibles que cela, mais pour les besoins de cette discussion, elles seront suffisantes pour commencer.

Mouvement et Momentum


Dans un monde de physique simulé, les corps sont déplacés par l'application de les forces et impulsions.

Les forces: Les forces générales affectent généralement les corps plus progressivement que les impulsions. Il s'agit d'une force constante appliquée sur une unité de temps (comme la gravité ou un moteur)..

Impulsions (forces d'impulsion): Les impulsions sont des ajustements immédiatement appliqués à la quantité de mouvement du corps. Les impulsions sont généralement appliquées à une simulation basée sur les entrées de l'utilisateur.

Quoi ensuite?

Maintenant que vous avez compris la théorie, le meilleur moyen de renforcer votre compréhension des moteurs de la physique des projectiles est de vous en construire un vous-même. Ensuite, je décomposerai le code d'un jeu basé sur la physique que j'ai écrit pour vous permettre de voir exactement comment il fonctionne.!