JeuWeb - Crée ton jeu par navigateur
[Résolu] Classe Action Brainstorming - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] Classe Action Brainstorming (/showthread.php?tid=791)



[Résolu] Classe Action Brainstorming - Seren - 12-02-2007

Salut,

Avant d'aller plus loin dans le développement, je veux essayer de mettre en place une classe "action" qui me permettrait de gérer de façon similaire toutes les actions du jeu. Les attaques, les déplacements...

Je fais un poste pour vous présentez ce que je compte grossiérement faire , et savoir comment vous vous gérez toutes les actions possibles.

Pour l'instant j'en ai déduis que toutes les actions avaient en commun de necessiter un nombre de vérification avant d'être executé.

Type de vérification :
- Point d'action : vérifier que le personnage a assez de points d'action pour executer l'action. (toutes les actions)
- Endurance : Vérifie que le personnage a assez d'endurance. ( action physique)
- Portée : portée de l'arme et vérification si la cible est bien à portée ( pour une arme)
- Position : vérifie que la position est compatible avec l'action ( par exemple pour entrer dans un bâtiment il faut bien être devant)
- Alignement : vérifie que l'on peut faire une action sur une cible en fonction de son alignement (soin sur allié uniquement, attaquer un ennemi)
- Terrritoire : certains territoire peuvent permettre des actions spécifique
- Inventaire : vérifie que l'objet cible est bien dans l'inventaire ( poser un objet, donner un objet)
- propriétaire : vérifie que le propriétaire est bien le propriétaire de l'objet cible
- Ressource : vérifie que le personnage a suffisament de ressource pour effectuer une action (achat / vente)

Il y en a quelques autres mais c'est les principale auxquelles je pense.

A partir de là je compte créer une table ou un tableau statique qui comportera pour toutes les actions possibles par exemple pour l'action "poser un objet" on a pas besoin de vérifier la position ou l'alignement mais uniquement que la condition Inventaire est remplie.

Par exemple :
id | action | vérifications | cout en point d'action

Il y aura probablement deux ou trois classes.
Une pour les actions sans cible autre que le personnage. Par exemple "dormir"
Une pour les actions avec une cible genre attaquer, utiliser un objet, entrer dans un bâtiment.

L'objectif c'est de créer un système assez flexible pour pouvoir ajouter facilement des actions plutôt que de créer un script complexe associé à chaque actions.

Dans mon cas j'espère avoir des script action simple qui ressembleront à ça :
Code PHP :
<?php 
/**
* @file dormir.php
*/
$action = new action('dormir');

If (
$action->check == OK){
$action->do();
}



RE: Classe Action Brainstorming - joshua - 12-02-2007

je pense que tu devras dans ta classe action passer un autre parametre externe, qui est l'id du joueur.
Car cette classe action est dépendante du joueur. Après, savoir si il faut l'intérer dans joueur, je ne pense pas tu as bien raison.
Moi je fonctionne avec a chaque fois : une classe ****db_class.php et une autre **** class.php
ensuite j'ai ma classe ressource, ma classe planete, ma classe planete_ressource qui prend en entrée le nom de la ressource et de la planete.

Donc pour en revenir a tonpb, je ferais une classe joueur(defiit les joueurs), une classe action(définit les "classiques" des actions, non utilisable seule), et une classe action_joueur qui serait celle employée reellement pour définir les actions d'un joueur.


RE: Classe Action Brainstorming - gtsoul - 12-02-2007

J'ai une classe technique globale (=actions spéciales)
Elle gère la proximité et la disponibilité des personnages, ainsi qu'un template d'affichage

chaque technique possède ensuite les attributs suivants
_ bool offensif : est-ce que l'action peut faire du mal à la cible ? si oui préparer les ripostes
_ bool soi_meme : peut-on effectuer l'action sur soi-même
_ bool perso : peut-on effectuer l'action sur d'autres persos
_ bool monstre : peut-on effectuer l'action sur les monstres
_ string classe : nom de la classe à instancier

A partir de cela, je peux définir 50% du déroulement d'une action en éliminant les vérifications.
Je n'ai plus qu'a écrire une méthode effet() qui décrit le reste.
Ex pour une boule de feu :
bool offensif : true // bool soi_meme : false // bool perso : true // bool monstre : true p// string classe : BouleFeu.class

function effet()
{
$degats = mt_rand(1,$this->lanceur->intelligence);
$this->log .= $this->lanceur->nom.' lance une boule de feu sur '.$this->cible->nom;
$this->cible->setVie(-$degats);
$this->lanceur->setEnergie(-10);
}

Dans le cas présent, le template technique effectue les actions suivantes :
_ $this->lanceur possède la technique boule de feu
_ $this->cible est vivante et à proximité de $this->lanceur
_ on effectue la méthode effet
_ les méthodes setVie, setEnergie génére des logs (machin perd 5 pv) et gèrent les cas de mort
_ le template technique prend en charge la riposte automatique de la cible si elle est vivante
_ on écrit les logs et on recharge la page

Depuis peu, j'ai surchargé avec une méthode check() qui me renvoit un entier qui correspond à un résultat à appliquer.
-1 : on ne peut réaliser l'action
0 : on réalise l'action standard
1 : réussite critique etc ...


RE: Classe Action Brainstorming - Seren - 12-02-2007

Juste pour être certain de comprendre ta méthode, tu effectues les différentes vérifications au moment d'instancier cible et lanceur ?

Par exemple au moment tu instancies cible tu vérifie qu'elle est vivante et à portée ?

ça ressemble un peu à ce que j'ai envie de faire à la différence d'avoir une classe "action" monstrueuse qui gère toutes les actions, ici "technique" est un template et chaque action particulière à une classe dédiée qui implemente les effets. C'est sans doute plus lisible sur le long terme.


RE: Classe Action Brainstorming - gtsoul - 12-02-2007

monstrueuse, elle fait 300 lignes ...
Code PHP :
<?php 
Class Technique
{
var
$lanceur;
var
$cible;
var
$id;
....

function
Technique(id){...} //là on instancie l'action en tant que telle, sans parler des protagonistes, utiles pour les sorts de zone

function lancer($lanceur, $cible) // on effectue l'action
{
if(
$this->testDispo())
{
if(
$this->check()>=0)
$this->effet();
}

function
testDispo() //méthode de vérification globale
{
if(
getDistance($this->cible, $this->lanceur)<=$this->portee)
....
if(
$this->lanceur->disponible==1
....
}
}

ensuite je crée ma classe boule de feu
Code PHP :
<?php 
Class BouleFeu extends Technique {
function
effet(){} // effet de l'action

function check(){} //vérifications supplémentaires propres

}

A propos de l'affichage, tout dépend du contexte; car c'est lui et non la technique qui fabrique la vue.
Si le perso utilise boule de feu sur un monstre, on affiche le statut du monstre, idem pour un perso.
Si il utilise une compétence discrétion en plein air, on va afficher les environs
Si il utilise une compétence de langue pour lire un livre, on va afficher les détails de l'objet.

Les 2 gros cas d'utilisation de compétence sont vis-à-vis d'un autre pj et monstre. Je dispose une liste déroulante des actions possibles. La liste des actions possibles est obtenue via une recherche rapide dans la bdd (c'est à cela que servent les attributs communs aux techniques).
A côté de cela, le perso possède un grimoire qui recense les différentes techniques, avec leur description. Tu veux des screens ?

En 3h, j'ai implémenté 17 techniques (^_^ fier!!) et toutes différentes.


RE: Classe Action Brainstorming - Seren - 12-02-2007

Quand je parlais de truc monstrueux je parlais de ce que je voulais faire pas de ce que tu faisais Smile.

Mais j'aime bien ton approche. Je pense que je vais faire quelque chose de similaire.

- Une class "action" générique avec les tests de condition usuelles.
- Des classes qui héritent de "action" pour implémenter les effets et éventuellement des vérification supplémentaire.

J'aime surtout le fait d'avoir des vérifications supplémentaire parce que ça évite d'être coincé sur des cas spéciaux qui sont pas prévu dans la classe générique. C'est sûr ça en fait que je bloquais...

Merci.