Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Создание P2P игры с помощью библиотеки Tom Krcha. (http://www.flasher.ru/forum/showthread.php?t=176191)

MikroAcse 04.03.2012 01:38

Создание P2P игры с помощью библиотеки Tom Krcha.
 
Вложений: 2
Для начала, скачиваем и "впиливаем" наши swc в проект.

Заходим на AdobeLabs и узнаем наш CirrusCode. Для этого требуется быть зарегистрированным на adobe.com .

Создаем проект.
Для начала импорт:
Код AS3:

import com.adobe.fms.*;
import com.adobe.fms.events.*;

Теперь объявляем переменные:
Код AS3:

private const developer_key:String="ВАШ_CIRRUS_CODE";
private var users:Object;
private var usr:String="id"+Math.round(Math.random()*10000); // это ID, лучше делать его более неповторимым, например, с помощью User.UIC в моей библиотеке, который выдает практически неповторимый ID
public var game:P2PGame;
public var txtLog:TextField;
public var myUser:Sprite;

Теперь, ваш главный класс должен выглядеть примерно так:
Код AS3:

package {
        import com.adobe.fms.*;
        import com.adobe.fms.events.*;
        import flash.display.MovieClip;
        import flash.events.Event;
 
        public class Main extends MovieClip {
 
                private const developer_key:String="ВАШ_CIRRUS_CODE";
 
                private var users:Object;
                private var usr:String="id"+Math.round(Math.random()*10000);// это ID, лучше делать его более неповторимым, например, с помощью User.UIC в моей библиотеке, который выдает практически неповторимый ID
 
                public var game:P2PGame;
                public var txtLog:TextField;
                public var myUser:Sprite;
 
                public function Main():void {
                        if (stage)
                                init(null);
                        else
                                addEventListener(Event.ADDED_TO_STAGE,init);
                }
 
                public function init(e:Event):void {
 
                }
 
        }
 
}

Ставим в настройках вашего компилятора: "доступ только к сети".

Окончательный Main.as с комментариями:
Код AS3:

package {
        import com.adobe.fms.*;
        import com.adobe.fms.events.*;
 
        import flash.display.MovieClip;
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.text.TextField;
 
        public class Main extends MovieClip {
 
                private const developer_key:String="ВАШ_CIRRUS_CODE";
 
                private var users:Object;
                private var usr:String="id"+Math.round(Math.random()*10000);// это ID, лучше делать его более неповторимым, например, с помощью User.UIC в моей библиотеке, который выдает практически неповторимый ID
 
                public var game:P2PGame;
                public var txtLog:TextField;
                public var myUser:Sprite;
 
                public function Main():void {
                        if (stage)
                                init(null);
                        else
                                addEventListener(Event.ADDED_TO_STAGE,init);
                }
 
                public function init(e:Event):void {
                        startP2PServer(); //стартуем
                }
 
                public function startP2PServer():void {
                        initLog(); //создаем лог событий и функций
                        initGame(); //запускаем p2p сервер
                        Logger.log("init"); //собственно, добавляем в лог функцию
                }
                /*
                INIT
                */

                public function initGame():void {
                        myUser=new Sprite(); // рисуем свой квадрат.
 
                        myUser.graphics.beginFill(0xFF0000); // рисуем квадрат и все такое
                        myUser.graphics.drawRect(0,0,15,10);
                        myUser.graphics.endFill();
 
                        myUser.x=mouseX;  //задаем координаты
                        myUser.y=mouseY;
 
                        addChild(myUser)
 
                        myUser.startDrag(); // начинаем двигать наш квадрат за мышкой
 
                        // CONNECT
 
                        game=new P2PGame("rtmfp://p2p.rtmfp.net/"+developer_key); // создаем новый экземпляр игры с сервером и cirrus code
                        game.addEventListener(Event.CONNECT, onGameConnect)// добавляем событие: "подключение к игре"
                        game.addEventListener(Event.CHANGE, onUsersChange); // добавляем событие: "изменения в списке пользователей"
 
                        Logger.log(usr); // добавляем в лог функцию
                        game.connect(usr); //коннектимся
                }
                public function initLog():void {
                        if (Logger.txtArea==null) {
                                txtLog = new TextField()// создание лога
                                Logger.txtArea=txtLog;
                        }
                }
                /*
                CONNECT
                */

                private function onGameConnect(event:Event):void {
                        Logger.log("onGameConnect"); // добавляем в лог: "УРА, МЫ ПОДКЛЮЧИЛИСЬ!"
 
                        game.session.mainChat.addEventListener(PeerStatusEvent.USER_ADDED, onUserAdded); // добавляем событие: "кто-то зашел"
                        game.session.mainChat.addEventListener(PeerStatusEvent.USER_REMOVED, onUserRemoved)// добавляем событие: "кто-то вышел"
 
                        stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoving); // добавляем событие движения мыши
 
                        users = new Object(); // это список пользователей
 
                        game.setReceivePositionCallback(onReceivePosition); // функция: "onReceivePosition" вызывается, когда кто-то передает данные
                }
                /*
                USERS
                */

                public function onUsersChange(event:Event):void {
                        for each (var user:Object in game.session.mainChat.userList) {
                                addUser(user)//каждому человеку в списке пользователей создаем квадрат
                        }
                }
 
                public function onUserAdded(event:PeerStatusEvent):void {
                        addUser(event.info); // если кто-то заходит, ему добавляется квадрат.
                }
 
                public function addUser(user:Object):void {
                        if (user.id!=game.session.myUser.id) { //проверяет, не являемся ли человеком в списке - мы
                                if (users[user.id]==null) { // проверяем, что квадрат для человека еще не создан
                                        var userObject:Sprite = new Sprite(); // создаем человеку спрайт
 
                                        addChild(userObject);
 
                                        userObject.graphics.beginFill(0xFF0000); // рисуем квадрат и все такое
                                        userObject.graphics.drawRect(0,0,15,10);
                                        userObject.graphics.endFill();
 
                                        users[user.id]=userObject; //добавляем в список людей этот квадрат
 
                                        userObject.name='man_id_'+user.id; // задаем уникальное имя.
                                }
                        }
                }
 
                public function onUserRemoved(event:PeerStatusEvent):void {
                                removeChild(users[event.info.id] as DisplayObject); // удаляем квадрат человека, который выходит.
                                delete users[event.info.id]; //удаляем человека из списка
                }
 
                //----------------------------------------------------------------------------------------------------------- EVENTS
 
                public function mouseMoving(e:MouseEvent):void { //отправка данных
                        var objectToSend:Object=new Object(); //объект с информацией
 
                        objectToSend.x=myUser.x; //записываем x и y (можно записать ВСЕ, что угодно)
                        objectToSend.y=myUser.y;
 
                        game.sendPosition(objectToSend);// отправляем данные...
                }
 
                public function onReceivePosition(peerID:String, pos:Object):void { //прием данных
                        var recieveUser:Sprite=users[peerID]; //находим человека в списке пользователей
 
                        if(recieveUser){ // если он нашелся, то делаем с информацией все, что угодно
                                recieveUser.x=pos.x;
                                recieveUser.y=pos.y;
                        }
                }
 
 
        }
 
}

Исходник с примером:
http://www.flasher.ru/forum/attachme...1&d=1330872311
Пример запускайте в двух окнах и смотрите :)

PS: на одном компьютере может виснуть два приложения, которые работают через P2P.

Сайт Tom'а Krcha:
http://www.flashrealtime.com/p2p-game-lib/

--------------------------------------

MikroAcse 04.03.2012 01:41

Если в Output будет такое:
Код AS3:

NetConnection.Connect.Success
NetGroup.Connect.Success

Значит все работает на ура.

ZGG 04.03.2012 02:45

P2P это все интересно, но есть одна проблема: не у всех конечных пользователей корректно работает UDP.

MikroAcse 04.03.2012 02:50

Цитата:

не у всех конечных пользователей корректно работает UDP.
Почему? Где ты это узнал?

Astraport 04.03.2012 10:35

Это совсем не флейм.

Цитата:

PS: на одном компьютере может виснуть два приложения, которые работают через P2P.
В смысле это такая фича?

alatar 04.03.2012 13:08

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

MikroAcse 04.03.2012 13:53

Это и есть оригинал.

alatar 04.03.2012 14:04

И что? Вы предполагаете выкладывать все обновления библиотеки в этом посте, включая документацию и исходники?

MikroAcse 04.03.2012 15:22

Что не сделаешь, все вам не нравится! :(

alatar 04.03.2012 15:36

При чем тут нравится/не нравится? Это был вам совет на будущее.
Под оригиналом я подразумевал оригинальный источник.


Часовой пояс GMT +4, время: 22:52.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.