JeuWeb - Crée ton jeu par navigateur
Débuter mon code/projet tranquillement - 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 : Débuter mon code/projet tranquillement (/showthread.php?tid=4302)

Pages : 1 2


Débuter mon code/projet tranquillement - R-transat - 22-08-2009

Bonjour à tous,

Alors voila je vous explique un peu le commencement que je voudrais. Tout d'abord il s'agirait d'un système de jeu comme Ogame en essayant de le rendre différent.

Donc pour le moment je fais la zone d'inscription/connexion en ajoutant des ressources de bases pour commencer le jeu.

Je tiens à préciser que je commence par des petites pages pour ensuite quand elle fonctionneront de les intégrer dans le jeu.

Ensuite j'essaye de faire la gestion des ressources, donc j'ai fait une page avec un lien pour construire un bâtiment par exemple, et quand je clic dessus les ressources sont utilisé, donc je m'aide d'un tableau associatif comme array('Pierre' => '1000', 'Rubis' => '500') donc j'enlève des ressources lorsqu'un bâtiment est construit (si un tableau associatif n'est pas bon à prendre, dites le moi en me faisant part de vos idée). Et surtout j'aimerai que vous puissiez m'aider pour savoir comment gérer la gestion de niveau d'un bâtiment et pourquoi pas du membre (quand un certain nombre de bâtiment est construit on monte de niveau). Et quelle méthode utiliser pour les liens, par exemple sur la page construction.php j'ai différent lien pour construire les bâtiments, disons que je veuille construire un bâtiment normal pour tester, donc je clic sur le lien mais comment doit être le lien pour que la meilleur solution soit adopter, utiliser la méthode GET ? je vois déjà le bazarre que ca sera avec cette méthode, sinon une page différente ? mais pareil c'est vite le bazarre aussi. Donc quelle méthode utiliser pour gérer tout ça ?

Et bien sur la gestion du temps pour la construction d'un bâtiment ? Je me doute que ca sera javascript, je connais vraiment les bases de ce langage, donc si vous avez des bon liens pour que je voie cela de plus près et bien sur ensuite pourquoi pas jQuery...

Je voudrais bien me lancer dans l'ajax aussi mais est-ce difficile ?
Cela prend il beaucoup de temps ?
(idem, si vous avez des liens je suis preneur Wink )

Et une dernière question, l'utilisation d'un framework est elle conseillé, ou de la POO en général ? Bien sur c'est pareil je ne connais pas la POO...

Merci de votre lecture, et merci d'avance pour vos réponse.

PS : comme vous devez l'avoir compris mon projet n'est pas pour tout de suite mais j'irai à la vitesse ou mon niveau le permet.
Et bien sur toute méthode de structuration est bonne apprendre, je serai donc tout ouïe à vos messages.


RE: Débuter mon code/projet tranquillement - Sephi-Chan - 22-08-2009

Bonjour,

Concernant les coûts de tes bâtiments, je t'invite à intégrer ça dans la base de données plutôt qu'en dur dans ton code.

Concernant le niveau de tes joueurs, etc. Il s'agit simplement d'avoir un champ qui contient ce niveau dans la table des joueurs. Ensuite, à toi de voir sous quelles conditions tu fais monter le niveau d'un joueur.

Pour les bâtiments, c'est un peu spécial. Généralement, on stocke dans une table à part les différents bâtiments et ensuite, on associe un joueur à un bâtiment grâce à une table qui stock l'ID du bâtiment, l'ID du joueur et les informations propres à cette instance du bâtiment, par exemple le niveau. Ainsi, il est simple de savoir que le joueur Robert (d'id 7) possède un bâtiment Caserne (d'id 32) de niveau 4 et un bâtiment Café (d'id 21) de niveau 2.

Au sujet des liens vers la création vers les bâtiments, GET semble être la bonne méthode. Tu aurais ainsi des liens de la forme /build.php?id=32.

Enfin, pour la partie temporelle, ça ne se fait pas côté Javascript comme tu peux le penser. Javascript doit rester une façade. Je te conseille de stocker la date du lancement de la construction dans la table qui associe un joueur à un bâtiment. Ensuite, avec un daemon, un cron ou un script appelé quand le joueur revient sur la page, tu vérifies si le temps actuel est supérieur à la date de lancement de la construction à laquelle tu additionnes la durée de construction du bâtiment et comme ça tu sais si on bâtiment est fini ou non.

Enfin, pour le framework, je te conseille d'attendre de maîtriser mieux PHP et l'orienté objet. Et oui, la POO est un atout majeur dans le développement d'application complexes comme le sont les jeux. Ça rend ton code plus clair et facile à maintenir.

Quelques exemples des atouts de la POO dans un jeu :

Quand ton utilisateur effectue une action qui lui rapport de l'expérience, tu peux appeler sur l'objet User (qui le représente) la méthode addExperience(quantity), qui augmente sa quantité d'expérience et lui fait éventuellement gagner un niveau (en appelant la méthode levelUp(), bien sûr).

De même, pour les bâtiments, on peut admettre qu'un objet User possède une méthode getBuildings() qui renvoie un tableau d'objets Building.

Ainsi, quand on va sur la page de création d'un bâtiment (après avoir cliqué sur le lien vu plus haut Wink), tu instancie un objet Building (à partir de son ID). Bien sûr, si un tel bâtiment n'existe pas, le programme envoie une exception !

Sur cette page, tu peux vérifier que le joueur a assez de ressources en appelant sa méthode hasEnoughResourcesFor($building) (hélas, PHP ne permet pas le ? dans les noms de méthodes, dommage, ça rendrait le code source encore plus clair). Si la méthode renvoie true, alors tu appelle (sur ton objet User la méthode addBuildings($building), qui va s'occuper de créer l'entrée dans la table, de prélever l'argent, de donner de l'expérience, etc.

Enfin voilà, j'espère que ça te donnera envie de faire de la POO : on y gagne vraiment en clarté et en qualité ! Et puis, c'est devenu incontournable pour les applications un peu compliquées. Smile


Sephi-Chan


RE: Débuter mon code/projet tranquillement - R-transat - 22-08-2009

Donc pour les bâtiments dans la table, l'ID du bâtiment indique aussi le niveau du bâtiment, par exemple id=1 bâtiment de base niveau 1, id=2 bâtiment niveau 2 ?
Un autre exemple, id=10 est un laboratoire et id=11 un laboratoire niveau 2 ? ou c'est encore quelque chose de différent ?

Et pour la POO, je veux bien m'y mettre ^^ mais faut il trouver des tuto qui parte de zéro et facile à comprendre, as-tu des liens ?


RE: Débuter mon code/projet tranquillement - Yoda54 - 22-08-2009

(22-08-2009, 08:06 PM)R-transat a écrit : Et pour la POO, je veux bien m'y mettre ^^ mais faut il trouver des tuto qui parte de zéro et facile à comprendre, as-tu des liens ?

Quelques sujets au-dessus du tien par exemple Confusediffle:
Sinon, une petite recherche avec POO sur ce forum te donnera déjà un bon départ.


RE: Débuter mon code/projet tranquillement - R-transat - 22-08-2009

Merci, je vais aller voir ça.


RE: Débuter mon code/projet tranquillement - Sephi-Chan - 22-08-2009

Non pas du tout.

En gros, l'idée est d'avoir une table buildings qui stocke les différents bâtiments de ton jeu avec leurs spécificité (telles que le coût, le temps de fabrication, etc.), tu as également la table users qui stocke tes utilisateurs (d'où le nom :p). Et enfin, tu as une table buildings_users dont chaque entrée associe un utilisateur à un bâtiment. Bien sûr, chaque entrée peut également contenir d'autres informations, comme par exemple le niveau actuel du bâtiment.

Pour exploiter ça, il faut connaître un peu le SQL et les jointures, mais c'est un minimum pour quelqu'un qui crée un jeu : si tu ne connais pas encore, il faut que tu te renseignes. Un petit tutoriel que j'ai écris il y a un moment pourra peut-être t'aider : Les jointures avec MySQL. Wink

Tiens, encore un exemple où la POO peut être utile. Tu peux faire une méthode getPriceFor($user) à ta classe Building qui calcule le prix du bâtiment pour tel utilisateur : cette méthode calculera donc les réductions (ou augmentations) et tout pour l'utilisateur donné (par exemple, si sa race, spécialisée dans le marchandage, réduit le prix de ce qu'il achète, etc.). Les tutoriaux, tu peux les chercher sur le Web, il doit y en avoir sur le Site du Zéro, dans les non-officiels.


Sephi-Chan


RE: Débuter mon code/projet tranquillement - R-transat - 22-08-2009

Malheureusement le tuto du site du zéro sur la POO donné sur un topic épinglé de ce forum n'existe plus Sad


RE: Débuter mon code/projet tranquillement - Sephi-Chan - 22-08-2009

Deux choses :
Cela dit, attention avec ce tutoriel. Il enseigne aussi de mauvaise choses et après, difficile de s'en défaire !

Par exemple, dans un jeu, un personnage ne doit pas avoir de méthode recevoirDegats(), ça n'a pas de sens à moins que ce ne soit une méthode utilisée en guise de callback appelée quand un personnage reçoit des dégâts (qui peut par exemple tester si le personnage meurt, qui peut le mettre en mode berzerker de la mort car il est passé sous les 10% de points de vie, etc.), ce qui n'est pas le cas dans le tutoriel.


Sephi-Chan


RE: Débuter mon code/projet tranquillement - R-transat - 23-08-2009

Merci de ton aide ^^. J'avais retrouvé le tuto ^^

Quel site me conseil tu ? (avec des tuto) car les liens sur le topic de la POO dans ce forum montre le fonctionnement de la POO et à quoi il sert mais il n'y a pas vraiment de code et d'exercices...

Si tu pouvais m'aider sur ce topic car j'essaye de refaire ma zone d'inscription en POO : http://www.siteduzero.com/forum-83-435764-p1-zone-inscription-en-poo.html


RE: Débuter mon code/projet tranquillement - Sephi-Chan - 23-08-2009

Je te conseille de lire les articles qui parlent de la technique en POO (comment faire un constructeur, comment faire de l'héritage, etc.) il faut arrêter de chercher des tutoriaux pour tout et réfléchir par soi-même (quitte à demander des choses sur un forum comme celui-ci).

En fait, une classe Inscription n'a pas vraiment de sens. L'inscription, c'est juste la création d'un nouvel utilisateur. Alors la classe qui est concernée, c'est la classe User.

Un exemple de ce à quoi pourrait ressembler ton formulaire (page register.php) :


<form action="user_create.php" method="post">
<div class="field">
<div><label for="user_login">Nom d'utilisateur</label></div>
<div><input id="user_login" type="text" name="user[login]"></input></div>
</div>
<div class="field">
<div><label for="user_password">Nom d'utilisateur</label></div>
<div><input id="user_password" type="password" name="user[password]"></input></div>
</div>
<div class="submit">
<input type="submit">
</div>
</form>


Un exemple de ce à quoi pourrait ressembler ta page de traitement (user_create.php):


if(isset($_POST['user'])){
$user = new User();
$user->setLogin($_POST['user']['login']);
$user->setPassword($_POST['user']['password']);
$user->save();
}


Un exemple de ce à quoi ta classe pourrait ressembler :


class User {

protected $_id;
protected $_login;
protected $_password;

/**
* Récupère un utilisateur à partir de son ID.
* Crée un nouvel objet sinon.
*/
public function __construct($id = null){
if($id && is_numeric($id)){
/**
* Récupère un utilisateur en base de données.
*/
}

return $this;
}

/**
* Retourne un tableau des utilisateurs qui ont le login demandé.
* Retourne un tableau vide si aucun utilisateur ne correspond.
*/
public static function find_by_login($login){
$users = array();
/**
* Requête SQL qui cherche les utilisateurs qui ont ce login.
* On boucle sur les résultats (s'il y en a) en faisant à chaque itération :
*
* $user = new User();
* $user->setId($row->id)
* ->setPassword($row->password)
* ->setLogin($row->login);
*
*/

return $users;
}

public function save(){
if($this->is_valid()){

/**
* Si l'utilisateur n'a pas d'ID, c'est que c'est un nouvel utilisateur.
* Donc on le crée en base de données (INSERT).
*/
if($this->getId() == null){
/**
* Si ça fonctionne, on renvoie l'utilisateur crée.
* Sinon, on renvoie false.
*/
}
else {
/**
* S'il a un ID, la ligne pour cet utilisateur existe déjà donc
* on fait juste un update.
* Si ça fonctionne, on renvoie l'utilisateur crée.
* Sinon, on renvoie false.
*/
}

return $this;
}
else {
return false;
}
}

/**
* Valide les données.
*/
protected function is_valid(){
/**
* Ici, on peut par exemple vérifier si l'utilisateur n'utilise pas un login
* déjà pris. Que le mot de passe fait plus de 3 caractères, etc.
*/
}


public function setId($id){
$this->_id = $id;
return $this;
}

public function getId(){
return $this->_id;
}

public function setLogin($login){
$this->_login = $login;
return $this;
}

public function getLogin(){
return $this->_login;
}

public function setPassword($password){
$this->_password = $password;
return $this;
}

public function getPassword(){
return $this->_password;
}

}

Voilà une manière de faire. Documente-toi jusqu'à comprendre ce bout de code, poses des questions (après avoir cherché), etc.


Sephi-Chan