Des centaines de SELECT d'un coup (pas d'aide, juste un conseil)

ViPHP
ViPHP | 5924 Messages

30 août 2008, 20:16

Non, je veux dire juste après. Tu as mis le GROUP BY entre les deux…

Eléphanteau du PHP | 25 Messages

30 août 2008, 21:52

Encore merci pour ton aide précieuse, Sékiltoyai, mais aussi tout le monde.



Sékiltoyai :arrow: dans mon cas, le débug n'a rien donné (mais je suis d'accord, c'est une règle élémentaire en PHP), car je n'obtiens pas d'erreur, j'ai juste.... RIEN. Mais j'ai compris pourquoi, ce sont les IF qui posent problème. En fait, étant donné que chacune de mes 800 DIV est spécifique, je pensais faire quelque chose comme ça (pour n'avoir qu'un seul SELECT) :
<?php
$sql_lot = "SELECT lot_id, lot_bat, bat_id, bat_img 
FROM lots
LEFT JOIN bats
ON bat_id = lot_bat
GROUP BY lot_id";

$query_lot = mysql_query($sql_lot) or die (mysql_error());
$data_lot = mysql_fetch_array($query_lot);

// Si c'est la case n°1
if($data_lot['lot_id']=="01")
{
     echo "<div id=01 name=01 style='position: absolute; left: 158px; top: 194px;'><img src=images/".$data_lot["bat_img"]." border=0></div>";
}

// Si c'est la case n°1
if($data_lot['lot_id']=="02")
{
     echo "<div id=02 name=02 style='position: absolute; left: 180px; top: 194px;'><img src=images/".$data_lot["bat_img"]." border=0></div>";
}
?>
Mais avec les IF, rien n'est récupéré. Même si j'enlève le GROUP BY. Du coup sans les IF, il me récupère bien tout, mais forcément cela ne correspond plus avec les bonnes "cases". Mais de toute façon, une question : est-ce que placer 800 IF (800 conditions) ça aussi c'est très mauvais de mettre ça sur une même page ?


Alors je pense que je vais en rester à la suggestion de mojorisin, c'est-à-dire renseigner les left et les top dans la BDD directement. Dans ce cas, en effet avec un seul SELECT et environ 10 lignes tout au plus, je récupère mes 800 cases ainsi que leurs coordonnées left et top. De toute façon j'imagine qu'un seul SELECT sur 8 champs, c'est toujours mieux que 800 SELECT sur 6 champs... :?: :lol: C'est en relisant tous vos messages que j'en suis arrivé à cette conclusion. Comme quoi tous vos messages ont complété ma question et ça m'a permi d'arriver à cette solution ;)

Ceci dit si vous avez encore des remarques, elles sont les bienvenues ;)


Juste une dernière petite question, si cela ne vous gêne pas (je ne veux pas créer de nouveau topic pour ça). Comme vous devez vous en douter, un jeu PHP requiert une certaine "dynamique", si j'ose dire, et cela passe d'abord par les tâches cron. Mon jeu utilisera un système de calendrier (exemple : 21 février de l'année 7), en sachant que 1 minute réelle = +1 jour dans le jeu. Donc ma question est : je peux me permettre d'activer une tâche cron toutes les 60 secondes (je parle par rapport à mon serveur), ou bien là encore, c'est du suicide ? Vous allez me dire : tout dépend du code de la tâche cron. Mais il y a tout au plus 5 ou 6 requêtes (UPDATE pour la plupart) sur la tâche cron qui tourne toutes les minutes. J'ai d'autres tâches plus complexes, mais elles tournent toutes les 30 minutes ou 1 heure, donc ça m'inquiète moins.


Merci à vous.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

ViPHP
ViPHP | 5924 Messages

31 août 2008, 01:29

Non, je ne te laisserais pas utiliser une solution de merde parce que tu n'arrives pas à faire le SELECT. On va continuer, ca doit fonctionner. Quand on aura les données, on te dira comment les utiliser parce que les if non plus c'est pas top. Bref, continuons.
Il faut que tu postes le schéma de tes tables concernées (sous forme CREATE TABLE), ainsi qu'un échantillon de données pour que l'on voit à quoi cela correspond, avec à la limite une petite explication sur ce à quoi correspondent les champs…

Sinon, le cron, par exemple pour le jour, tu peux le calculer plutôt que le stocker en base. Il suffit que tu définisses dans un de tes fichiers une constante qui indique le début du jeu, et que tu joues avec les fonctions de date/heure de PHP pour calculer le jour…

Eléphanteau du PHP | 25 Messages

31 août 2008, 04:39

Déjà, je me présente Djay (je me suis enfin inscrit !). Alors comme ça je suis un embryon lol Ca fait 3 ans que je consulte votre forum et j'ai toujours trouvé réponses à mes questions, sans créer de topic. Sauf cette fois ci :lol: Bon très bien. Je crois, qu'on le veuille ou non, on est entré dans le vif du sujet. Alors plutôt que d'écrire un trèèès long post (déjà qu'il risque d'être très long), CLIQUEZ ICI (j'espère que les liens externes ne vous dérangent pas).

A la bonne heure ! Le fameux plateau de jeu, c'est ça :
Image

Je trouve bon de préciser que je n'en suis pas à mon premier coup d'essai ; je porte un réel intérêt de la simulation urbaine et à l'urbanisme en général et je gère déjà un forum d'une certaine importance, si on peut dire. Sauf que cette fois-ci je fais le grand saut : je m'attaque à un "Sim City" en ligne ! :lol: Evidemment ce jeu n'a aucunement la prétention de s'aligner aux "vrais" jeux sur PC ou consoles, mais vous devez bien savoir que les jeux web ont un univers bien à eux, et même si les graphismes peuvent paraître "rétro" (on est bien loin de la 3D...), c'est justement ça qui fait tout le charme :)
Si vous vous interrogez sur la réelle utilité de mettre au point un tel concept, je vous renverrais sur ce site qui a beaucoup de succès et pourtant "moins poussé" que ce que je veux faire, sans paraître prétentieux. Je ne vais pas non plus vous parler des "Minivilles" qui n'ont aucun gameplay, ci ce n'est de faire tourner son URL...

L'image ci-dessus n'est pas "photoshopée" : il s'agit d'une vraie maquette que j'ai créée pour tester justement la faisabilité de ce périlleux projet. Vous comprenez mieux maintenant pourquoi je dois non seulement utiliser des DIV, avec chacune des coordonnées bien précises. L'infobulle du bâtiment sélectionné contient des données contenues dans la base de données directement. Les cases sont alignées mais c'est parce que c'est un prototype, car la version finale du plateau doit plutôt ressembler à ça... :shock: :
Image

Dans le SELECT dont je parlais dans mes précédents posts, voilà pourquoi il y a une jointure entre la table des lots (parcelles de terrain) et la table des bâtiments (quel bâtiment s'affiche sur quelle case ?).

Concernant la gameplay du jeu, il est pratiquement défini dans son ensemble mais j'en parlerai un peu plus tard si cela vous dit (c'est vaste)... Car là ce qu'il nous interesse, c'est déjà de pouvoir "acheter" une parcelle de terrain et l'exploiter (y construire un bâtiment), et donc, d'afficher sur le "plateau" du jeu nos parcelles et nos bâtiments selon ce qu'on défini les joueurs.


Sékiltoyai :arrow: par contre quand tu dis "solution de merde", moi je la trouve pas si merdique que ça cette solution ? Regarde bien les images ci-dessus. Chaque parcelle a une position spécifique, donc la seule solution n'est-elle pas de renseigner directement dans la table des parcelles, les coordonnées top et left, pour chaque parcelle ? Ca coule tellement de source, je m'en veux de ne pas y avoir pensé avant : je n'aurais même pas créé ce topic. Mais si tu le dis, je te fais confiance. Voilà donc la dernière version de mon code :
<?php 
$sql_lot = "SELECT lot_id, lot_bat, lot_left, lot_top, bat_id, bat_img
FROM lots 
LEFT JOIN bats 
ON bat_id = lot_bat"; 

$query_lot = mysql_query($sql_lot) or die (mysql_error()); 
while($data_lot = mysql_fetch_array($query_lot)) // Du coup je fais une seule boucle pour les 800 parcelles
{
     echo "<div id=".data_lot['lot_id']." style='position: absolute; left: ".data_lot['lot_left']."px; top: ".data_lot['lot_top']."px;'><img src=images/".$data_lot["bat_img"]." border=0></div>";
} // Fin de la boucle
?>
Bon déjà, c'est mieux qu'hier (je ne vous remercierai jamais assez). Je te laisse imaginer mon ancien code avec les 800 SELECT.

Pour les IF, de toute façon quand je les mets ça ne me retourne rien, alors mieux vaut les oublier...


Sinon voici un morceau de shéma de mes tables :

:arrow: table des parcelles

Code : Tout sélectionner

CREATE TABLE lots ( lot_id tinytext NOT NULL, lot_nom tinytext NOT NULL, lot_type int(1) NOT NULL default '0', lot_bat int(11) NOT NULL default '0', lot_prix int(11) NOT NULL default '0', lot_loyer int(11) NOT NULL default '0', lot_revenu mediumint(11) NOT NULL default '0', lot_membre tinytext NOT NULL, lot_bat_nom text NOT NULL, lot_date text NOT NULL, lot_old int(11) NOT NULL default '0' ) TYPE=MyISAM; # # Contenu de la table `lots` # INSERT INTO lots (lot_id, lot_nom, lot_type, lot_bat, lot_prix, lot_loyer, lot_revenu, lot_membre, lot_bat_nom, lot_date, lot_old) VALUES ('01', 'n° 01', 0, 0, 10, 1, 2, '', '', '', 0); INSERT INTO lots (lot_id, lot_nom, lot_type, lot_bat, lot_prix, lot_loyer, lot_revenu, lot_membre, lot_bat_nom, lot_date, lot_old) VALUES ('02', 'n° 02', 0, 0, 10, 1, 2, '', '', '', 0); INSERT INTO lots (lot_id, lot_nom, lot_type, lot_bat, lot_prix, lot_loyer, lot_revenu, lot_membre, lot_bat_nom, lot_date, lot_old) VALUES ('03', 'n° 03', 0, 0, 10, 1, 2, '', '', '', 0); INSERT INTO lots (lot_id, lot_nom, lot_type, lot_bat, lot_prix, lot_loyer, lot_revenu, lot_membre, lot_bat_nom, lot_date, lot_old) VALUES ('04', 'n° 04', 0, 0, 10, 1, 2, '', '', '', 0); Jusqu'à la parcelle n°800...
:arrow: table des bâtiments

Code : Tout sélectionner

CREATE TABLE bats ( bat_id int(11) unsigned NOT NULL auto_increment, bat_nom tinytext NOT NULL, bat_type int(1) NOT NULL default '0', bat_classe int(1) NOT NULL default '0', bat_prix int(11) NOT NULL default '0', bat_loyer int(11) NOT NULL default '0', bat_revenu int(11) NOT NULL default '0', bat_img tinytext NOT NULL, PRIMARY KEY (bat_id) ) TYPE=MyISAM; # # Contenu de la table `bats` # INSERT INTO bats (bat_id, bat_nom, bat_type, bat_classe, bat_prix, bat_loyer, bat_revenu, bat_img) VALUES (9, 'Restaurant "La bonne adresse"', 2, 3, 1300, 19, 122, 'bat_c_004.gif'); INSERT INTO bats (bat_id, bat_nom, bat_type, bat_classe, bat_prix, bat_loyer, bat_revenu, bat_img) VALUES (10, 'Fast Food "Haloa Burger !"', 2, 2, 950, 15, 91, 'bat_c_005.gif'); INSERT INTO bats (bat_id, bat_nom, bat_type, bat_classe, bat_prix, bat_loyer, bat_revenu, bat_img) VALUES (11, 'Pavillon', 1, 2, 130, 6, 0, 'bat_r_004.gif'); INSERT INTO bats (bat_id, bat_nom, bat_type, bat_classe, bat_prix, bat_loyer, bat_revenu, bat_img) VALUES (12, 'Tente de trappeur', 1, 1, 15, 2, 0, 'bat_r_003.gif'); INSERT INTO bats (bat_id, bat_nom, bat_type, bat_classe, bat_prix, bat_loyer, bat_revenu, bat_img) VALUES (13, 'Villa moderne', 1, 3, 2800, 33, 0, 'bat_r_005.gif'); INSERT INTO bats (bat_id, bat_nom, bat_type, bat_classe, bat_prix, bat_loyer, bat_revenu, bat_img) VALUES (14, 'Snack-Bar "Chez la grosse Lulu"', 2, 1, 100, 5, 9, 'bat_c_006.gif');

Pour la date, je l'appelle effectivement depuis la BDD :

Code : Tout sélectionner

CREATE TABLE date_jeu ( date_id int(11) unsigned NOT NULL auto_increment, date_affiche text NOT NULL, date_statut int(11) NOT NULL default '0', PRIMARY KEY (date_id) ) TYPE=MyISAM; # # Contenu de la table `date_jeu` # INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (1, '1er janvier', 1); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (2, '2 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (3, '3 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (4, '4 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (5, '5 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (6, '6 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (7, '7 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (8, '8 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (9, '9 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (10, '10 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (11, '11 janvier', 0); INSERT INTO date_jeu (date_id, date_affiche, date_statut) VALUES (12, '12 janvier', 0); Jusqu'au 31 décembre...
C'est une "tête de lecture" qui opère toutes les 60 secondes en tâche cron.
:arrow: Si le champ statut_init == 0 alors la date n'est pas affichée
:arrow: Si le champ statut_init == 1 alors la date est affichée

Dans le bout de code ci-dessus, la date est donc le 1er janvier.


Voilà. Peut-être qu'il y a mieux. Comme vous pouvez le voir j'y vais à la bonne franquette, mais faire un jeu ce n'est pas comme faire un "p'tit site en PHP". Puis dans ce cas précis je ne vois pas comment utiliser la fonction time() pour l'affichage d'une date virtuelle. Ce n'est pas le code en soit qui me dérange (c'est juste un UPDATE sur le champ statut_init). C'était surtout de savoir si c'est "pas grave" de lancer une tâche cron toutes les 60 secondes :?:


En tout cas merci de vous pencher sur mon projet J'ai ça dans le crâne depuis 2 ans et trop souvent je voudrais une team compétente et motivée pour être "de la partie", si j'ose dire :lol: :lol:

ViPHP
ViPHP | 5924 Messages

31 août 2008, 12:30

Au temps pour moi, pour le SELECT c'est mieux en effet :P
Je devais pas avoir tout lu :)
Voilà. Peut-être qu'il y a mieux. Comme vous pouvez le voir j'y vais à la bonne franquette, mais faire un jeu ce n'est pas comme faire un "p'tit site en PHP". Puis dans ce cas précis je ne vois pas comment utiliser la fonction time() pour l'affichage d'une date virtuelle. Ce n'est pas le code en soit qui me dérange (c'est juste un UPDATE sur le champ statut_init). C'était surtout de savoir si c'est "pas grave" de lancer une tâche cron toutes les 60 secondes
C'est grave s'il y a une solution plus optimale :)

- Il y a une date de départ par personne je suppose ?
- Quand est ce que tu dois mettre date_statut à 1, il y a une règle ?

Tu me diras quand sortira ton jeu ca m'intéresse de le tester…

Eléphanteau du PHP | 25 Messages

31 août 2008, 18:48

Tu me diras quand sortira ton jeu ca m'intéresse de le tester…
Pas de souci :wink: D'autant qu'un truc pareil, je souhaite recruter des testeurs avant de sortir le jeu au grand public. J'espère une sortie pour 2009 : à partir de maintenant, je me suis laissé 12 mois (ça parait pas, mais c'est peu !). Si ça t'intéresse de voir d'autres images, clique ICI. Je ne fais pas dans le détail, mais au final les bâtiments ne font que quelques centimètres (c'est comme des avatars, de grosses icones) et ça reste surtout de la 2D sans rotation de la carte. Mais comment faire autrement quand on sait que le jeu n'utilise aucun client et passe directement par le navigateur... Il y a bien Flash mais dans ce cas précis, je pense qu'une jolie interface PHP reste le mieux. J'ai déjà testé la faisabilité sous IE, Firefox, et Mac, et ça marche.

Donc ok pour le SELECT je vais en rester là. En tout cas merci à tous, grâce à vous j'ai trouvé une solution pour éviter 800 SELECT sur une seule page. Cela dit je vais faire un test ce soir sur plusieurs cases en même temps : car je n'ai pas encore testé si la jointure ne pose bel et bien aucun problème. A la limite je vous tiens au courant avec la version finale du code. Je vais devoir aussi ajouter un champ "Z-Index" pour que les bâtiments se superposent dans le bon sens... mais bon ça c'est plus une question de CSS...


Concernant la date, si, c'est la même pour tout le monde. Même quand un joueur n'est pas connecté, le jeu continue de tourner en permanence (ça porte un nom ça dans le monde des "gamers" mais je ne me souviens plus lequel). Donc c'est simple : toutes les minutes, la date du jour est updatée à 0 et la date du lendemain est updatée à 1. Et seule la date à "1" est affichée (voir le code dans mon post précédent). A noter aussi qu'il y aura une "FIN" dans le jeu, avec une nouvelle partie qui démarre ensuite. Mais à ce niveau, tout n'est pas encore complètement défini.

On peut aussi remarquer une chose : la limite de la carte. Même s'il y aura 800 cases, cela veut dire au maximum 4 ou 500 joueurs en simultanée sur une partie. Mais le fait est que je n'ai pas voulu m'aventurer dans un système qui permet de générer une nouvelle map si la map précédente est remplie. Déjà parce que justement, cela va me permettre d'anticiper le flux des visiteurs et surtout la capacité de mon serveur à réagir. Et si je dois apporter des modifications au code (inévitable dans les débuts du jeu) alors je serai plus à l'aise de ne pas avoir des milliers de visiteurs "au cul", si vous me permettez l'expression (bien-sûr sans avoir prétention d'attirer des milliers de joueurs, on verra bien, mais comme vous le savez, ça peut aller vite...).

ViPHP
ViPHP | 5924 Messages

31 août 2008, 19:16

J'ai déjà testé la faisabilité sous IE, Firefox, et Mac, et ça marche.
Euh, Mac n'est pas un navigateur :)
Tous les Mac Users n'utilisent pas Safari, yen a aussi qui utilisent Firefox voire même Opera (le meilleur navigateur au monde pour information :) ).
Concernant la date, si, c'est la même pour tout le monde. Même quand un joueur n'est pas connecté, le jeu continue de tourner en permanence (ça porte un nom ça dans le monde des "gamers" mais je ne me souviens plus lequel). Donc c'est simple : toutes les minutes, la date du jour est updatée à 0 et la date du lendemain est updatée à 1. Et seule la date à "1" est affichée (voir le code dans mon post précédent). A noter aussi qu'il y aura une "FIN" dans le jeu, avec une nouvelle partie qui démarre ensuite. Mais à ce niveau, tout n'est pas encore complètement défini.
Alors il suffit juste de définir une constante DEBUT, à laquelle tu assignes le timestamp de la date à laquelle tu lances le jeu (Un timestamp est le nombre de secondes depuis une certaine date normalisée). Avec la fonction time() tu as le timestamp actuel, donc time()-DEBUT te donne le nombre de secondes depuis le début du jeu, tu divises par 60 pour avoir le nombre de jours :
floor((time()-DEBUT)/60)
Pour avoir l'année, là aussi des fonctions existent, quelquefois oubliées, tu as cal_from_jd() qui te transforme un nombre de jours en une date dans le calendrier de ton choix (attention, il y a un piège, c'est le calendrier Grégorien et non le calendrier Français qu'il faut choisir :D ) :
cal_from_jd(floor((time()-DEBUT)/60), CAL_GREGORIAN) et cal_from_jd(floor((time()-DEBUT)/60)+1, CAL_GREGORIAN)
Ce serait con de gaspiller 40 000 hits par mois et autant de connexions à la base alors que tu peux tout faire avec une formule…

Eléphanteau du PHP | 25 Messages

31 août 2008, 19:25

Merci à toi Sékiltoyai :wink: Pour la date je vais étudier ça un peu plus tard, là je m'occupe du plateau. Mais effectivement je n'avais pas raisonné comme ça. Si tu veux je peux te tenir au courant sur ce topic. Mais tu peux suivre aussi l'état d'avancement sur le blog du projet.

Je reviens ce soir pour confirmer les SELECT, car comme j'ai dit je veux quand même confirmer que la jointure ne pose pas de souci, dans mon cas.


Concernant Mac, oui Safari :lol: Justement certains de mes bâtiments bug sous Safari (ils disparaissent, probablement un souci d'images GIF), mais effectivement il reste Firefox, et donc Opéra (mais j'ignorais qu'il existait sous Mac).

Encore merci :wink:

ViPHP
ViPHP | 4039 Messages

31 août 2008, 20:18

ça doit être fun de coder des petites animations en JS la dessus, genre des petites voitures ou un bus.. pas besoin d'un codeur javascript par hasard ? 8-)

lse jointures ne devraient pas poser de soucis, ce sont plutôt les sous-requêtes qu'il faut éviter.
Par contre, c'est indexer qu'il faut faire. Indexer et mettre en cache..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 25 Messages

31 août 2008, 20:22

Coder une anim en JS ? Tiens donc, j'ignorais ça ! :lol: Je devrais peut-être jeter un oeil là dessus. En l'état actuel des choses, seuls les bâtiments seront animés (et encore, pas tous, car j'ai jugé inutile de vouloir en "faire trop", surtout au début). Les bâtiments sont en GIF (tout simplement !), et aucune solution n'est pour le moment trouvée pour mettre une circulation routière. Le réseau routier (la map) c'est une image d'arrière plan avec les bâtiments en DIV par dessus. Pour la circulation routière, éventuellement une animation Flash transparente en DIV juste aus dessus de l'image d'arrière plan, mais je ne sais pas si c'est vraiment fiable. Au pire un jeu comme ça, la circulation n'est pas essentielle (même si à moyen terme, j'aimerais lui apporter tout un tas de petites améliorations).

Image


Par contre, c'est indexer qu'il faut faire. Indexer et mettre en cache..
Justement, mettre en cache n'est-il pas inaproprié quand on sait que chaque parcelle est susceptible d'évoluer (de changer) n'importe quand ? Déjà (et même si cela n'a rien à voir) je compte mettre un script en JS qui met un message ou une animation quand la ville (la page) se charge. Par exemple ça.

ViPHP
ViPHP | 5924 Messages

31 août 2008, 20:36

Coder une anim en JS ?
On peut tout faire en JS. Tu peux même faire du rendu 3D en JS, ya déjà des moteurs pour ça…

ViPHP
ViPHP | 4039 Messages

01 sept. 2008, 09:49

Un bon cache devrait detecter les changements.. en tout cas, avec bon cache, ton jeu gagnerait considérablement en vitesse. Mais bien indexer c'est déjà pas mal.


Ouaip, pour les bâtiments, les gifs c'est ce qui se fait de mieux. En plus, avec la transparence, c'est Byzance.

Non, pas du flash, c'est moche et propriétaire le flash.. je verrais juste une gif, d'une petite voiture, calée dans un petit div, qui se baladerait sur les chemins de campagne..

je m'étais imagine un railroad tycoon en JS un jour, ça m'avait l'air fun comme idée

Image

Pour ce qui est de JS, même si ça prends plus de temps, je te conseillerais de faire tes propres scripts, aidé d'un framework comme Jquery ou prototype. Tu as tout à y gagner, surtout si tu comptes apporter des changements plus tard.

edit: en parlant de JS..
http://blog.nihilogic.dk/2008/07/wolfen ... ashup.html
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 25 Messages

01 sept. 2008, 14:44

Alors tout d'abord je vous confirme le bon fonctionnement de mon SELECT unique. En insérant les coordonnées de mes DIV dans la base de données, c'était visiblement la meilleure solution. Ma page est passée de 2500 lignes à 80 lignes, c'est dire ! 8-)


Berzemus :arrow: BINGO ! Tu as deviné mon jeu de référence :lol: J'ai toujours été épaté par la réalisation de Transport Tycoon, surtout quand on sait que les mecs n'étaient que deux à développer le jeu (Chris Sawyer le programmeur et son pote le graphiste).
Ce n'est pas un jeu poussé graphiquement, mais j'ai toujours été charmé par son concept et la partie "gestion" très pointue (encore à ce jour l'une des références des jeux de gestion) et finalement l'aspect en 2D est plutôt mignon (même si moi, sans prétention, j'essaie de faire encore plus joli que Transport Tycoon, je parle bien-sûr des bâtiments).

Concernant le JS, c'est sûr que c'est optimal. Mais néanmoins pour un rendu 3D je dois redessiner les 4 faces de chaque bâtiment. Pour moi c'est trop de travail surtout quand on sait qu'un seul bâtiment peut me prendre plusieurs heures de réalisation. Mais j'ai trouvé des alternatives pour que le gameplay du jeu reste confortable, comme par exemple une sélection "en rouge" du bâtiment survolé, même d'un bâtiment partiellement caché par un autre bâtiment plus grand au premier plan, à défaut d'une rotation de la carte. Comme on peut le voir sur la première image que j'ai montré sur ce topic, je pense que le rendu est tout de même agréable. Quand on cliquera sur un bâtiment, une fenêtre s'ouvrira (comme dans Transport Tycoon par exemple), sous forme de popup, avec tous les détails du membre et du bâtiment. J'ai aussi fait un "plan de trésorerie" : une sorte de bilan mensuel qui calcul loyers et revenus de chaque membre, avec une mise à jour chaque fin de mois (mois dans le jeu), comme ça les membres peuvent contrôler leur richesse en temps réel.

Pour te donner une idée voilà un shéma de la map finale (ce n'est pas la taille exacte mais c'était pour poster une image pas trop grande). C'est juste un shéma, la map finale sera plus grande (800 à 1000 cases) et bien-sûr plus jolie au niveau des textures et décors.
Image

Donc finalement la map c'est juste un background, et les parcelles + bâtiments sont des DIV par dessus. C'est pour ça que je ne sais pas imaginer générer une circulation routière là-dessus. A moins de faire une DIV en Flash avec fond transparent, par dessus les routes. Mais auquel cas je dois créer le trajet de chaque bagnole. C'est pour cela que pour l'instant j'ai mis ça de côté, d'autant que ce jeu n'a pas pour vocation d'être une simulation de transports, mais juste un système de résidences et commerces pour les membres.

Il y aura des évènements qui modifieront le parcours de chaque membre tout au long de la partie. Les membres pourront aussi interagir entre-eux. Le but sera de s'enrichir avec ses commerces. Je réfléchis aussi à un système de locations : des membres qui pourraient "louer" un appartement dans un immeuble d'un autre membre propriétaire. Idem pour les commerces : des membres salariés dans des sociétés appartenant à d'autres membres patrons.

Un autre détail : comme vous pouvez le voir les routes sont déjà tracées. Je ne serai pas contre faire un système où les membres places eux-mêmes les routes. Mais je verrai ça plus tard, éventuellement dans une "version 2" du jeu. Car déjà là c'est un dur travail pour moi et je n'ai pas voulu avoir les yeux plus gros que le ventre. Il est évident aussi que mon projet prendrai une autre tournure si je pouvais travailler en équipe avec des personnes compétentes. Car tout ce que j'ai fait jusque là, je l'ai fait tout seul.


si tu comptes apporter des changements plus tard.
Tout à fait. Même les meilleurs jeux finissent pas lasser. Je sais pertinemment que la pérennité de mon jeu passe par des mises à jour régulières. Déjà, ajouts réguliers de nouveaux bâtiments, et y'en aura pour tous les goûts et tous les "porte-monnaie". Le gameplay du jeu peut être aussi amélioré continuellement. Je réfléchis à un système de gangs mafieux dans la ville, etc... tout est envisageable pour faire de ce jeu une simulation urbaine sympa sur Internet, même si au début, il n'y aura rien de prétentieux ni de "tape à l'oeil".

Sinon je voudrais revenir au système de date évoqué par Sékiltoyai, le principe est vraiment très bon. Je m'occupe de ça après la "map" :wink: Pour le reste, si ça ne vous gêne pas je pourrai vous donner des nouvelles sur ce topic. Mais ça représente du travail, déjà la map et mes 800 cases j'en ai pour jusqu'à la fin de l'année environ. Mais je me permets de vous rappeller l'adresse du blog du projet, mais là aussi je ne donne pas souvent de news. Le fait est que plus j'avancerai dans le projet et plus j'aurai de news à donner souvent :lol: Y'a des internautes qui suivent mon projet depuis les prémices, ça fait 2 ans. Mais j'ai ouvert le blog y'a seulement quelques mois.


Surtout si ce concept vous intéresse, n'hésitez pas à m'apporter vos suggestions et idées, ce sera toujours un plaisir pour moi que d'en discuter avec vous. D'ailleurs j'aimerais que ce jeu devienne une source de contributions pour ceux que ça intéresse. Je réfléchis aussi à la possibilité que les membres importent leurs propres bâtiments (facile via un formulaire d'upload d'images).

ViPHP
ViPHP | 4039 Messages

01 sept. 2008, 16:11

Ah.. ttd.. une référence. Surtout que (ce malade de) sawyer avait tout codé en assembleur..

C'est sékil qui avait lancé la 3d, moi je pensais uniquement faire bouger le petit camion sur la route. Dans une simple div, en utilisant, comme les batiments, le z-index, a recalculer lors de chaque carrefour.

Mais bon, tu as raison de ne pas vouloir voir trop loin, sinon, on ne termine jamais :wink:

Pour ce qui est des routes et bâtiments a placer, je crois que TTD donne un bel exemple. Tout en carrés, il prévoit des bâtiments de 1 ou 4 carrés, et il remplit l'espace entre les routes tracées par le joueur.. enfin, quelque chose comme ça, mais à gérer, ça doit être autre chose.

Sinon, y'a le premier sim city qui est sortit en open-source il me semble. Ce serait sympa de voir comment Will avait résolu ce point...

ah ben:
Image

Les routes bien remplies sont des images animées, avec des carrés noirs qui bougent. Ceci dit, du coup, de temps en temps une voiture qui va d'un carrefour à l'autre devrait être assez facile d'implanter, si c'est pour l'ambiance, il ne doit pas suivre un chemin particulier. Quelques animations de route, à exécuter aléatoirement.. mais bon, c'est un détail.

Et pour l'ouvrir aux contributions, je crois qu'il te faudrait alors mettre en place tout un environnement de travail en groupe, genre trac, subversion, etc.. mais comme ça, sur le moment, je trouverais ça intéressant, c'est sur
:wink:

En tout cas, le blog est déjà dans mes favoris..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 25 Messages

01 sept. 2008, 16:37

C'est sûr que, laisser aux joueurs la gestion des routes ça demande une toute autre technique. En fait le plus difficile c'est obliger le joueur à respecter une certaine cohérence entre chaque parcelle de route. Par exemple, ne pas mettre 2 carrés de "courbe" l'un à côté de l'autre. Sinon des petits malins s'amuseraient à faire un réseau tordu, c'est inévitable. Mais bon l'avantage de la prog c'est qu'il sera toujours temps d'améliorer le jeu plus tard. Evidemment il faut déjà anticiper un certain format de code mais ça c'est déjà prévu (c'est peut etre même le plus long, en fait).

Le 1er Sim City oui j'ai bien connu. Je suis un adepte :) Bon le souci du premier Sim City c'est que c'était même pas de la "fausse 3D", c'est carrément les bâtiments en vue de dessus (satellite). Je pensais à ça au début de mon projet, là effectivement ça aurait simplifié beaucoup de choses. Mais j'ai adopté un format de bâtiment en "fausse 3D" et je trouve que c'est d'autant plus sympa :wink: Pour le réseau routier, effectivement pour moi la meilleure solution actuelle est donc un Flash dans une DIV avec l'animation de 10 ou 15 voitures qui va d'un bout à l'autre de la ville (ce sera déjà ça). Dans ce cas je peux même "délirer" avec le respect des feux rouges, et des voitures qui roulent doucement et d'autres très vite (histoire d'égayer le jeu et lui donner une certaine ambiance). Et dans ce cas je pourrai aussi différencier la circulation en ville et la circulation sur autoroutes. Cependant les transports sont bel et bien prévus (bon ce ne sera pas un 'Transport Tycoon' cela va de soit), mais je compte bien créer un réseau ferroviaire avec circulation de trains etc... Et tout ça en Flash.

Dans le jeu il y aura 2 profils de joueurs : les simples citoyens (qui auront leur maison + commerce) et le Maire. Plusieurs maires pourront se succéder en cours de partie (c'est le but justement). Le maire aura d'autres pouvoirs (améliorer infrastructures (ponts etc...), gérer le cours des impôts de la ville, construire bâtiments spécifiques (flics, hopitaux, gares, aéroport, églises....). Prix des loyers et des terrains variables selon quartier (quartiers riches, quartiers pauvres...). Si le réseau de la ville est déjà prédéfini, néanmoins les bâtiments et l'aspect de la ville changera forcément, d'une partie à l'autre. A moyen terme je veux bien-sûr proposer d'autres villes... c'est le but.


Pour les contributions, j'y pense souvent mais je crois qu'en l'état actuel des choses, je dois encore poursuivre le développement du jeu et quand il aura bien pris forme, il sera peut-être à ce moment plus facile d'y intégrer (et surtout de motiver ;) ) des personnes intéresser. Je suis ouvert à tout :wink:



PS : merci pour le blog ;) Je dois rédiger une nouvelle grande news courant septembre (qui concerne la map justement)