![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2008
Сообщений: 27
|
Уже второй день не могу разобраться в их работе. Если запускать в самом IDE (не в браузере и не на сайте), то работает отлично, если запускать в браузере, то флешка запрашивает <policy-file-request/> , на что я ей отдаю отличный полиси файл разрешающий всё что угодно:
<?xml version="1.0" ?><cross-domain-policy><site-control permitted-cross-domain-policies="all"/><allow-http-request-headers-from domain="*" headers="*" secure="false"/><allow-access-from domain="*" to-ports="*" secure="false"/></cross-domain-policy> Вот тут код флешки: package { [SWF(width = "807", height = "730", frameRate = "24", backgroundColor = "#FFFFFF")] import flash.display.MovieClip; import flash.display.Sprite; import flash.system.Security; import flash.net.Socket import flash.events.*; import flash.text.*; import flash.utils.Timer; //VK API AND GUI import vk.*; import vk.gui.*; import vk.api.serialization.json.*; /** * ... * @author Zerg */ [Frame(factoryClass="Preloader")] public class Main extends Sprite { public var tf: TextField;//тестовое поле для отладки public var socket:Socket;//сокет для соеденения public var socket_adress:String = "_здесь_был_ip_сервера_"; public var socket_port:int = 33777; public var current_player:Object;//массив с данными текущего пользователя public var player_obj:player_canva;//текущий пользователь public var players:Array = [];//массив со всеми подключёнными юзерами public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); //ебанутые настройки безопасности //Security.allowDomain("*"); Security.loadPolicyFile("xmlsocket://_здесь_был_ip_сервера_:33777"); //натсроим сокет, подключение чуть ниже после получения профиля вконтакте, в функции get_user_info() socket = new Socket(); socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); socket.addEventListener(Event.CONNECT, connectHandler); //поле для отладки tf = new TextField(); tf.x = 10; tf.y = 50; tf.width = 587; tf.height = 349; tf.border = true; tf.borderColor = 0xDAE2E8; tf.background = true; tf.backgroundColor = 0xFFFFFF; tf.embedFonts = false; var format:TextFormat = new TextFormat(); format.font = "Tahoma"; format.color = 0x000000; format.size = 11; tf.defaultTextFormat = format; addChild(tf); tf.appendText("Application initialized\n"); //достанем параметры встраивания var flashVars: Object = stage.loaderInfo.parameters as Object; //если они есть выведем в отладку if (flashVars.api_id) { tf.appendText("\n// -- Your code for local testing:\n"); tf.appendText("flashVars['api_id'] = " + flashVars['api_id'] + ";\n"); tf.appendText("flashVars['viewer_id'] = " + flashVars['viewer_id'] + ";\n"); tf.appendText("flashVars['sid'] = \"" + flashVars['sid'] + "\";\n"); tf.appendText("flashVars['secret'] = \"" + flashVars['secret'] + "\";\n"); tf.appendText("// -- //\n\n"); } //фальш инициализация для тестирования if (!flashVars.api_id) { // -- For local testing enter you test-code here: flashVars['api_id'] = _тут_был_номер_; flashVars['viewer_id'] = _тут_был_номер_; flashVars['sid'] = "c523306d9e58c74f12d19de54bc9f02ea19b1a8dd4437c32cb538f31991d7e6a9fff21427b4c65317528d"; flashVars['secret'] = "f728fbc2d6"; // -- /*/ } //инициализация vk api var VK:APIConnection = new APIConnection(flashVars); //получим профиль текущего юзера VK.api('users.get', { uids: flashVars['viewer_id'], fields: "photo" }, get_user_info, api_fail); } public function connect_to_server():void { this.socket.connect(this.socket_adress, this.socket_port); } private function connectHandler(event:Event):void { //посылаем сигнал о подключении к игре join_game(); tf.appendText("подключаемся\n\n"); } private function securityErrorHandler(event:SecurityErrorEvent):void { tf.appendText(event.text+"\n\n"); } /** * Отправляет данные в сокет, параметр это Object, массив с командой и данными * @param data */ private function send_to_socket(data:Object):void { //пишем в сокет в виде сериализованного json socket.writeUTFBytes(JSON.encode(data)); //отправка всего что записано в сокет socket.flush(); } /** * Создаёт массив, с обязательым элементом act, для формирования пакета команда+данные * @param act * @param vk_id * @return */ private function command(act:String, uid:String):Object { var json_data:Object = new Object(); json_data.act = act; json_data.uid = uid; return json_data; } /** * Выполняет подключение к серверу, вход в игру */ public function join_game():void { var command:Object = this.command('join_game', current_player.uid); command.photo = current_player.photo; command.first_name = current_player.first_name; command.x = player_obj.x; command.y = player_obj.y; //отправим данные this.send_to_socket(command); } /** * Отправляет обновлённые данные о текущем состоянии игрока, координаты и прочее */ public function send_update_state():void { var command:Object = this.command('update_state', current_player.uid); command.x = this.player_obj.x; command.y = this.player_obj.y; //отправим данные this.send_to_socket(command); } /** * обновляет состояние игрока указанного * @param data */ private function update_state(data:Object):void { //tf.appendText("Новое состояние: "+data.uid+", x = "+data.x+", y = "+data.y+"\n\n"); //если он не текущий игрок if (data.uid != current_player.uid) { //найдём этого игрока for each( var player_item:player_canva in this.players) { //если наш клиент if (player_item.uid == data.uid) { //обновим данные player_item.x = data.x; player_item.y = data.y; } } } } /** * добавляет в комнату нового игрока, размещает его на поле * @param data */ private function add_player(data:Object):void { //добавим его в массив игроков, если он не текущий игрок if (data.uid != current_player.uid) { //добавим в массив игроков this.players.push(data); //разместим юзера на сцене var new_player:player_canva = new player_canva(); new_player.draw_sprite = new sprite_player() as MovieClip; new_player.avatar_url = data.data.photo; new_player.first_name = data.data.first_name; new_player.x = 100; new_player.y = 100; new_player.main = this; new_player.is_current = false;//этот юзер не текущий им нельзя управлять new_player.uid = data.uid; addChild(new_player); } } private function ioErrorHandler(event:IOErrorEvent):void { tf.appendText(event.text+"\n\n"); } private function onSocketData(event:ProgressEvent):void { //tf.appendText(socket.readUTFBytes(socket.bytesAvailable)+"\n\n"); //декодируем в объект var json_data:Object = JSON.decode(socket.readUTFBytes(socket.bytesAvailable)); //если ошибка if (json_data.act == 'error') { tf.appendText(json_data.text+"\n\n"); } //вход в игру выполнен if (json_data.act == 'join_game') { tf.appendText(json_data.text+"\n\n"); } //показать нового игрока в комнате if (json_data.act == 'add_player') { tf.appendText(json_data.text + "\n\n"); //создадим нового игрока this.add_player(json_data); } //у когото изменились данные if (json_data.act == 'update_state') { //обновим данные об игроке этом this.update_state(json_data); } //очистка сокета socket.flush(); } private function get_user_info(data: Object): void { var profile:* = data[0];//профиль пользователя, uid, first_name, last_name, photo (small) //запишем данные current_player = profile; //разместим юзера на сцене player_obj = new player_canva(); player_obj.draw_sprite = new sprite_player() as MovieClip; player_obj.avatar_url = profile.photo; player_obj.first_name = profile.first_name; player_obj.x = 100; player_obj.y = 100; player_obj.main = this; //добавим на сцену addChild(player_obj); //подключаемся connect_to_server(); } private function api_fail(data: Object): void { var error_msg:String = ""; if (data is String) { error_msg = data.toString(); }else { error_msg = data.error_msg; } var box:Box = new Box( "Ошибка", "Ошибка в работе VK API дальнейшая работа невозможна! Информация: "+error_msg, 90, 500, [] ); addChild( box ); box.visible = true; } private function show_box(title: String, text: String): void { var box:Box = new Box( title, text, 90, 500, [] ); addChild( box ); box.visible = true; } } } |
|
|||||
|
Регистрация: Jan 2009
Сообщений: 1,651
|
Цитата:
__________________
мой пустой блог |
|
|||||
|
Регистрация: Sep 2008
Сообщений: 27
|
А есть нормальный пример, от начала всей этой бредятины и до момента когда можно уверенно слать команды? Я так и не смг отловить момент второго подключания после получения полиси файла.
|
|
|||||
|
Регистрация: Jan 2009
Сообщений: 1,651
|
Отловить где? Для клиента все прозрачно. Он первое подключение не видит вообще. Сервер должен вести себя примерно так:
- Клиент подключился. Ждем от него запроса. - Клиент присылает запрос на политику - отдаем политику, отключаем клиента(или просто ждем пока он сам отключится, ничего не делая) - Клиент присылает запрос на авторизацию, вход в игру - нормальное подключение, работаем в нормальном режиме
__________________
мой пустой блог |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:38. |
|
|
« Предыдущая тема | Следующая тема » |
|
|