14-10-2008, 01:36 AM
(Modification du message : 14-10-2008, 01:38 AM par jo_link_noir.)
Perso j'aime bien les cartes iso, alors moi j'afficherais une carte isométrique. X-ZoD avais fait des tutos ici (un exemple à la fin)
Sinon, tu as réussi à faire l'algo ? j'ai tenter pour le fun et j'obptient ce resultat :
P -> personnage
O -> obstacle
C -> case visible
A -> case cacher
et le code (pas optimiser du tout)
Sinon, tu as réussi à faire l'algo ? j'ai tenter pour le fun et j'obptient ce resultat :
P -> personnage
O -> obstacle
C -> case visible
A -> case cacher
et le code (pas optimiser du tout)
Code PHP :
<?php
//calcule l'angle en degres (sur 360°)
function angle($x,$y)
{
$module = sqrt($x*$x + $y*$y);
$angleCos = acos($x / $module);
$angleSin = asin($y / $module);
if($angleSin < 0)
if($angleCos > pi()/2)
$angleCos = pi()*2 - $angleCos;
else
$angleCos = pi()*2 + $angleSin;
return 180*$angleCos/pi();
}
//array( ["x,y"] => type de terrain (pour la transparence par exemple (pas gerer ici))
$c_obstacle = array(
'5,6'=>3,
'3,2'=>3,
'5,3'=>3,
'8,8'=>3,
'8,9'=>3,
'13,14'=>3,
'20,5'=>3,
'18,10'=>3,
'16,15'=>3,
'12,14'=>3
);
$angle_obstacle = array();
$jx = 13;
$jy = 13;
//cherche les obstacles, la fourchette de l'angle et leur distance par rapport au joueur
foreach($c_obstacle as $coord=>$type){
list($x,$y) = explode(",", $coord);
$x -= $jx;
$y -= $jy;
/*definit l'anglez de chaque coin de la case
(0.5 => l'obstacle prend toute la case
0.45=> l'obstacle prend 90% de la case)*/
$angle_coin = array(
angle($x+0.45, $y+0.45),
angle($x+0.45, $y-0.45),
angle($x-0.45, $y-0.45),
angle($x-0.45, $y+0.45)
);
$angle_obstacle[] = array(
min($angle_coin), //angle min
max($angle_coin), //angle max
sqrt($x*$x + $y*$y) //distance
);
}
for($y=25;$y>=1;$y--){
for($x=1;$x<=25;$x++){
$cacher = false;
//regarde si la case est cacher par un obstacle
foreach($angle_obstacle as $values){
//zone d'ombre à porter (pas obligatoireent sur la case traiter)
if($values[2] < sqrt(pow($x-$jx, 2) + pow($y-$jy, 2))) {
$angle = angle($x-$jx,$y-$jy);
//verifie si la zone d'ombre est bien sur la case en cours de traitement
if($values[0] <= $angle AND $angle <= $values[1]){
$cacher = true;
//case cacher, pas la peine de continuer à chercher
break;
}
}
}
if(isset($c_obstacle["$x,$y"]))
echo '<span style="color:red">O </span>';
elseif(true === $cacher)
echo '<span style="color:black">A </span>';
elseif($jx == $x AND $jy == $y)
echo '<span style="color:green">P </span>';
else
echo '<span style="color:gray">C </span>';
}
echo '<br />';
}
echo '<pre>';
print_r($angle_obstacle);
?>
bonne nuit