Среда, 24 Апреля 2024, 16:19

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » Урок по созданию браузерной игры № 11 (Создание квеста (php, FD, MySQL))
Урок по созданию браузерной игры № 11
AssasinДата: Понедельник, 30 Ноября 2009, 16:14 | Сообщение # 1
web-coder
Сейчас нет на сайте
В данном уроке мы научимся делать квест и Журнал квестов, довольно примитивно, но главное что б понять основу, а дальше дело полетит на всех парах biggrin
Начнем с квеста, создадим файл 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>

Файл маленький, выводит всего навсего выполнен квест или нет smile

Нужно что б это окно всплывало, для этого открываем ранее созданый файл 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;
}
?>

Проверка на взятие квеста, ничего сложного happy
Надеюсь вы справитесь, если что то не понятно — жду вопросы smile

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

B1zDelKinДата: Вторник, 15 Декабря 2009, 21:11 | Сообщение # 2
частый гость
Сейчас нет на сайте
У меня возникла проблема с открытием всплывающих окон. В браузере они иногда либо вовсе не грузятся (помогает только F5), либо грузится только какая-то одна из флешек (квест из игрового поля или н-р профиль из меню).

Не было ли у Вас таких проблем, и мб подскажете в чем может быть загвоздка?

С уважением

AssasinДата: Среда, 16 Декабря 2009, 13:33 | Сообщение # 3
web-coder
Сейчас нет на сайте
У меня такая же проблемма, думаю что б ее решить нужно меню сделать не отдельной флешкой(как сейчас), а создать во флешке GameField.swf
B1zDelKinДата: Пятница, 18 Декабря 2009, 14:03 | Сообщение # 4
частый гость
Сейчас нет на сайте
Тем не менее, как то трудно верится что это именно "невозможно" (хотя гугль пытается уверить, что никто до нас не пытался вызывать окошки из разных флешек smile ).

Решил протестить сей момент на Flex sdk 4... и о чудо! Окошки всплывают согласно здравому смыслу.
Думается, что Адоб, усердно ратующие за использование мульти-свф для большей интерактивности и разделения обновляемого контента, вряд ли забыло о всплывающих окнах. Выход должен быть... хотя возможно это "using flex 4" smile

Добавлено (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
Сейчас нет на сайте
Спасибо, просто при написании данных уроков я сам учился, поэтому многого не знаю smile
B1zDelKinДата: Воскресенье, 10 Января 2010, 16:27 | Сообщение # 10
частый гость
Сейчас нет на сайте
Аналогично колега (с)
AssasinДата: Воскресенье, 10 Января 2010, 18:22 | Сообщение # 11
web-coder
Сейчас нет на сайте
В 13 уроке более подробнее опишу куда вставить твой код, а то будет туча вопросов happy Проверил все работает, щас вот битву делаю в нескольких видах. Так что скоро 13 урок.
hellgroundДата: Суббота, 20 Марта 2010, 04:13 | Сообщение # 12
был не раз
Сейчас нет на сайте
ааааа ну сделай пожалуйста этот 13 урок ! я тебя умоляю просто icecream sad sad sad sad

Добавлено (20.03.2010, 03:31)
---------------------------------------------
B1zDelKin
адаптируй код пожалуйста cry для 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
был не раз
Сейчас нет на сайте
Какая плохая реакция браузера от Гугл на все эти флешки...
Например Журнал квестов вообще не открывается, а Инвентарь и Инфа о персонаже через раз, если повезёт smile
Зато в IE всё пашет как надо.
B1zDelKinДата: Понедельник, 10 Мая 2010, 20:59 | Сообщение # 16
частый гость
Сейчас нет на сайте
Ваше утверждение вызывает во мне бурю негодования... флекс работает через FPlayer ... если он работает, то работает и флекс. Другое дело, что поддержка браузеров в FP делается не сразу.. и конечно первый в очереди тут ослик.

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

НЕ ГОНИ НА МАТЬ!!! (с) wink

11sDДата: Вторник, 11 Мая 2010, 00:47 | Сообщение # 17
был не раз
Сейчас нет на сайте
Моё утверждение, это увиденный мною факт. И реакция Хрома на него такова:
10 перезагрузок страницы- меню не работает.
Оставляю страницу на 5 минут, работают только 2-а пункта меню smile
Но "Выход" работает всегда smile
А в Осле всё пашет.
B1zDelKinДата: Вторник, 11 Мая 2010, 10:20 | Сообщение # 18
частый гость
Сейчас нет на сайте
Хочется верить, что Вы обратили свое внимание на 13 пост Ассасина ) Если и с учетом этого у вас проблемы... то это магия ) в программировании такое бывает wink
todinДата: Четверг, 13 Января 2011, 21:33 | Сообщение # 19
был не раз
Сейчас нет на сайте
Подскажите, как можно изменить всплывающее окно, на границы картинки добавить, че в этом роде, или как можно сделать окно самому?, и еще как добавить анимирование swf файлы сделанные в flash, не получилось загрузи, реально анимацию добавить в игру?
webstrict666Дата: Пятница, 14 Января 2011, 18:15 | Сообщение # 20
постоянный участник
Сейчас нет на сайте
об этом уже рассказывали ... ищите. Или в гугле спросите он подскажет.

Добавлено (14.01.2011, 18:15)
---------------------------------------------
лучше подскажите как сделать название компании как вот тут в начале игры как входишь пишется название компании emgame.ru


http://GAMESKROL.RU
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » Урок по созданию браузерной игры № 11 (Создание квеста (php, FD, MySQL))
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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