2010-05-22 7 views
1

Je fais un jeu et j'essaie de décider quelle est la meilleure pratique pour échanger des dégâts entre deux objets sur l'écran. Les dommages devraient-ils être passés directement entre les deux objets ou devraient-ils passer par un moteur de jeu central qui décide des dégâts et des différents critères tels que le succès ou l'échec ou le montant distribué.où devrait aller la logique du jeu? Moteur de jeu ou classe de personnage

Donc, globalement, quelle est la meilleure pratique.

Répondre

4

Cela dépend en grande partie des règles du jeu. Cependant, il n'est pas inhabituel que plusieurs objets aient besoin de s'impliquer. Cependant, je déconseille de mettre du code de règles de jeu dans l'occurrence de MovieClip qui affiche l'objet; les garder en tant que pairs permet de séparer l'état du jeu et de le sauvegarder/relayer plus facilement.

Voici un exemple:

  • Acteur A initie une attaque. L'acteur A fournit une valeur de précision (jet de touche).
    • L'arme (ou les munitions, le cas échéant) fournit une valeur de dégâts de base (dégâts) et le type de dégâts.
    • Le type d'Arme détermine comment les capacités de l'Acteur A modifient le jet de touche et le jet de dégâts.
    • Les modificateurs de l'arme peuvent modifier les jets, ajouter des composants de dégâts supplémentaires, ou associer des effets de "frappe" à l'attaque.
  • À ce stade, il semble qu'il y ait une classe d'objet attaque formation, contenant les éléments suivants:
    • valeur de précision
    • Une collection de dommages typés (peut-être vide pour effet que les attaques)
    • Une collection d'effets supplémentaires (peut-être vide)
  • Maintenant, l'attaque atteint la cible.
    • Les effets spéciaux sur la cible qui se déclenchent en cas d'attaque peuvent se déclencher.
    • La cible peut avoir de nombreuses couches de défense - couverture, dissimulation, évasion, déviation, blocage, armure et armure naturelle, par exemple. Tout ou partie de ceux-ci peuvent contribuer à l'échec de l'attaque.
  • L'attaque se connecte.
    • Les effets spéciaux sur la cible qui se déclenchent lors de la frappe peuvent se déclencher.
    • La cible peut également avoir une capacité de réduction ou d'élimination des dégâts, telle qu'une armure suffisamment lourde pour absorber une partie d'une attaque, ou une immunité/résistance/faiblesse à un ou plusieurs types d'attaques spécifiques.
  • Les dommages réels peuvent maintenant être résolus. Cela peut être nul si l'attaque était précise mais inefficace.
    • Les effets spéciaux associés à l'attaque sont résolus.
      • Certains peuvent être soumis à des dommages, tels qu'un poison délivré par une blessure.
      • Certains peuvent être inconditionnels, tels qu'une rafale de désactivation.
    • Des effets spéciaux sur la cible qui se déclenchent lorsqu'ils sont endommagés, tels qu'une armure réactive ou des dommages "épines", peuvent se produire.
0

Mettez-le dans le moteur du jeu. Les objets sur l'écran représentent les vues et les contrôleurs dans votre modèle, le moteur (auquel appartient cette logique). Bien qu'il puisse être tentant de le placer directement du côté de la vue/du contrôleur, le code de votre jeu finira par se transformer en spaghetti une fois qu'il sera suffisamment grand.

2

Demandez au moteur de gérer tout le code redondant parmi les calculs d'endommagement pour chaque caractère. Les personnages seront forcés de faire le reste. Je ne sais pas grand chose sur le type de jeu que vous faites. Mais pour certains jeux, lorsque le moteur est dit que A attaque B, le code pourrait ressembler à:

//somewhere in your engine: 
damage = A.get_damage(B); 
trace (damage); // {damage:60, hit_chance = 0.8} 
B.send_damage(damage); 

Je crois qu'il est nécessaire dans la plupart des cas d'avoir B.send_damage() plutôt que le moteur contrôlant directement la santé attribut de B. AI ont tendance à être axée sur l'état. Il y aura probablement des variables qui sont exclusives à A ou B et qui affectent les dégâts (comme l'invincibilité), et (IMO) il vaut mieux que le moteur n'ait aucune idée de leur existence (ou vous aurez d'énormes blocs de commutation;

Vous voyez comment j'ai dû envoyer B comme argument dans A.get_damage()? Malheureusement, c'est souvent nécessaire dans une telle approche. Les dégâts/hit_chance de A peuvent être influencés par la distance de B par rapport à A.

Questions connexes