par
Djay51 » 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

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 :
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 !

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...

:
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

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 :

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...

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.

Si le champ statut_init == 0 alors la date n'est pas affichée

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

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), [url=http://blog.citygiant.fr/]CLIQUEZ ICI[/url] (j'espère que les liens externes ne vous dérangent pas).
A la bonne heure ! Le fameux plateau de jeu, c'est ça :
[img]http://blog.citygiant.fr/images/galleries/ville/01.jpg[/img]
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 "[i]Sim City[/i]" 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 [url=http://www.icontown.net]ce site[/url] 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 "[i]Minivilles[/i]" 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: :
[img]http://blog.citygiant.fr/images/galleries/ville/02.jpg[/img]
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]<?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
?>[/php]
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]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...[/code]
:arrow: table des bâtiments
[code]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');[/code]
Pour la date, je l'appelle effectivement depuis la BDD :
[code]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...[/code]
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: