Процедура генерации полей карты
/*Таблица незанятых полей общей карты и также деревни игрока, если есть usr_id*/
CREATE TABLE `fields` (
fid bigint(20) unsigned NOT NULL auto_increment, /*ID поля*/
xcoord int,
ycoord int,
fid_type int, /*тип поля: 1,2,3,4*/
usr_id int default 0, /*связан с игроком?*/
-- сколько ресурсов?
f_grain int default 700, /* нач. кол-во зерна */
f_ore int default 700, /* нач. кол-во руды */
f_wood int default 700, /* нач. кол-во дерева */
f_clay int default 700, /* нач. кол-во глины */
PRIMARY KEY (`fid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
-- процедура по генерированию случаных типов незанятых полей (участков) --
create procedure makefields (param1 int, param2 int)
BEGIN
declare x int default 1;
declare y int default 1;
declare st int default 0;
WHILE y <= 15 DO
WHILE x <= 15 DO
SET st = RAND()*10 / (10 + 1) * ((param2 - param1) + param1)+0.5;
insert into fields (xcoord,ycoord,fid_type) values (x,y,st);
SET x = x+1;
END WHILE;
SET x = 1;
SET y = y+1;
END WHILE;
END;
CALL makefields(1,4);
-- резервируем поле для нашего тестового персонажа
update fields set usr_id = 100 where fid = 49;
update fields set usr_id = 101 where fid = 52;
Изометрическая визуализация полей
game.php
<?php
session_start();
include_once ("cone.php");
$login = $_SESSION['login'];
// узнаємо координати розміщення гравця
$result = mysql_query("SELECT u.id, f.xcoord, f.ycoord FROM users u join fields f on u.id=f.usr_id WHERE login='$login'")
or die("Query failed : " . mysql_error());
$row = mysql_fetch_array( $result );
$sess_id = $row["id"];
//отцентрировать карту по координатам этого поселка
$max_fields = 15;
$x = $row["xcoord"];
$y = $row["ycoord"];
// Отцентрируем карту. Здесь мы делаем проверки расположения поселка.
// Если поселок находится близко к какой-то границе карты, конечно мы не сможем его отцентрировать,
// поэтому нам придется выбирать в качестве центра другую ячейку, в других случаях - центром карты будет наш поселок.
if($x<4) $x=4;
if($x>($max_fields-3) ) $x = $max_fields-3;
if($y<4) $y=4;
if($y>($max_fields-3) ) $y = $max_fields-3;
// --
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>***</title>
<meta http-equiv="content-type" content="application/xhtml; charset=UTF-8" />
<link rel="icon" type="image/png" href="images/136482.png">
<link rel="stylesheet" href="game.css" type="text/css">
<script src="main.js" type="text/javascript"></script>
</head>
<body onload="draw_field( <?php echo $x.','.$y; ?> );"><center>
<?php echo "$login<hr>"; ?>
<div id="fld_div" style="position:fixed; left:13%;top:10%; z-index:12;"></div>
<div id="info_div" style="position:fixed; right: 5%;top: 5%; z-index:12;">
<table class="info">
<tr><td colspan="2" class="cellinfo">Данные</td></tr>
<tr><td class="cellinfo">Игрок:</td><td class="cellinfo"><div id="player"></div><td></tr>
<tr><td class="cellinfo">Население:</td><td class="cellinfo"><div id="qty"></div></td></tr>
</table>
</div>
</body>
</html>
main.js
//Эта функция, как уже упоминалось поможет нам вызывать содержимое из другого файла, не перегружая текущий, открытый в браузере игрока
function ajaxobj()
{
var objXMLHttp = null;
if (window.XMLHttpRequest)
{
objXMLHttp = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return objXMLHttp;
}
//А пока что создадим функцию draw_field (которая, принимает в качестве аргументов наши рассчитанные координаты центрирования карты)
function draw_field( x, y ){
var r = parseInt(Math.random()*1000000000000000);
m = ajaxobj();
m.open('GET', 'fld.php?x='+x+'&y='+y+'&r='+r,false);
m.send(null);
if((m.readyState == 4) && (m.status == 200)) {
fld_div.innerHTML = m.responseText;
cur_x = x; cur_y = y;
}
}
//это значит что к картинке прикручено событие щелчка мыши ( onclick - значит "при щелчке левой кнопкой мыши").
//Это событие приводит к срабатыванию JavaScript функции map_go_pos.
//Эта функция срабатывает при щелчке на всех четырех картинках навигации карты, вот только аргументы,
//передаваемые в нее - разные.
function map_go_pos(dx,dy){
if( ((cur_x-3+dx)>0) && ((cur_x+3+dx)<=15) ) cur_x += dx;
if( ((cur_y-3+dy)>0) && ((cur_y+3+dy)<=15) ) cur_y += dy;
draw_field( cur_x, cur_y );
}
//Это событие вызывает JavaScript функцию say_owner, в которую передается ник игрока, полученный из таблицы users
function say_owner( s ){
player.innerHTML = s;
}
fld.php
<?php
session_start();
include_once ("cone.php");
$login= $_SESSION['login'];
$query_us = mysql_query("select * from users where login='$login'") or die("stop: ".mysql_error());
$row_us = mysql_fetch_array($query_us);
$id_us = $row_us['id'];
if( ( $_GET['x'] != '' ) && ( $_GET['y'] != '' ) ){
$middle_x = $_GET['x'];
$middle_y = $_GET['y'];
$left_x = $middle_x - 3;
$top_y = $middle_y - 3;
$res = mysql_query("SELECT fid, login, xcoord, ycoord, fid_type, f.usr_id FROM fields f
left join users u on u.id = f.usr_id
WHERE xcoord>=$left_x
and xcoord<$left_x+7
and ycoord>=$top_y
and ycoord<$top_y+7",$link ) ;
$x_coord = 0;
$y_coord = 0;
$x_coord_start = 315;
$y_coord_start = 288;
$x = 1;
$y = 1;
$x_coord = $x_coord_start;
$y_coord = $y_coord_start;
while ($row = mysql_fetch_array( $res )) {
$usr_id = $row["usr_id"];
$fid = $row["fid"];
$nick = $row["login"];
$fid_type = $row["fid_type"];
$xcoord = $row["xcoord"];
$ycoord = $row["ycoord"];
$x1 = 0; $y1 = 20;
$x2 = 36; $y2 = 0;
$x3 = 73; $y3 = 20;
$x4 = 36; $y4 = 41;
if ( $usr_id !=0 ){
if ( $usr_id == $id_us ){
// відображення квадрата карти, або відображення поселення якщо цей квадрат вже зайнятий.
echo "<MAP Name='FPMap1$fid'>";
echo "<AREA Shape='Polygon' coords = '$x1,$y1,$x2,$y2,$x3,$y3,$x4,$y4' onmouseover=\"say_owner('".$nick."')\"></MAP>";
echo '<div style="position:absolute;left:'.$x_coord.'px;top:'.$y_coord.'px;width:73px; height:41px; z-index:12;z-index:12">
<IMG SRC="img/fld200.png" border="0" USEMAP="#FPMap1'.$fid.'" ISMAP"></div>';
} else {
echo "<MAP Name='FPMap1$fid'>";
echo "<AREA Shape='Polygon' coords = '$x1,$y1,$x2,$y2,$x3,$y3,$x4,$y4' onmouseover=\"say_owner('".$nick."')\"></MAP>";
echo '<div style="position:absolute;left:'.$x_coord.'px;top:'.$y_coord.'px;width:73px; height:41px; z-index:12;z-index:12">
<IMG SRC="img/fld100.png" border="0" USEMAP="#FPMap1'.$fid.'" ISMAP"></div>';
}
} else {
echo "<MAP Name='FPMap1$fid'>";
echo "<AREA Shape='Polygon' coords = '$x1,$y1,$x2,$y2,$x3,$y3,$x4,$y4' onmouseover=\"say_owner('".$nick."')\"></MAP>";
echo '<div style="position:absolute;left:'.$x_coord.'px;top:'.$y_coord.'px;width:73px; height:41px; z-index:12;z-index:12">
<IMG SRC="img/fld'.$fid_type.'.png" border="0" USEMAP="#FPMap1'.$fid.'" ISMAP"></div>';
}
$x_coord += 40;
$y_coord -= 22;
if ($x++ >= 7 ){
$x = 1;
$y++;
$y_coord_start += 22;
$y_coord = $y_coord_start;
$x_coord_start += 40;
$x_coord =
$x_coord_start;
}
}
$x_coord = 299;
$y_coord = 278;
// Отрисуем номера полей
// for($i=1; $i<=7; $i++){
// номера по горизонтали
// echo '<div style="position:absolute;left:'.$x_coord.'px;top:'.$y_coord.'px;width:73px; height:41px; z-index:12;z-index:12">'.$left_x++.'</div>';
// $x_coord += 40;
// $y_coord -= 22;
// }
// $x_coord = 295;
// $y_coord = 319;
// for($i=1; $i<=7; $i++){
// номера по вертикали
// echo '<div style="position:absolute;left:'.$x_coord.'px;top:'.$y_coord.'px;width:73px; height:41px; z-index:12;z-index:12">'.$top_y++.'</div>';
// $x_coord += 40;
// $y_coord += 22;
// }
} else echo 'error!';
// стрілки для прокручування карти
echo '<div style="position:absolute;left:390px;top:180px;width:73px; height:41px; z-index:12;z-index:12">
<IMG SRC="img/ar_up.png" onclick="map_go_pos(0,-1)"></div>';
echo '<div style="position:absolute;left:735px;top:385px;width:73px; height:41px; z-index:12;z-index:12">
<IMG SRC="img/ar_dn.png" onclick="map_go_pos(0,1)"></div>';
echo '<div style="position:absolute;left:740px;top:180px;width:73px; height:41px; z-index:12;z-index:12">
<IMG SRC="img/ar_right.png" onclick="map_go_pos(1,0)"></div>';
echo '<div style="position:absolute;left:385px;top:385px;width:73px; height:41px; z-index:12;z-index:12">
<IMG SRC="img/ar_left.png" onclick="map_go_pos(-1,0)"></div>';
?>