Урок по созданию браузерной игры № 8
| |
Assasin | Дата: Суббота, 14 Ноября 2009, 17:31 | Сообщение # 1 |
web-coder
Сейчас нет на сайте
| Вот и 8 урок позади (для меня ), ох и намучался я с ним, но сделал. Только есть один баг, который я оставляю для вас, надеюсь вы с ним справитесь, а сам баг заключаеться в том, что на какой предмет не нажимай, переместиться только первый в списке. Если не поняли что я написал, то когда сделаете урок и будете его тестировать, то поймете. Также я не сделал изменения характеристик персонажа при надевании или снятии предмета, надеюсь вы справитесь сами. Начнем с того что нужно добавить новые таблицы в нашу БД, эти таблицы я взял с уроков 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 |
Кролик Тёрнер
Сейчас нет на сайте
| Спасибо за урок Добавлено (14.11.2009, 18:08) --------------------------------------------- Давно искал)
|
|
| |
Morgan | Дата: Понедельник, 23 Ноября 2009, 11:06 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Большое тебе спасибо за уроки))) Они очень помогают))) Хотел бы узнать когда будут еще?
|
|
| |
Assasin | Дата: Понедельник, 23 Ноября 2009, 18:33 | Сообщение # 4 |
web-coder
Сейчас нет на сайте
| Да вот на днях думаю выложу
|
|
| |
Электрик | Дата: Суббота, 12 Декабря 2009, 23:47 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| у меня картинки невидно, а инвентарь вобще пустой
|
|
| |
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??? ну очень надо
Создаю MMORPG игру требуются программисты PHP, MySQL.
|
|
| |
|