|
Que faire ? Posté par WhiteAnge, le 29/05/2007 à 10:42:47 Bonjour à tous,
Bon voilà, j'ai parcouru les différents forums, regardez les différents MODS ou améliorations apportées et je me disais "si l'on continue sur cette voie là, le jeu est mort, car il n'y a pas d'evolution fondamentale du jeu.".
Je m'explique :
Prenons l'exemple des Villes.
Qu'y trouve t'on ?
-de nouvelles fonctionnalités (amélioration par rapport à la base)
-des villes 'interactives' (amélioration)
-des villes en flash (amélioration)
Prenons l'exemple de la carte.
Qu'y trouve t'on ?
-une appparition de la barre de vie sur la carte (amélioration)
-une mini carte (amélioration car c'est juste un copier/coller du code et qui plus est double le nombre de requêtes ... Au niveau des Hits chez les hébergeurs en mutualisés celà ne pardonne pas ...)
Comme vous le voyez, on ne trouve que des améliorations de fonctionnalité (j'insite sur ce mot) et pas d'amélioration majeure du code ou autre.
Regardons en détail l'affichage de la carte et regardons déjà ce que de base on peut améliorer :
Code :
while ($latitude >= $latmin ) {
$longitude = $longmin;
while ($longitude <= $longmax) {
// infos personage
$perso = doquery("SELECT charname, avatar FROM {{table}} WHERE latitude='$latitude' AND longitude='$longitude' LIMIT 1", "users");
$persorow = mysql_fetch_array($perso);
//infos map
$query2 = doquery("SELECT nom FROM {{table}} WHERE lati='$latitude' AND longi='$longitude' LIMIT 1", "sol");
$fetcht = mysql_fetch_array($query2);
$sol = $fetcht['nom'];
// infos Maisons
$query3 = doquery("SELECT name FROM {{table}} WHERE latitude='$latitude' AND longitude='$longitude' LIMIT 1", "maison");
$fetchh = mysql_fetch_array($query3);
$maison = $fetchh['name'];
// infos Villes
$query4 = doquery("SELECT name FROM {{table}} WHERE latitude='$latitude' AND longitude='$longitude' LIMIT 1", "towns");
$fetchx = mysql_fetch_array($query4);
$villes = $fetchx['name'];
4 requêtes à chaque fois que l'on modifie l'incrementation de la latitude et de la longitude ! Désolé mais là il y a une vrai amélioration à apporter. Regardons donc ce que l'on peut faire :
Première question :
Quel est le denominateur commun à ces requêtes ?
->Latitude et Longitude !
Que peut te donc faire ?
->Tenter de récuperer toutes les données en une requête. Pour celà, il ne faut plus se baser sur la latitude et la longitude mais par exemple sur le nom du personnage ou son ID, puisque l'on désire afficher une carte centré autour de lui.
La place du joueur c'est
Code :
Select per_latitude, per_longitude from users where per_nom='$userrow[id]'
Donc si je veux tous les X,Y +/- 5 cases (pour une map de 11*11) du terrain :
Code :
Select sol_latitude, sol_longitude
from sol, (Select per_latitude as xx, per_longitude as yy from users where per_nom='$userrow[nom]' ) as P
where sol_x between P.xx-5 and P.xx+5
and sol_y between P.yy-5 and P.yy+5
En une requête on a les éléments du sol pour toute la map.
On refait pareil pour les maisons et les villes et les autres persos, puis on sélectionne les couples :
Code :
Select 1 as letype, per_latitude as x, per_longitude as y
from users, (Select per_latitude as xx, per_longitude as yy from users WHERE per_nom='$userrow[nom]') as P
where per_latitude between P.xx-5 and P.xx+5
and per_longitude between P.yy-5 and P.yy+5
Union
Select 2 as letype, bat_latitude as x, bat_longitude as y
from maison, (Select per_x as xx, per_y as yy from users WHERE per_nom='$userrow[nom]') as P
where bat_latitude between P.xx-5 and P.xx+5
and bat_longitude between P.yy-5 and P.yy+5
Union
Select 3 as letype, sol_latitude as x, sol_longitude as y
from sol, (Select per_latitude as xx, per_longitude as yy from users where per_nom='$userrow[nom]') as P
where sol_latitude between P.xx-5 and P.xx+5
and sol_longitude between P.yy-5 and P.yy+5
Union
Select 4 as letype, town_latitude as x, town_longitude as y
from towns, (Select per_latitude as xx, per_longitude as yy from users where per_nom='$userrow[nom]') as P
where town_latitude between P.xx-5 and P.xx+5
and town_longitudee between P.yy-5 and P.yy+5
Et voilà en une requête unique on possède tous les éléments de la carte ! Finis les boucles imbriquées qui entraîne une perte de temps et des "hits" inutiles.
Le problème c'est que les couples peuvent être en double voir en triple. On va donc prendre qu'un des couples "le type" qui nous indique le couple prioritaire
Code :
Select Min( letype) as letype, x, y
from (
Select 1 as letype, per_latitude as x, per_longitude as y
from users, (Select per_latitude as xx, per_longitude as yy from users WHERE per_nom='$userrow[nom]') as P
where per_latitude between P.xx-5 and P.xx+5
and per_longitude between P.yy-5 and P.yy+5
Union
Select 2 as letype, bat_latitude as x, bat_longitude as y
from maison, (Select per_x as xx, per_y as yy from users WHERE per_nom='$userrow[nom]') as P
where bat_latitude between P.xx-5 and P.xx+5
and bat_longitude between P.yy-5 and P.yy+5
Union
Select 3 as letype, sol_latitude as x, sol_longitude as y
from sol, (Select per_latitude as xx, per_longitude as yy from users where per_nom='$userrow[nom]') as P
where sol_latitude between P.xx-5 and P.xx+5
and sol_longitude between P.yy-5 and P.yy+5
Union
Select 4 as letype, town_latitude as x, town_longitude as y
from towns, (Select per_latitude as xx, per_longitude as yy from users where per_nom='$userrow[nom]') as P
where town_latitude between P.xx-5 and P.xx+5
and town_longitudee between P.yy-5 and P.yy+5
) as total
group by x,y
Ensuite, il y a quelques autres manips a faire :
->Récuperer les noms des persos, et tous les couples pour les afficher dans un tableau.
Je vous passe les détails.
En final on obtient ceci pour la map :
Code :
<?php
mysql_connect('localhost','','') ;
mysql_select_db('letest') ;
$users = '$userrow[nom]' ;
$taille = 5 ; //Taille de la Carte (11*11)
$unionX = 'select 0 as x' ;
$unionY = 'select 0 as y' ;
for ($i=1; $i<=$taille*2; $i++) {
$unionX .= ' union select '.$i ;
$unionY .= ' union select '.$i ;
}
$sql = 'Select letype, x+'.$taille.'-P.xx as x, y+'.$taille.'-P.yy as y,
if (carte.letype=1, (select per_nom from users where per_x=carte.x and per_y=carte.y limit 1),
if (carte.letype=2, (select mai_nom from maison where mai_x=carte.x and mai_y=carte.y limit 1),
if (carte.letype=3, (select sol_nom from sol where sol_x=carte.x and sol_y=carte.y limit 1),
"pas de sol"
)
)
) as nom
from (
Select Min( letype) as letype, x, y
from (
Select 1 as letype, per_x as x, per_y as y
from users, (Select per_x as xx, per_y as yy from users where per_nom="'.$users.'") as P
where per_x between P.xx-'.$taille.' and P.xx+'.$taille.'
and per_y between P.yy-'.$taille.' and P.yy+'.$taille.'
Union
Select 2 as letype, mai_x as x, mai_y as y
from maison, (Select per_x as xx, per_y as yy from users where per_nom="'.$users.'") as P
where mai_x between P.xx-'.$taille.' and P.xx+'.$taille.'
and mai_y between P.yy-'.$taille.' and P.yy+'.$taille.'
Union
Select 3 as letype, sol_x as x, sol_y as y
from sol, (Select per_x as xx, per_y as yy from users where per_nom="'.$users.'") as P
where sol_x between P.xx-'.$taille.' and P.xx+'.$taille.'
and sol_y between P.yy-'.$taille.' and P.yy+'.$taille.'
union
select 4 as letype, x+P.xx-'.$taille.' as x, y+P.yy-'.$taille.' as y from
('.$unionX.') as X,
('.$unionY.') as Y,
(Select per_x as xx, per_y as yy from users where per_nom="'.$users.'") as P
) as total
group by x,y
) as carte,
(Select per_x as xx, per_y as yy from users where per_nom="'.$users.'") as P
order by y,x' ;
$Hdle = MySql_Query ($sql) ;
echo '<table border="1" width="100%">' ;
while ($tableau = MySql_Fetch_Assoc($Hdle)) {
if ($tableau['x']==0) echo '<tr>' ;
echo '<td>'.$tableau['nom'].'</td>' ;
if ($tableau['x']==($taille*2)) echo '</tr>' ;
}
echo '</table>' ;
MySql_Free_result ($Hdle) ;
?>
Note :
Chez moi, la table ville a disparu, tous les batiments quelconque sont compris dans la table maison, à laquelle j'ai rajouté un champ 'type' définissant si on est en présence :
->Maison
->Ville
->Temple
->Dongeon
->Portail Dimensionnel (Multi-Mondes)
En outre :
J'ai indexé x et y de sol, il ne bouge pas trop
J'ai indexé x et y de maison, il y a peu de probabilité qu'ils bougent beaucoup
Le temps global pour afficher la map est chez moi de 0.02 secondes !
Voilà ce qu'il faudrait faire pour améliorer le jeu. Il y a tellement à faire ! Un autre exemple que je ne détaillerais pas concerne la page index.php :
Code :
if (isset($_GET["do"])) {
$do = explode(":",$_GET["do"]);
etc ....
Là, la triche est super facile ! Je suis sur la carte, ma vie est basse et il faudrait que je me repose ! Merde je n'ai pas d'hôtel à dispo ! Bon et bien on va en appeler un !!!
Je rentre dans le browser l'URL : http://monjeu.net@copyright_rpgillusion/index.php?do=inn.
Hop j'ai mon auberge, je me repose, et repart tout fringuant ....
Dommage non ? Alors qu'il aurait suffit de faire dans les fonctions villes :
Code :
// Fonction villes.
if ($userrow["currentaction"] == "En ville") {
if ($do[0] == "inn") { include('towns.php'); inn(); }
elseif ($do[0] == "cheatbanque") {include('towns.php'); cheatbanque(); }
elseif ($do[0] == "cheatniveau") {include('towns.php'); cheatniveau(); }
elseif ($do[0] == "home") { include('towns.php'); home(); }
.....
}
}
au lieu de :
Code :
// Fonction villes.
if ($do[0] == "inn") { include('towns.php'); inn(); }
elseif ($do[0] == "cheatbanque") {include('towns.php'); cheatbanque(); }
elseif ($do[0] == "cheatniveau") {include('towns.php'); cheatniveau(); }
elseif ($do[0] == "home") { include('towns.php'); home(); }
.....
}
Alors je pense qu'au lieu de reprendre des mods et d'en faire des copier/coller pour en créer d'autres, ce qui ne fait pas évoluer RPG Illusion, mettons nous au travail et remodelons RPG-Illusion !
Celà me fait penser en fait à un concept du cycle d'Elric où il existe la loi, le chaos et la neutralité (les seigneurs gris).
->Le chaos est un changement constant donnant l'impression d'avancée mais qui est en fait du surplace
->La loi ou rien n'avance car tout est trop rigide, figé
->La neutralité, un mélange des deux
Actuellement, mon opinion c'est que RPG Illusion est assimilable au chaos.
Amicalement,
WhiteAnge
édité par WhiteAnge le 29/05/2007 à 10:49:11
|