JeuWeb - Crée ton jeu par navigateur
Conseil utilisation de classe - 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 : Conseil utilisation de classe (/showthread.php?tid=4287)

Pages : 1 2 3 4 5


Conseil utilisation de classe - R-transat - 23-08-2009

Bonsoir à tous,

Pour tout début d'un projet il faut un commencement, et je commence doucement en réfléchissant aux classes.

Donc je vous explique, lors de l'inscription d'un membre je vais lui laisser le choix de choisir ça "classe" (c'est-à-dire soldat, etc) avec une balise select. Donc je pense créer une classe Personnage ou il y aurai plusieurs aptitudes et selon la classe que le joueur aura choisi faire en sorte que certaines aptitudes soit plus élevé que d'autres, voici un exemple :

Code PHP :
<?php
class Personnage
{
private
$sante;
private
$puissance;
private
$technique;
private
$resistance;
private
$discretion;
private
$precision;

//Helghast
private $helghast_soldat;
private
$helghast_infirmier;
private
$helghast_sapeur;
private
$helghast_tacticien;
private
$helghast_commando;
private
$helghast_saboteur;
private
$helghast_eclaireur;

//ISA
private $isa_soldat;
private
$isa_infirmier;
private
$isa_sapeur;
private
$isa_tacticien;
private
$isa_commando;
private
$isa_saboteur;
private
$isa_eclaireur;

}
?>

Pour ceux qui connaisse, il s'agit du jeu Killzone mais ça n'a pas d'importance ici.

Donc voila mes questions :
Est-ce mieux d'utiliser une classe pour chaque personnage ?
Est-ce mieux d'utiliser une classe ou tout les personnages seront présent et faire les compétences (santé, etc) à part ? (comme sur le code plus haut).
Et au niveau de la base de donnée, ça se passera comment ? (un champ pour la santé, précision, etc ... et avec la balise select j'inscris dans la base de donnée le type de personnage que c'est ?)

Merci d'avance. Je me demande quelle est la meilleure solution pour la création du personnage.


RE: Conseil utilisation de classe - guile - 23-08-2009

A ce que je vois, et pour partir à fond dans le truc, et même s'il n'est pas forcément recommandé de le faire, je peux t'inviter à faire une classe Personnage avec des attributs protected (et non pas private) et contenant les compétences globales à tous les types de personnages.
Ensuite, tu dérives (class Helghast extends Personnage) cette classe en différentes classes spéciales pour helghast, isa, etc. qui auront les compétences spéciales.

Commencer par de l'objet en programmation n'est des plus aisé, mais c'est très bien de démarrer un projet en objet. Ainsi il devient aisé par la suite de le faire évoluer.
Les classes dérivées ne sont pas la chose la plus recommandées, mais ça t'apprendra des choses.

Enfin, je ne suis pas sûr de mon analyse sur ton "bout" de code, mais je pense que tu devrais d'abord "écrire" ton système de jeu. Ca aide beaucoup quand il s'agit de concevoir un projet.


RE: Conseil utilisation de classe - R-transat - 23-08-2009

Merci de ta réponse ^^
Je commence le projet en objet pour ne pas devoir le réécrire plus tard. Et je connais quand même le PHP de base.
Quelle est la différence entre private et protected ?

Donc pour résumer, la classe Personnage contiendra les variables des aptitudes et ensuite je crée une classe heghast et isa que j'hérite de la classe Personnage pour utiliser les aptitudes de ces type de personnages ?

Je renomerai même la classe Personnage en Aptitudes pour plus de clarté ^^

Est ce que cela est juste :

Code PHP :
<?php
class Helghast extends Aptitudes
{
protected
$type = array('soldat', 'infirmier', 'sapeur', 'tatcticien', 'commando', 'saboteur', 'eclaireur');

public function
creationPersonnage($type)
{

}
}
?>

Je voudrais en faite récupérer la futur variable POST de la balise select dans l'argument de creationPersonnage... pour justement créer le type de personnage que l'utilisateur aura choisi lors de l'inscription.


RE: Conseil utilisation de classe - Argorate - 24-08-2009

Pourquoi ne tout simplement utiliser l'un des piliers de la POO?
Tu fais de l'héritage.

Une classe personnage avec chaque classe(soldat, commendo...) qui en découle?

Ensuite pour private/protected, c'est justement en rapport avec l'héritage.

private <=> accessible que depuis la classe
protected <=> accessible que depuis la classe OU les classes qui héritent de celle-ci.


RE: Conseil utilisation de classe - R-transat - 24-08-2009

J'ai essayé de faire quelque chose mais sans succès...

J'ai une class :
Code PHP :
<?php
class Helghast
{
protected
$type = array('soldat', 'infirmier', 'sapeur', 'tatcticien', 'commando', 'saboteur', 'eclaireur');

public function
creationPersonnage($type)
{
echo
'Vous êtes un '.$type;
}
}
?>

et un fichier index.php
Code PHP :
<?php

require 'class/Helghast.class.php';

$perso = new Helghast();
$perso->creationPersonnage('saboteur');
?>

Mais si je met $perso->creationPersonnage(3); ou $perso->creationPersonnage('autre');
Ca m'affiche Vous êtes un 3 ou Vous êtes un autre...
Comment régler pour que l'argument soit par rapport au tableau $type ?

Quand tu dis "Une classe personnage avec chaque classe(soldat, commendo...) qui en découle?"
Donc j'aurai :
Code PHP :
<?php
class Personnages
{
protected
$sante;
protected
$puissance;
protected
$technique;
protected
$resistance;
protected
$discretion;
protected
$precision;
}
?>
et
Code PHP :
<?php
class Helghast extends Personnages
{
protected
$type = array('soldat', 'infirmier', 'sapeur', 'tatcticien', 'commando', 'saboteur', 'eclaireur');

public function
creationPersonnage($type)
{
echo
'Vous êtes un '.$type;
}
}
?>

C'est bien ça ?


RE: Conseil utilisation de classe - Argorate - 24-08-2009

Il ne faut pas mettre protected dans la classe-fille (en l'occurence: Helghast)

Mais après c'est a toi de voir, ce que tes classes doivent permettre de faire.

J'espère que tu n'as pas oublier les constructeurs?! et évidament la premiere instruction du constructeur de la classe-fille appel celui de a classe-mere!?

PS: tu n'oublies pas non plus d'inclure la classe personnage de base? car je ne vois que: "require 'class/Helghast.class.php';"...?


RE: Conseil utilisation de classe - R-transat - 24-08-2009




RE: Conseil utilisation de classe - Argorate - 24-08-2009

http://www.siteduzero.com/tutoriel-3-147180-poo-programmez-oo-en-php.html

Une piste pour t'aider? tu m'excuseras, mais je ne peux pas te refaire tout le cours de POO^^

PS: pour le constructeur: http://www.siteduzero.com/tutoriel-3-147160-utiliser-la-classe.html#ss_part_3

EDIT: tu es sur d'avoir (ou d'inclure) ta classe Helghast dans Personnages.class.php?


RE: Conseil utilisation de classe - R-transat - 24-08-2009

Bah tout est là (index.php) j'inclue les deux classes:
require 'class/Personnages.class.php';
require 'class/Helghast.class.php';

J'ai déjà été voir sur le site du zéro, et sur ce forum un admin m'a dit qu'il y a des habitudes à ne pas prendre.


RE: Conseil utilisation de classe - Sephi-Chan - 24-08-2009

Un exemple avant de partir bosser.
Je te conseille l'anglais pour faciliter le nommage.


class Character {

// Les caractéristiques
protected $_health;
protected $_strength;
// ...

// Contient une chaîne genre Soldier. C'est le nom de la classe fille à utiliser.
protected $_type;

/**
* Returne un tableau d'object Personnage (ou une de ses sous-classes)
* en recherchant par le nom.
*/
public static function find_by_name(){
$users = array();

/**
* Requête à base de données qui récupère un personnage.
* J'admet que $db existe déjà et que tu utilises PDO.
*/
$sql = 'SELECT * FROM characters ORDER BY BET';
$resource = $db->prepare($sql);
$resource->execute();
while($row = $resource->fetch(PDO::FETCH_OBJ)){

/**
* Là, il convient de faire un peu de magie : on va générer un appel vers
* la classe fille. Ainsi, si type était Soldier, ça va instancier un objet
* Soldier, sur lequel tu pourras appeler toutes les méthodes de la classe
* Character, puisque Soldier en hérite.
*/
$user = new $row->type;
$user->setName($row->name);
$user->setStrength($row->strength);

$users[] = $user;
}
return $users;
}

/**
* Les getChose et setChose, comme je t'ai déjà montré.
*/

/**
* Retourne la liste de tes classes.
*/
public function getAllowedTypes(){
$allowed_types = array("Soldier", "Medic");
return $allowed_types;
}

public function getType(){
return $this->_type;
}

public function setType($type){
$allowed_types = $this->getAllowedTypes();
if(in_array($type, $allowed_types)){
$this->_type = $type
}
else {
throw new Exception("Cette classe n'existe pas.");
}
}

}


class Soldier extends Character {
/**
* Ce que tu veux
*/
}