Вторник, 16 Апреля 2024, 23:07

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » Урок по созданию браузерной игры № 8 (Создание инвентаря (php, FD, MySQL))
Урок по созданию браузерной игры № 8
AssasinДата: Суббота, 14 Ноября 2009, 17:31 | Сообщение # 1
web-coder
Сейчас нет на сайте
Вот и 8 урок позади (для меня biggrin ), ох и намучался я с ним, но сделал. Только есть один баг, который я оставляю для вас, надеюсь вы с ним справитесь, а сам баг заключаеться в том, что на какой предмет не нажимай, переместиться только первый в списке. Если не поняли что я написал, то когда сделаете урок и будете его тестировать, то поймете. Также я не сделал изменения характеристик персонажа при надевании или снятии предмета, надеюсь вы справитесь сами.
Начнем с того что нужно добавить новые таблицы в нашу БД, эти таблицы я взял с уроков http://www.blitz-school.info/ , надеюсь разработчики простят меня за сие «злодеяние».
Заходим в phpMyAdmin в нашу БД testgame, во вкладку SQL и записываем код:
Code

CREATE TABLE `items_list` (
`il_id` INT(4) unsigned NOT NULL AUTO_INCREMENT, /*идентификатор предмета*/
`item_type` INT DEFAULT 0, /*Тип предмета : напр. 1 = меч, 2-топор....*/
`item_name` CHAR(50) NOT NULL, /*Название предмета*/
`item_slot_name` CHAR(15) NOT NULL DEFAULT '', /*Слот предмета*/
`item_image` CHAR(32), /*путь к картинке предмета и ее имя*/
`atk` INT(5),
`def` INT(5),
`lov` INT(5),
`life` INT(5),
PRIMARY KEY (`il_id`),
KEY(`item_type`)
) TYPE=MyISAM;

Данная таблица будет содержать весь список предметов, для добавления предметов в таблицу напишем небольшой скрипт, назовем его doc.php:
Code

<?php
include "conf.php";

$data = mysql_connect($base_name, $base_user, $base_pass);
mysql_select_db($db_name);

$query = mysql_query("SELECT * FROM items_list");

if ($_POST['next']){
        mysql_query("INSERT INTO items_list (item_type, item_name, item_slot_name, item_image, atk, def, lov, life) VALUES ('".$_POST['item_type']."', '".$_POST['item_name']."', '".$_POST['item_slot_name']."', '".$_POST['item_image']."', '".$_POST['atk']."', '".$_POST['def']."', '".$_POST['lov']."', '".$_POST['life']."')");
}

?>
<form method="post" action="">
Тип:(1-меч, 2-топор...) <input type="text" name="item_type"><br>
Название: <input type="text" name="item_name"><br>
Слот предмета: <input type="text" name="item_slot_name"><br>
Картинка: <input type="text" name="item_image"><br>
Атака+ : <input type="text" name="item_atk"><br>
Защита+ : <input type="text" name="item_def"><br>
Жизни+ : <input type="text" name="item_life"><br>
Ловкость+ : <input type="text" name="item_lov"><br>
<input type="submit" name="next" value="Next"><br>
</form>
<?php
while ($info = mysql_fetch_array($query)){
echo $info['item_type'].", ".$info['item_name'].", ".$info['item_slot_name'].", <img src='".$info['item_image']."'>, ".$info['atk'].", ".$info['def'].", ".$info['lov'].", ".$info['life']."<br>";
}
?>

Добавляем в БД есче таблицы:

Code

CREATE TABLE `items`(
`it_id` BIGINT(20) unsigned NOT NULL auto_increment, /*уник. идентификатор предмета*/
`il_id` INT(4) unsigned NOT NULL, /* ID предмета в справочнике предметов*/
`item_owner` BIGINT(20) DEFAULT 0 NOT NULL, /*владелец предмета (ID игрока или номер системного объекта)*/
`item_position` INT REFERENCES itemposition_list(`id`), /*позиция предмета*/
PRIMARY KEY (`it_id`),
KEY (`item_owner`)
) TYPE=MyISAM;
/* Справочник позиций предмета */
CREATE Table `itemposition_list`(
`ip_id` INT(4) unsigned NOT NULL AUTO_INCREMENT, /*идентификатор позиции*/
`item_pos_name` CHAR(30), /*Название позиции*/
PRIMARY KEY (`ip_id`)
) TYPE=MyISAM;

INSERT INTO itemposition_list (item_pos_name) VALUES('Рюкзак игрока');
INSERT INTO itemposition_list (item_pos_name) VALUES('Слот игрока');

Теперь приступим к написанию кода. Откройте FD и создайте новый файл, переименовав его на inventar.mxml:

Code

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow showCloseButton="true" layout="absolute" width="250" height="300" close="handleClose(event)" creationComplete="cell()" xmlns:mx="http://www.adobe.com/2006/mxml">
        <mx:Script><![CDATA[
      import mx.managers.PopUpManager;
            import mx.events.CloseEvent;
      import mx.rpc.events.ResultEvent;
          
      private var dataXML:XML = new XML;
       /* Функция закрытия всплывающего окна */
      public function handleClose(evt:CloseEvent):void {
                PopUpManager.removePopUp(this);
            }      
      /* Функция отправки данных для перенесения предмета из инвентаря в слот игрока */
      public function menu_drop():void {
       inventfun.send();
      }
      /* Функция отправки данных для отображения предметов */
      public function cell():void {
       invent.send();
      }
          
      public function onResult(e:ResultEvent):void {
       dataXML = XML(e.result);
       inv_img_0.load(String(dataXML.inv_img_0));
       inv_img_1.load(String(dataXML.inv_img_1));
       inv_img_2.load(String(dataXML.inv_img_2));
       inv_img_3.load(String(dataXML.inv_img_3));
       inv_img_4.load(String(dataXML.inv_img_4));
       inv_img_5.load(String(dataXML.inv_img_5));
      }
     ]]></mx:Script>
        <mx:HTTPService id="invent" useProxy="false" method="POST" result="onResult(event)" resultFormat="xml" url="inv.php"/>
     <mx:HTTPService id="inventfun" useProxy="false" method="POST" url="invfun.php"/>
        <mx:Image id="inv_img_0" click="menu_drop()" x="15" y="12" width="50" height="50"/>
        <mx:Image id="inv_img_1" click="menu_drop()" x="78" y="12" width="50" height="50"/>
        <mx:Image id="inv_img_2" click="menu_drop()" x="150" y="12" width="50" height="50"/>
        <mx:Image id="inv_img_3" click="menu_drop()" x="15" y="94" width="50" height="50"/>
        <mx:Image id="inv_img_4" click="menu_drop()" x="98" y="94" width="50" height="50"/>
        <mx:Image id="inv_img_5" click="menu_drop()" x="160" y="94" width="50" height="50"/>
</mx:TitleWindow>

Как видите это всплывающее окно, для его отображения изменим немного menu.mxml:

Code

<?xml version="1.0" encoding="utf-8"?>
<mx:Application layout="absolute" width="392" height="22" xmlns:mx="http://www.adobe.com/2006/mxml">
     <mx:Script><![CDATA[
     import flash.net.URLRequest;
     import mx.managers.PopUpManager;
         
     public function prof():void {
      var popup:profil = profil(PopUpManager.createPopUp(this, profil, false));
      popup.x = 140;
      popup.y = 100;
      popup.title = "Профиль";
     }
          
     private function logout():void {
      var logoutLink:URLRequest = new URLRequest("logout.php");
      navigateToURL(logoutLink, "_self");
     }     
         
     public function invent():void {
      var popupInv:inventar = inventar(PopUpManager.createPopUp(this, inventar, false));
      popupInv.x = 410;
      popupInv.y = 100;
      popupInv.title = "Инвентарь";
     }
     ]]></mx:Script>
        <mx:Button click="prof()" label="Профиль" x="0" y="0" width="80" height="22"/>
        <mx:Button click="invent()" label="Инвентарь" x="80" y="0" width="90" height="22"/>
        <mx:Button label="Журнал квестов" x="170" y="0" width="123" height="22"/>
        <mx:Button click="logout()" label="Выход" x="292" y="0" width="100" height="22"/>
</mx:Application>

Мы добавили при нажатии на кнопку отображаеться всплывающее окно с инвентарем.
Приступим к написанию скрипта, который будет отображать предметы в инвентаре, назовем его inv.php:

Code

<?php
session_start();

include "conf.php";

$data = mysql_connect($base_name, $base_user, $base_pass);
mysql_select_db($db_name);

$query = mysql_query("SELECT * FROM users WHERE name='".$_SESSION['name']."'");
$row = mysql_fetch_array($query);
$id = $row["id_user"];

// Отобразим содержимое инвентаря
$query1 = mysql_query("SELECT i.it_id, i.item_position, il.item_type, il.item_image, il.item_name FROM items i inner join items_list il on il.il_id=i.il_id WHERE item_owner='".$id."' and item_position='1'");
echo "<?xml version='1.0'?>";
echo "<inv>";
$i = 0;
while ($row1 = mysql_fetch_array($query1)) {
$SlotItemID = $row1["it_id"];
$ItemType = $row1["item_type"];
$ItemImage = $row1["item_image"];
$ItemName = $row1["item_name"];
echo "<inv_img_".$i.">".$ItemImage."</inv_img_".$i.">";
$i++;
}
echo "</inv>";
?>

И добавим скрипт, который будет обрабатывать перемещение предмета из инвентаря в слот чара, назовем его invfun.php:

Code

<?php
session_start();

include "conf.php";

$data = mysql_connect($base_name, $base_user, $base_pass);
mysql_select_db($db_name);

$query = mysql_query("SELECT * FROM users WHERE name='".$_SESSION['name']."'");
$row = mysql_fetch_array($query);
$id = $row["id_user"];

$query1 = mysql_query("SELECT i.it_id, i.item_position, il.item_type, il.item_image, il.item_name FROM items i inner join items_list il on il.il_id=i.il_id WHERE item_owner='".$id."' and item_position='1'");
$row1 = mysql_fetch_array($query1);
$SlotItemID = $row1["it_id"];
//Перемещаем предмет в слот чара
$query2 = mysql_query("UPDATE items SET item_position='2' WHERE it_id='".$SlotItemID."'");
?>

Теперь напишем отображение слотов в Профиле чара, для этого изменим сам профиль, открываем profil.mxml:

Code

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow showCloseButton="true" layout="absolute" width="250" height="400" close="handleClose(event)" creationComplete="profileComplete()" xmlns:mx="http://www.adobe.com/2006/mxml">
        <mx:Script><![CDATA[
                import mx.managers.PopUpManager;
                import mx.events.CloseEvent;
       import mx.rpc.events.ResultEvent;
           
       private var dataXML:XML = new XML;

       public function profileComplete():void {
        profileChar.send();
        invout.send();
       }
           
       public function menu_drop():void {
        invinp.send();
       }
           
       public function onResult(e:ResultEvent):void {  //обработка результатов и ошибок
        dataXML = XML(e.result);
        avatar_img.load(String(dataXML.avatar[0]));
        nameChar.text = dataXML.name[0];
        atk.text = dataXML.atk[0];
        def.text = dataXML.def[0];
        lov.text = dataXML.lov[0];
        life.text = dataXML.life[0];
        lvl.text = dataXML.lvl[0];
        exp.text = dataXML.exp[0];
       }
           
       public function onResult2(e:ResultEvent):void {  //обработка результатов и ошибок
        dataXML = XML(e.result);
        inv_img_0.load(String(dataXML.inv_img_0));
        inv_img_1.load(String(dataXML.inv_img_1));
        inv_img_2.load(String(dataXML.inv_img_2));
        inv_img_3.load(String(dataXML.inv_img_3));
       }
           
                private function handleClose(evt:CloseEvent):void {
                    PopUpManager.removePopUp(this);

                }
            ]]></mx:Script>
        <mx:HTTPService id="profileChar" useProxy="false" method="POST" result="onResult(event)" resultFormat="xml" url="profil.php"/>
     <mx:HTTPService id="invout" useProxy="false" method="POST" result="onResult2(event)" resultFormat="xml" url="invout.php"/>
     <mx:HTTPService id="invinp" useProxy="false" method="POST" url="invinp.php"/>
        <mx:Label id="nameChar" text="1" textAlign="center" x="4" y="6" width="220" height="18"/>
        <mx:Label id="atk" text="2" x="192" y="40" width="30" height="18"/>
        <mx:Label id="def" text="3" x="192" y="58" width="30" height="18"/>
        <mx:Label id="lov" text="4" x="192" y="75" width="30" height="18"/>
        <mx:Label id="life" text="5" x="192" y="93" width="30" height="18"/>
        <mx:Label id="lvl" text="6" x="67" y="29" width="30" height="18"/>
        <mx:Label id="exp" text="7" x="180" y="111" width="45" height="18"/>
        <mx:Image id="avatar_img" x="12" y="54" width="120" height="200"/>
        <mx:Label text="Атака" x="140" y="40" width="38" height="18"/>
        <mx:Label text="Защита" x="139" y="57" width="47" height="18"/>
        <mx:Label text="Ловкость" x="134" y="75" width="55" height="18"/>
        <mx:Label text="Жизни" x="141" y="94" width="40" height="18"/>
        <mx:Label text="Опыт" x="140" y="111" width="36" height="18"/>
        <mx:Image id="inv_img_0" click="menu_drop()" x="8" y="255" width="50" height="50"/>
        <mx:Image id="inv_img_1" click="menu_drop()" x="60" y="255" width="50" height="50"/>
        <mx:Image id="inv_img_2" click="menu_drop()" x="115" y="255" width="50" height="50"/>
        <mx:Image id="inv_img_3" click="menu_drop()" x="167" y="255" width="50" height="50"/>
</mx:TitleWindow>

Теперь отобразим предметы в слотах, создадим файл invout.php:

Code

<?php
session_start();

include "conf.php";

$data = mysql_connect($base_name, $base_user, $base_pass);
mysql_select_db($db_name);

$query = mysql_query("SELECT * FROM users WHERE name='".$_SESSION['name']."'");
$row = mysql_fetch_array($query);
$id = $row["id_user"];

// Отобразим содержимое слотов
$query1 = mysql_query("SELECT i.it_id, i.item_position, il.item_type, il.item_image, il.item_name FROM items i inner join items_list il on il.il_id=i.il_id WHERE item_owner='".$id."' and item_position='2'");
echo "<?xml version='1.0'?>";
echo "<inv>";
$i = 0;
while ($row1 = mysql_fetch_array($query1)) {
$SlotItemID = $row1["it_id"];
$ItemType = $row1["item_type"];
$ItemImage = $row1["item_image"];
$ItemName = $row1["item_name"];
echo "<inv_img_".$i.">".$ItemImage."</inv_img_".$i.">";
$i++;
}
echo "</inv>";
?>

И осталось отобразить функцию перемещения предметов в инвентарь, создадим файл invinp.php:

Code

<?php
session_start();

include "conf.php";

$data = mysql_connect($base_name, $base_user, $base_pass);
mysql_select_db($db_name);

$query = mysql_query("SELECT * FROM users WHERE name='".$_SESSION['name']."'");
$row = mysql_fetch_array($query);
$id = $row["id_user"];

$query1 = mysql_query("SELECT i.it_id, i.item_position, il.item_type, il.item_image, il.item_name FROM items i inner join items_list il on il.il_id=i.il_id WHERE item_owner='".$id."' and item_position='2'");
$row1 = mysql_fetch_array($query1);
$SlotItemID = $row1["it_id"];
//Перемещаем предмет в инвентарь
$query2 = mysql_query("UPDATE items SET item_position='1' WHERE it_id='".$SlotItemID."'");
?>

Вот с инвентарем закончили, надеюсь вы справились, так как комментариев меньше чем в предыдущих уроков. Я думаю вы и так знаете что означает та или иная функция, так как в предыдущих уроках я описывал их.

При копировании материала ссылка на источник обязательна!

stanislavДата: Суббота, 14 Ноября 2009, 18:08 | Сообщение # 2
Кролик Тёрнер
Сейчас нет на сайте
Спасибо за урок happy

Добавлено (14.11.2009, 18:08)
---------------------------------------------
Давно искал)

MorganДата: Понедельник, 23 Ноября 2009, 11:06 | Сообщение # 3
был не раз
Сейчас нет на сайте
Большое тебе спасибо за уроки))) Они очень помогают))) Хотел бы узнать когда будут еще?
AssasinДата: Понедельник, 23 Ноября 2009, 18:33 | Сообщение # 4
web-coder
Сейчас нет на сайте
Да вот на днях думаю выложу smile
ЭлектрикДата: Суббота, 12 Декабря 2009, 23:47 | Сообщение # 5
был не раз
Сейчас нет на сайте
у меня картинки невидно, а инвентарь вобще пустой
Прикрепления: 2669151.jpg (53.5 Kb)
AssasinДата: Воскресенье, 13 Декабря 2009, 13:36 | Сообщение # 6
web-coder
Сейчас нет на сайте
Цитирую из 6 урока:
Quote
echo 'img/'.$row2['vid'].'.png';

Тоесть картинка должна находиться в папке img с именем:
1-1.png, 1-2.png, 1-3.png, 1-4.png(мужские), 2-1.png, 2-2.png, 2-3.png, 2-4.png(женские)

Инвентарь пустой, так как в него ничего не добавили. Для того что б добавить вещи, в адресной строке браузера введите http://localhost/doc.php и заполните поля, это вы добавите 1 вещь. Подобавляйте сколько вам нужно, затем переходите в phpmyadmin, в таблицу items и нажмите на вкладку "Вставить", и заполните все 4 поля значением 1 (картинка)
Теперь опишу подробнее каждую ячейку:
it_id - уник. идентификатор предмета(его можно не заполнять, он автоматически заполняеться)
il_id - id предмета в справочнике предметов(соответствует id из items_list)
item_owner - владелец предмета (соответствует id игрока из users)
item_position - позиция предмета(1-рюкзак игрока, 2-в инвентаре игрока)

Если возникнуть еще вопросы - задавай.

АвряДата: Понедельник, 04 Января 2010, 15:49 | Сообщение # 7
был не раз
Сейчас нет на сайте
У меня почемуто не всегда открывается инвентарь, сколько ни жму, не открывается
AssasinДата: Понедельник, 04 Января 2010, 17:41 | Сообщение # 8
web-coder
Сейчас нет на сайте
Quote (Авря)
У меня почемуто не всегда открывается инвентарь, сколько ни жму, не открывается

клик
hellgroundДата: Суббота, 20 Марта 2010, 10:29 | Сообщение # 9
был не раз
Сейчас нет на сайте
всё работает кроме перетаскивания предметов(из слота не снять в слот не одеть из сумки) всё скопировал правильно ( или это ещё не реализовано?
только через таблицу руками перетаскивается... а из игры ни как(


Сообщение отредактировал hellground - Суббота, 20 Марта 2010, 10:31
AssasinДата: Суббота, 20 Марта 2010, 13:51 | Сообщение # 10
web-coder
Сейчас нет на сайте
Они не перетаскиваются, жмешь на предмет и он автоматически в рюкзаке или у игрока. Просто нужно закрыть окно, а потом снова открыть.
B1zDelKinДата: Суббота, 20 Марта 2010, 14:17 | Сообщение # 11
частый гость
Сейчас нет на сайте
Ой, а я и не заметил, что так) Для того, чтобы видеть результаты манипуляций с вещами... просто сервису снятия/одевания вещи добавить нужно обработчик события, который в случае успешного завершения операции пошлет новый запрос, в данном случае invent.send() .

Выглядеть это может примерно так:

private function onDropResult(e:ResultEvent):void
{
if (int(e.result) == 1)
Alert.show("Недостаточно места в инвентаре, чтобы снять вещь");
else if () /// .... дургие ошибки возможные

else // если сообщений об ошибках нет
invent.send();
}

Результаты несоменно должны сразу появляться) Пользоваться такой мощной асинхронностью и не показывать этого... преступление)

Сообщение отредактировал B1zDelKin - Суббота, 20 Марта 2010, 14:18
vohakisaДата: Четверг, 15 Апреля 2010, 11:36 | Сообщение # 12
был не раз
Сейчас нет на сайте
Насколько я понял, добавление строки "invent.send()" в функцию "menu_drop()" уже должно визуально убирать итем с инвентаря. Или нет? А то я себе так сделал и всё осталось по старому.
kristinaДата: Суббота, 01 Мая 2010, 13:41 | Сообщение # 13
был не раз
Сейчас нет на сайте
Quote (Assasin)
CREATE TABLE `items_list` ( `il_id` INT(4) unsigned NOT NULL AUTO_INCREMENT, /*идентификатор предмета*/ `item_type` INT DEFAULT 0, /*Тип предмета : напр. 1 = меч, 2-топор....*/ `item_name` CHAR(50) NOT NULL, /*Название предмета*/ `item_slot_name` CHAR(15) NOT NULL DEFAULT '', /*Слот предмета*/ `item_image` CHAR(32), /*путь к картинке предмета и ее имя*/ `atk` INT(5), `def` INT(5), `lov` INT(5), `life` INT(5), PRIMARY KEY (`il_id`), KEY(`item_type`) ) TYPE=MyISAM;

вот что выдаёт:
#1046 - No database selected

wernherДата: Воскресенье, 02 Мая 2010, 09:59 | Сообщение # 14
Only God is Perfect
Сейчас нет на сайте
kristina, поверь настройки подключения к базе данных.
Если заливаешь через phpMyAdmin, то сначало выбери базу, уже потом выполняй запрос.




Сообщение отредактировал wernher - Воскресенье, 02 Мая 2010, 10:00
11sDДата: Воскресенье, 09 Мая 2010, 18:38 | Сообщение # 15
был не раз
Сейчас нет на сайте
С каждым уроком, у меня получается 70% рабочего кода.
При простом копипасте ничего не работает.
То где- то вместо <?php стоит <=, то где- то отсутствует include и т.д, т.д, т.д. Неужели нельзя писать полностью рабочий код. Мало того что чужой код плохо воспринимается, так там ещё и куча ляпов.
Сейчас у меня более 20 файлов и искать в каком же файле ошибка, это многочасовой анонизм...
Бесят это, но я дойду до конца)
AssasinДата: Воскресенье, 09 Мая 2010, 20:26 | Сообщение # 16
web-coder
Сейчас нет на сайте
11sD, это не от меня зависит, все претензии к ucoz'у.
Omegas755Дата: Четверг, 28 Октября 2010, 21:12 | Сообщение # 17
был не раз
Сейчас нет на сайте
у меня ошибки...
1) не работает перетаскивание\надевание вещи
2) Не работает регистрация|вход в опере (тыкаю далее(в регистрации)/войти - обновляется страница и всё) в мозиле всё ОК
67boyДата: Четверг, 28 Октября 2010, 21:18 | Сообщение # 18
заслуженный участник
Сейчас нет на сайте
Omegas755, Ну значит пользуйся мозилой)
Есть такой сайт позже выложу (ищу) тестирует совместимость твоей игры со всеми браузерами какие только есть, надо только ссылку указать!!


bar-u-xolodaДата: Среда, 21 Марта 2012, 12:13 | Сообщение # 19
частый гость
Сейчас нет на сайте
Люди а кто-нить из вас может все что напиcанно на флеше преобразовать в PHP??? ну очень надо biggrin


Создаю MMORPG игру требуются программисты PHP, MySQL.
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » Урок по созданию браузерной игры № 8 (Создание инвентаря (php, FD, MySQL))
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг