| 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/
--------------------------------------
|