Урок по созданию браузерной игры № 11
| |
Assasin | Дата: Понедельник, 30 Ноября 2009, 16:14 | Сообщение # 1 |
web-coder
Сейчас нет на сайте
| В данном уроке мы научимся делать квест и Журнал квестов, довольно примитивно, но главное что б понять основу, а дальше дело полетит на всех парах Начнем с квеста, создадим файл quest.mxml и записываем такой код: Code <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow showCloseButton="true" layout="absolute" width="400" height="300" creationComplete="questComp()" close="handleClose(event)" xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script><![CDATA[ import mx.managers.PopUpManager; import mx.events.CloseEvent; import mx.rpc.events.ResultEvent; /* При открытии окна квеста отправляються данные в php скрипт */ public function questComp():void { questText.text = "Помогите!!! Спасите!!! Странник, убей этого монстра! Он хочет меня сьесть!"; questScr.send(); } /* Закрываем окно квеста */ public function handleClose(evt:CloseEvent):void { PopUpManager.removePopUp(this); } /* Проверяем выполнен ли квест */ public function onResult(e:ResultEvent):void { if (int(e.result) > 0) { } else { switch (int(String(e.result))) { case -1 : questText.text = "Ты не выполнил квест!"; break; case -2 : questText.text = "Поздравляю тебя странник, ты прoшел испытание!"; break; } } } ]]></mx:Script> <mx:HTTPService id="questScr" method="POST" useProxy="false" resultFormat="text" result="onResult(event)" url="quest.php"/> <mx:Label text="Монстры, монстры..." x="128" y="18" width="119" height="18"/> <mx:Button label="Ок" click="questComp()" x="138" y="216" width="107" height="22"/> <mx:TextArea id="questText" editable="false" borderColor="white" x="68" y="152" width="300" height="60"/> <mx:Image source="img/face01.png" x="134" y="40" width="90" height="90"/> </mx:TitleWindow> Мы создали всплывающее окно в котором будет даваться квест, для того что б это окно работало разкоментируйте строки в файле GameField.mxml. Теперь приступаем к php скрипту, создайте файл quest.php: Code <?php session_start();
include "conf.php";
$data = mysql_connect($base_name, $base_user, $base_pass); if(!$data){ echo "<BR>"; echo mysql_error(); die(); } mysql_select_db($db_name);
$row = mysql_fetch_array(mysql_query("SELECT * FROM quest WHERE name_q='".$_SESSION['name']."'"));
if ($row['name_q'] != $_SESSION['name']) { mysql_query("INSERT INTO quest (name_q, cont_quest, kill_quest) VALUES ('".$_SESSION['name']."','no', '0')"); } else { $row2 = mysql_fetch_array(mysql_query("SELECT * FROM quest WHERE name_q='".$_SESSION['name']."'"));
if ($row2['kill_quest'] == '0') { echo '-1'; exit; } elseif ($row2['kill_quest'] == '1') { echo '-2'; exit; }
if ($row2['cont_quest'] == 'no'){ echo '-1'; exit; } else { echo '-2'; exit; } } ?> Сначала проверяеться взял ли игрок данный квест, если взял, то выводим прошел его или нет, если не взял, то пишем что квест не взят. Заходим в phpMyAdmin в нашу таблицу и находим столбец quest, добавляем к нему еще одно значение, а именно name_q CHAR(32), как добавить надеюсь вы помните. Данный квест пока выполнить проблематично, так как мы еще не создали бой, а в квесте как раз просят убить 1 монстра. Теперь приступаем к Журналу квестов, во ФД создаем файл journal.mxml и записываем следующее: Code <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow showCloseButton="true" layout="absolute" width="450" height="300" close="handleClose(event)" creationComplete="questComp()" 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 compQuest:String; public function handleClose(evt:CloseEvent):void { PopUpManager.removePopUp(this); } public function questComp():void { questJour.send(); } public function onResult(e:ResultEvent):void { //обработка результатов и ошибок compQuest = String(e.result); compQ.text = compQuest; } ]]></mx:Script> <mx:HTTPService id="questJour" useProxy="false" method="POST" result="onResult(event)" resultFormat="text" url="journal.php"/> <mx:Label text="Монстры, монстры..." x="25" y="14" width="119" height="18"/> <mx:TextArea text="Нужно убить одного монстра." borderColor="white" backgroundColor="white" x="23" y="45" width="160" height="44"/> <mx:Text id="compQ" text="Text" x="25" y="92" width="140" height="22"/> </mx:TitleWindow> Файл маленький, выводит всего навсего выполнен квест или нет Нужно что б это окно всплывало, для этого открываем ранее созданый файл menu.mxml и добавляем еще одну функцию: Code public function journalQ():void { var popupJournal:journal = journal(PopUpManager.createPopUp(this, journal, false)); popupJournal.x = 180; popupJournal.y = 80; popupJournal.title = "Журнал квестов"; } И немного изменяем в этом же файле данную строку: Code <mx:Button label="Журнал квестов" x="170" y="0" width="123" height="22"/> На эту: Code <mx:Button click="journalQ()" label="Журнал квестов" x="170" y="0" width="123" height="22"/> И последнее что нужно это создать файл journal.php, вот его код: Code <?php session_start();
include "conf.php";
$data = mysql_connect($base_name, $base_user, $base_pass); if(!$data){ echo "<BR>"; echo mysql_error(); die(); } mysql_select_db($db_name);
$row = mysql_fetch_array(mysql_query("SELECT * FROM quest WHERE name_q='".$_SESSION['name']."'"));
if ($row['cont_quest'] == 'no'){ echo "не завершен."; exit; } elseif ($row['cont_quest'] == 'yes') { echo "завершен!"; exit; } else { echo "Квест не взят!"; exit; } ?> Проверка на взятие квеста, ничего сложного Надеюсь вы справитесь, если что то не понятно — жду вопросы При копировании материала ссылка на источник обязательна!
|
|
| |
B1zDelKin | Дата: Вторник, 15 Декабря 2009, 21:11 | Сообщение # 2 |
частый гость
Сейчас нет на сайте
| У меня возникла проблема с открытием всплывающих окон. В браузере они иногда либо вовсе не грузятся (помогает только F5), либо грузится только какая-то одна из флешек (квест из игрового поля или н-р профиль из меню). Не было ли у Вас таких проблем, и мб подскажете в чем может быть загвоздка? С уважением
|
|
| |
Assasin | Дата: Среда, 16 Декабря 2009, 13:33 | Сообщение # 3 |
web-coder
Сейчас нет на сайте
| У меня такая же проблемма, думаю что б ее решить нужно меню сделать не отдельной флешкой(как сейчас), а создать во флешке GameField.swf
|
|
| |
B1zDelKin | Дата: Пятница, 18 Декабря 2009, 14:03 | Сообщение # 4 |
частый гость
Сейчас нет на сайте
| Тем не менее, как то трудно верится что это именно "невозможно" (хотя гугль пытается уверить, что никто до нас не пытался вызывать окошки из разных флешек ). Решил протестить сей момент на Flex sdk 4... и о чудо! Окошки всплывают согласно здравому смыслу. Думается, что Адоб, усердно ратующие за использование мульти-свф для большей интерактивности и разделения обновляемого контента, вряд ли забыло о всплывающих окнах. Выход должен быть... хотя возможно это "using flex 4" Добавлено (18.12.2009, 14:03) --------------------------------------------- Помещаем все функции вызова в GameWindow.mxml (н-р функция gotoNPC() ) На их место помещаем функцию следующего вида: public function callNPC():void { FlexGlobals.topLevelApplication.gotoNPC(); } и добовим в импорты import mx.core.FlexGlobals; Теперь все окошки будут всплывать из одной флешки и у ним можно будет применять все методы.
Сообщение отредактировал B1zDelKin - Среда, 16 Декабря 2009, 14:09 |
|
| |
Assasin | Дата: Пятница, 18 Декабря 2009, 14:46 | Сообщение # 5 |
web-coder
Сейчас нет на сайте
| Но данной функции нету во ФД.
|
|
| |
B1zDelKin | Дата: Воскресенье, 03 Января 2010, 13:34 | Сообщение # 6 |
частый гость
Сейчас нет на сайте
| Действительно. Но способ обратиться к методам GameWindow явно не один. Флекса не знаю, рытье в референсах дало только этот способ... может parent, parentApplication или parentDocumentДобавлено (03.01.2010, 13:34) --------------------------------------------- FlexGlobals.topLevelApplication.gotoNPC(); на: Application.application.gotoNPC();
|
|
| |
Assasin | Дата: Воскресенье, 03 Января 2010, 15:09 | Сообщение # 7 |
web-coder
Сейчас нет на сайте
| B1zDelKin, Надеюсь вы провряли на работоспособность код, а то сейчас не имею возможности проверить.
|
|
| |
B1zDelKin | Дата: Среда, 06 Января 2010, 17:07 | Сообщение # 8 |
частый гость
Сейчас нет на сайте
| Проверил, в FD Application.application работает. FlexGlobals более новая и чуть более функциональная фича, но в данном случае это не играет никакой роли. Добавлено (06.01.2010, 17:07) --------------------------------------------- Пожалуй добавлю конкретный пример с некоторыми косметическими изменениями, иллюстрирующий использование. Код аналога GameWindow : Code <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="600" height="400"> <mx:Script> <![CDATA[ import mx.core.IFlexDisplayObject; import mx.managers.PopUpManager; private var popup:IFlexDisplayObject; // создаем переменную для всплывающего окна //// функция вызова окна, принимающая аргумент, указывающий на компаненту окна (н-р, profil, inventar) public function callPOPUP(win:Class): void { PopUpManager.removePopUp(popup); // если окно было вызвано - убираем (во избежание открытия множества одинаковых) popup = PopUpManager.createPopUp(this,win,false); // вызываем новое PopUpManager.centerPopUp(popup); // центрируем окно } ]]> </mx:Script> <mx:SWFLoader x="200" y="100" width="200" height="200" source="GameField.swf" /> </mx:Application> Тут я счел удобным создать одну переменную для хранения всплывающих окон. Во-первых, это позволяет использовать одну переменную для всех окон в игре (экономия кода). Во-вторых, не позволяет замусорить игровое просторанство (также вопрос безопасности: возникновение различных глюков связанных с манипуляциями в нескольких окнах). Но, если требуется, то всегда можно создать несколько переменных по типу (н-р, npc, traders, char_info и тд) или для каждого окна отдельно. Код игрового поля, аналога GameField : Code <?xml version="1.0" encoding="utf-8"?> <mx:Application width="200" height="200" xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script><![CDATA[ public function gotoPOPUP(win:Class): void { Application.application.callPOPUP(win); // вызываем функцию из GameWindow } ]]></mx:Script> <mx:Button label="Профиль" click="gotoPOPUP(popupEx)" x="52" y="34" width="100" height="22"/> <mx:Button label="Инвентарь" click="gotoPOPUP(popupEx)" x="52" y="69" width="100" height="22"/> <mx:Button label="Квесты" click="gotoPOPUP(popupEx)" x="51" y="109" width="100" height="22"/> </mx:Application> click="gotoPOPUP(popupEx)" агрументом данной функции является имя компоненты-окна, которое мы собираемся вызвать. В данном случая это должны быть profil, inventar, quests.
|
|
| |
Assasin | Дата: Суббота, 09 Января 2010, 20:50 | Сообщение # 9 |
web-coder
Сейчас нет на сайте
| Спасибо, просто при написании данных уроков я сам учился, поэтому многого не знаю
|
|
| |
B1zDelKin | Дата: Воскресенье, 10 Января 2010, 16:27 | Сообщение # 10 |
частый гость
Сейчас нет на сайте
| Аналогично колега (с)
|
|
| |
Assasin | Дата: Воскресенье, 10 Января 2010, 18:22 | Сообщение # 11 |
web-coder
Сейчас нет на сайте
| В 13 уроке более подробнее опишу куда вставить твой код, а то будет туча вопросов Проверил все работает, щас вот битву делаю в нескольких видах. Так что скоро 13 урок.
|
|
| |
hellground | Дата: Суббота, 20 Марта 2010, 04:13 | Сообщение # 12 |
был не раз
Сейчас нет на сайте
| ааааа ну сделай пожалуйста этот 13 урок ! я тебя умоляю просто Добавлено (20.03.2010, 03:31) --------------------------------------------- B1zDelKin адаптируй код пожалуйста для GameWindow.swf Добавлено (20.03.2010, 03:42) --------------------------------------------- вроде бы в нём разобрался, только логаут надо добавить) Добавлено (20.03.2010, 03:57) --------------------------------------------- мда gotopopup не понимает такую фукцию... Добавлено (20.03.2010, 04:02) --------------------------------------------- с 0 тоже не работает в FlashDevelop AS3 Добавлено (20.03.2010, 04:13) --------------------------------------------- вроде разобрался немножечко хд просто FD незнает функцию popupEx для этого нужны базы Flex Globals только в инете я даже близко не нашёл как их поставить и где их скачать(вообще ничего не ищет) так что если можно объясни что за база и как её подключить к FD
|
|
| |
Assasin | Дата: Суббота, 20 Марта 2010, 13:53 | Сообщение # 13 |
web-coder
Сейчас нет на сайте
| hellground, GameWindow.mxml: Code <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="800" height="600"> <mx:Script> <![CDATA[ import mx.core.IFlexDisplayObject; import mx.managers.PopUpManager; private var popup:IFlexDisplayObject; // создаем переменную для всплывающего окна //// функция вызова окна, принимающая аргумент, указывающий на компаненту окна (н-р, profil, inventar) public function callPOPUP(win:Class): void { PopUpManager.removePopUp(popup); // если окно было вызвано - убираем (во избежание открытия множества одинаковых) popup = PopUpManager.createPopUp(this,win,false); // вызываем новое PopUpManager.centerPopUp(popup); // центрируем окно } ]]> </mx:Script> <mx:SWFLoader source="chat.swf" x="0" y="450" width="800" height="150"/> <mx:SWFLoader x="0" y="0" width="800" height="450" source="GameField.swf" /> </mx:Application> GameFiled.mxml: Code <?xml version="1.0" encoding="utf-8"?> <mx:Application layout="absolute" width="800" height="450" backgroundImage="img/bg01.jpg" xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script><![CDATA[ import mx.managers.PopUpManager; import mx.effects.*; public function gotoPOPUP(win:Class): void { Application.application.callPOPUP(win); // вызываем функцию из GameWindow } private function logout():void { var logoutLink:URLRequest = new URLRequest("logout.php"); navigateToURL(logoutLink, "_self"); } ]]></mx:Script> <mx:Glow id="glowImage" duration="250" alphaFrom="1" alphaTo=".3" blurXFrom="0.0" blurXTo="50" blurYFrom="0.0" blurYTo="50" color="0x00FF00"/> <mx:Glow id="unglowImage" duration="250" alphaFrom=".3" alphaTo="1.0" blurXFrom="50.0" blurXTo="0.0" blurYFrom="50.0" blurYTo="0.0" color="0x00FF00"/> <mx:Button label="Профиль" click="gotoPOPUP(profil)" x="175" y="2" width="100" height="22"/> <mx:Button label="Инвентарь" click="gotoPOPUP(inventar)" x="274" y="2" width="100" height="22"/> <mx:Button label="Журнал квестов" click="gotoPOPUP(journal)" x="373" y="2" width="123" height="22"/> <mx:Button label="Выход" click="logout()" x="495" y="2" width="100" height="22"/> <mx:Image source="img/monster.png" x="388" y="236" width="150" height="200" click="gotoPOPUP(mstr)" mouseDownEffect="{glowImage}" mouseUpEffect="{unglowImage}" rollOverEffect="{glowImage}" rollOutEffect="{unglowImage}"/> <mx:Image source="img/npc.png" x="63" y="172" width="150" height="200" click="gotoPOPUP(quest)" mouseDownEffect="{glowImage}" mouseUpEffect="{unglowImage}" rollOverEffect="{glowImage}" rollOutEffect="{unglowImage}"/> </mx:Application>
|
|
| |
hellground | Дата: Понедельник, 22 Марта 2010, 08:35 | Сообщение # 14 |
был не раз
Сейчас нет на сайте
| сделал по иному(просто в файл GameWindow меню добавил) НО я рад что ты здесь появляешься! Добавлено (22.03.2010, 08:35) --------------------------------------------- не надо в GameField.... у вас же верхнее меню на всех страницах будет? проще в GameWindow сделать
|
|
| |
11sD | Дата: Воскресенье, 09 Мая 2010, 20:10 | Сообщение # 15 |
был не раз
Сейчас нет на сайте
| Какая плохая реакция браузера от Гугл на все эти флешки... Например Журнал квестов вообще не открывается, а Инвентарь и Инфа о персонаже через раз, если повезёт Зато в IE всё пашет как надо.
|
|
| |
B1zDelKin | Дата: Понедельник, 10 Мая 2010, 20:59 | Сообщение # 16 |
частый гость
Сейчас нет на сайте
| Ваше утверждение вызывает во мне бурю негодования... флекс работает через FPlayer ... если он работает, то работает и флекс. Другое дело, что поддержка браузеров в FP делается не сразу.. и конечно первый в очереди тут ослик. Flex Работает во всех обраузерах одинаково хорошо в большинстве случаев... за редкими специфическими исключениями, которых в данном проекте не присутствует. НЕ ГОНИ НА МАТЬ!!! (с)
|
|
| |
11sD | Дата: Вторник, 11 Мая 2010, 00:47 | Сообщение # 17 |
был не раз
Сейчас нет на сайте
| Моё утверждение, это увиденный мною факт. И реакция Хрома на него такова: 10 перезагрузок страницы- меню не работает. Оставляю страницу на 5 минут, работают только 2-а пункта меню Но "Выход" работает всегда А в Осле всё пашет.
|
|
| |
B1zDelKin | Дата: Вторник, 11 Мая 2010, 10:20 | Сообщение # 18 |
частый гость
Сейчас нет на сайте
| Хочется верить, что Вы обратили свое внимание на 13 пост Ассасина ) Если и с учетом этого у вас проблемы... то это магия ) в программировании такое бывает
|
|
| |
todin | Дата: Четверг, 13 Января 2011, 21:33 | Сообщение # 19 |
был не раз
Сейчас нет на сайте
| Подскажите, как можно изменить всплывающее окно, на границы картинки добавить, че в этом роде, или как можно сделать окно самому?, и еще как добавить анимирование swf файлы сделанные в flash, не получилось загрузи, реально анимацию добавить в игру?
|
|
| |
webstrict666 | Дата: Пятница, 14 Января 2011, 18:15 | Сообщение # 20 |
постоянный участник
Сейчас нет на сайте
| об этом уже рассказывали ... ищите. Или в гугле спросите он подскажет. Добавлено (14.01.2011, 18:15) --------------------------------------------- лучше подскажите как сделать название компании как вот тут в начале игры как входишь пишется название компании emgame.ru
http://GAMESKROL.RU Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
|
|
| |
|