Работа с Player IO API part #1 - setup

1
Player IO — это достаточно мощное и в тоже время простое средство для разработки онлайн игр.

Думаю многие пробывали уже капаться с их апи и серверным кодингом.

Я же попробую сделать маленький туториал для новичков в меру своих сил. На официальном сайте playerio есть достаточно много подробных туториалов и документации по АПИ, однако как мне показалось, многие вещи остались не досказанными, а иногда и просто теряешься в этих документах.

Я на данный момент нахожусь на достаточно начальном уровне навыка работы с playerio, однако думаю будем разбираться вместе что и как да и у меня пойдёт обучение быстрее. Прошу принять во внимание ещё и тот факт что я не программист:) as3 начал изучать совсем недавно, а вот с C# начал знакомство буквально неделю назад.

Собственно начнём.

Разработка онлайн игр с помощью сервиса playerio от нас требует знание языка AS3 (AS2 не поддерживается), базовое знание C# (есть подробная документация по методам на оф. сайте), редактор ас3, и редактор C#(microsft visual 2008, 2010). Хостить нас будет сервис.

Для любителей лицензионных и триал версий, либо вообще бесплатных:

Adobe Flash — http://www.adobe.com/go/tryflash
Visual studio — http://www.microsoft.com/express/download/ (выбираем C# edition)
Player IO API, сервер разработки на локальном хосте с примерами игр — http://playerio.com/download/

Для начала поглядим на тарифные планы.

Для ознакомления нам хватит тарифного плана FREE. Вот на него и регистрируемся.

В админ панели нас попросят создать игру введя название (не обязательно реальное название проекта).


После создания игры нам выдадут уникальный ID (его мы используем чуть позже).


Создаём проект во флеше.

Примерная иерархия для проекта (.fla лежит в папке com):


serverside код кладём в корень.

При этом, глянем на сам этот код. Он не должен иметь пока каких либо функций кроме стандартных. Можно взять готовый код и урезать примерно до такого вида чтобы не путаться для начала:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using PlayerIO.GameLibrary;
using System.Drawing;

namespace ArmaCube {
        public class Player : BasePlayer {
                public string Name;
        }

        public class GameCode : Game<Player> {
                public override void GameStarted() {
                        Console.WriteLine("Game is started: " + RoomId);
                        AddTimer(delegate {
                        }, 100);
                        AddTimer(delegate {
                                RefreshDebugView(); 
                        }, 250);
                }
                public override void GameClosed() {
                        Console.WriteLine("RoomId: " + RoomId);
                }
                public override void UserJoined(Player player) {
                        player.Send("hello");
                        Broadcast("UserJoined", player.Id);
                }
                public override void UserLeft(Player player) {
                        Broadcast("UserLeft", player.Id);
                }
                public override void GotMessage(Player player, Message message) {
                        switch(message.Type) {
                        }
                }

                Point debugPoint;
                public override System.Drawing.Image GenerateDebugImage() {
                        var image = new Bitmap(400,400);
                        using(var g = Graphics.FromImage(image)) {
                                g.FillRectangle(Brushes.Blue, 0, 0, image.Width, image.Height);
                                g.DrawString(DateTime.Now.ToString(), new Font("Verdana",20F),Brushes.Orange, 10,10);
                                g.FillRectangle(Brushes.Red, debugPoint.X,debugPoint.Y,5,5);
                        }
                        return image;
                }
                [DebugAction("Play", DebugAction.Icon.Play)]
                public void PlayNow() {
                        Console.WriteLine("The play button was clicked!");
                }
                [DebugAction("Set Debug Point", DebugAction.Icon.Green)]
                public void SetDebugPoint(int x, int y) {
                        debugPoint = new Point(x,y);
                } 
        }
}


Заходим во вкладку Game code и пишем название игры (название проекта и следовательно swf).

Swf и серверный код назначаем публиковаться в папку Output

Для соединения с сервером мы используем строчку кода вида:

PlayerIO.connect(stage,gameID,"public", nickname,"",handleConnect,handleError);


Где gameID — идентификатор вашей игры полученный ранее занесёный в статическую переменную.

Функции handleConnect, handleError отвечают за удачное соединение и ошибку соединения соответственно.

handleError достаточно только объявить.

А вот с handleConnect стоит малость поработать.

Следующий код подключается к комнате «ArmaCube», либо если таковой не имеется — создаёт её.
private function handleConnect(client:Client) {
                        trace("Connected to server");
                        client.multiplayer.developmentServer="localhost:8184";//комментим чтобы подключаться к серверу в онлайн
                        client.multiplayer.createJoinRoom("test", "ArmaCube",true, {},{},handleJoin,handleError);
}


Опять же handleJoin,handleError — см. выше.

private function handleJoin(conn:Connection):void {
                        connection=conn;
                        connection.addMessageHandler("*",gotMessage);
                        connection.addMessageHandler("hello", function(m:Message){
                                trace("Recived a message with the type hello from the server");                        
                        })
                }


После всех этих экзекуций запускаем девелопер сервер (серверный код) нажатие на зелёную кнопку плей сверху либо шоткатом — ctrl+F5

Публикуем SWF. Если всё сделано правильно, в консоли мы увидим надпись — Recived a message with the type hello from the server. Это значит что мы подключились к серверу на локалхосте, создали тестовую комнату, а сервер в свою очередь при нашём соединении послал нам сообщение «hello» в ответ на приём которого мы сгенерировали событие вывода в консоль строки о получении послания.

После этого, полученный файл ArmaCude.dll лежащий в папке Output можно загрузить на сервер playerio.

Однако, чтобы увидеть пинг от сервера мы должны будем создать как минимум текстовое поле и прописывать туда всё что угодно в случае получения сообщения от серва.

Заходим в админ панель на сайте, кликаем в списке на нашу созданную игру и делаем так:


Выбираем наш .dll
И готово.

Не забудьте в настройках публикации флешки подшаманить local playback security на network.

PS если у кого-то что-либо не получится, или есть вопросы — пишите, будем разбираться.
  • +9

Комментарии (9)

0
Не понятно, где и как создается dll.
0
dll создаётся когда мы компилируем серверный код. И сохраняется в папке аутпат. Если нету там — покапайтесь в папках серверного кода. А ещё лучше — сами назначьте путь сохранения файла в аутпат если его там нету.
+1
ну вот, Руслан, ведь не только тролить умеешь :D
  • z3lf
  • z3lf
0
Когда то попробовал предшественника API — nonoba, очень впечатлило. Смог быстро сам всё установить, настроить, написать простенькую серверную часть, сделать двухплеерного Running MAN'a и помню срубился даже с Женей Яйленко...:) Как только появится время, тоже очень хочу попробовать!
0
Да, было круто! Я тоже тогда загорелся идеей создания мультиплеерного платформера и потихоньку иду к этому) Player.IO очень классная штука — много простой и понятной документации, примеров с исходниками, обсуждений на форуме. Освоить и использовать очень просто. Когда начал изучать его — был крайне впечатлен. Единственное, что было не ясно — как оплачивать сервис, если мультиплеерная игрушка на его основе станет популярной. Либо договариваться, чтобы спонсор оплачивал сервер, либо вставлять рекламу (и между уровнями тоже). Вобщем с монетизацией туманно.
0
Я так предпологаю, что процессы монетизации довольно стандартные — реклама, микро (PayVault) и возможно поддержка со стороны спонсора. Но для начала и раскрутки игры плана ФРИ — с лихвой)
0
честно говоря, если бы не был знаком с Player.IO, то вряд ли бы смог понять что либо в твоей статье. как-то всё сумбурно и запутанно. лично мне проще было официальные доки читать. но пост всё равно полезен, т.к. это первый туториал о Player.IO на русском языке. знаю, что не все легко воспринимают английский и многим будет проще начать знакомство с сервисом с твоего поста. так что плюсую. молодец)
+1
Хм. На самом деле писал как можно внятнее. Дело в том, что для первого пинга от серва на их хосте, мне потребовалось прочитать около 3-4 доков, которые находятся в довольно таки разных местах) При этом некоторые детали там вообще не обсуждаются, например настройка в плеере playback security.

Я согласен, мог пропустить некоторые вещи, Но я буду только рад если кто-то о чём то спросит — мне не сложно ответить. Просто пост и так великоват согласитесь?)

А, и ещё. Этот (и последующие посты) предназначены не только для описания методов работы, но и для обсуждения, вопросов и т.п. Дело в том что и я не во всё до конца вник.) У меня процесс обучения ещё идёт) и буду рад, если ктото поправит или поможет в чём то разобраться)
0
Ух, честно говоря мало чего узнал из твоего поста, кроме самого сервиса. Просто я пошел другим путем, используя FlashDevelop и SharpDevelop вместо FlashIDE и VisualStuidio. Долго боролся с компилятором и проектами в Sharp (ибо это первая моя программа на C#)), потом проект никак не хотел коннектится к локальной программе. Сейчас вот все таки догадался скопировать строчку с сайта с именем юзьвера testuser вместо GuestUser и все вроде как получилось.

В целом, большое спасибо за уроки, радует что они есть :).
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.