Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 01.04.2009, 01:46
Zergbar вне форума Посмотреть профиль Отправить личное сообщение для Zergbar Найти все сообщения от Zergbar
  № 1  
Ответить с цитированием
Zergbar

Регистрация: Mar 2009
Сообщений: 7
Question Непонятная ошибка(

Долго смотрели, пускали по шагам в дебаггере, где ошибка понять не можем.. Такой код:

Код AS3:
public class DataReceiving {
		private const ginza_ip = "нужный айпи";
		private	var client = new Socket();
		private	var client2 = new Socket();
		private var char_inf = new ByteArray();
		private var player_array:Array = new Array();
		private var inventory:Array = new Array();
		private var OnPlInv:Array = new Array();
 
		public function DataReceiving() {
			client2.addEventListener(Event.CONNECT, connectListener2);
			client2.addEventListener(Event.CLOSE, closeListener2); 
			client2.connect(ginza_ip, 1024);
			client.addEventListener(Event.CONNECT, connectListener);
			client.addEventListener(Event.CLOSE, closeListener);
			client.addEventListener(ProgressEvent.SOCKET_DATA, socketDataListener); 
			client.connect(ginza_ip, 5000);
		}
 
		public function parseArr(arr:ByteArray) {
			player_array.push(arr.readByte());
			trace(player_array[player_array.length-1]);
			player_array.push(arr.readByte());
			trace(player_array[player_array.length-1]);
			for (var i=0; i<9; i++) {
				player_array.push(arr.readShort());
				trace(player_array[player_array.length-1]);
			}
			var clothes:ByteArray = new ByteArray();
			for (var j=20;j<arr.length;j++) { clothes[j-20]=arr[j]; }
			if (clothes.length != 0) parseItem(clothes);
		}
 
		private function parseItem(arr2:ByteArray) {
			var cust_invent:Array = new Array();
			cust_invent.push(arr2.readShort());
			cust_invent.push(arr2.readShort());
			cust_invent.push(arr2.readByte());
			cust_invent.push(arr2.readShort());
			cust_invent.push(arr2.readShort());
			cust_invent.push(arr2.readShort());
			for (var i=0;i<6;i++) {
				trace(cust_invent[i]);
			}
			cust_invent.push(arr2.readUTFBytes(cust_invent[cust_invent.length-1]*2-1));
			trace(cust_invent[cust_invent.length-1]);
			for (var i=0;i<22;i++) {
				cust_invent.push(arr2.readShort());
				trace(cust_invent[cust_invent.length-1]);
			}
			if (cust_invent[2]==0) { inventory.push(cust_invent); trace ("PlayerInvent - "+inventory[inventory.length-1]);}
			if (cust_invent[2]==1) {
				if (cust_invent[3]==1) { OnPlInv.push(cust_invent); trace ("OnPlayerInvent - "+OnPlInv[OnPlInv.length-1]); }
				else {
					var new_arr:Array = cust_invent;
					cust_invent[3]=cust_invent[3]-1;
					cust_invent[2]=0;
					inventory.push(cust_invent);
					new_arr[3]=1;
					OnPlInv.push(new_arr);
					trace ("OnPlayerInvent - "+OnPlInv[OnPlInv.length-1]);
				}
			}
			var arr3:ByteArray = new ByteArray();
			arr3.length = 0;
			for (var j=arr2.position;j<arr2.length;j++) arr3[j-arr2.position]=arr2[j];
			trace("length3 = "+arr3.length);
			if (arr3.length > 0) parseItem(arr3);
		}
 
		public function getPlayerArr():Array{
			return player_array;
		}
 
		public function getPlayerInv():Array{
			trace("getPlayerInv  inventory length:"+inventory.length);
			return inventory;
		}
 
		public function getOnPlayerInv():Array{
			trace("getOnPlayerInv  inventory length:"+OnPlInv.length);
			return OnPlInv;
		}
 
		private function socketDataListener (e:ProgressEvent):void { 
			trace ("New socket data arrived."); 
			client.readBytes(char_inf, 0, 0);
			parseArr(char_inf);
			trace("Player_array.length = "+player_array.length);
			trace("Invent_arr.length = "+inventory.length);
			trace("On PLayerArr.length = "+OnPlInv.length);
		} 
 
		private function connectListener2 (e:Event):void { 
			trace("Connected2! Waiting for data...");
		}
 
		private function connectListener (e:Event):void { 
			trace("Connected! Waiting for data...");
			client.writeByte(0x20);
			var pass = "lohness1";
			var nick = "Ginza9";
			var arr = new ByteArray();
			var arr2 = new ByteArray();
			arr2.writeUTFBytes(pass);
			arr.writeUTFBytes(nick);
			client.writeShort(arr.length);
			client.writeBytes(arr);
			client.writeShort(arr2.length);
			client.writeBytes(arr2);
		}
 
		private function closeListener (e:Event):void { 
			trace("Close socket");
		} 
 
		private function closeListener2 (e:Event):void { 
			trace("Close socket2");
		} 
	}
}
проблема с массивами player_array, inventory, OnPlInv.
в ходе обработки массива байт (фуекции parseArr и parseItem) все хорошо, и в эти массивы добавляются данные. затем, в функциях getPlayerArr(), getPlayerInv() и getOnPlayerInv() эти массивы каким то образом обнуляются.. почему - совершенно непонятно.. Есть идеи?
Заранее спасибо за помощь =)

Старый 01.04.2009, 02:50
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Наверное просто вызываете getPlayerArr() до parseArr()
__________________
Hell is the possibility of sanity

Старый 01.04.2009, 18:57
Zergbar вне форума Посмотреть профиль Отправить личное сообщение для Zergbar Найти все сообщения от Zergbar
  № 3  
Ответить с цитированием
Zergbar

Регистрация: Mar 2009
Сообщений: 7
Да нет, вызывается сначала parseArr(), потом getPlayerArr()..
вот код основного класса, из которого идет вызов.

Код AS3:
        public static var simple:SimpleGame = new SimpleGame();
		public static var onPlayerArr:Array = new Array();
		public static var inventArr:Array = new Array();
		public var pdata:DataReceiving;
 
		public function SimpleGame () {
			pdata = new DataReceiving();
			var vrem1:Array = pdata.getPlayerArr();
			var vrem2:Array = pdata.getPlayerInv();
			trace(vrem2[0]);
			var vrem3:Array =  pdata.getOnPlayerInv();
			trace(vrem3[0]);
			for (var i=0; i<vrem2.length; i++) {
				inventArr[i] = new Item(vrem2[i]);
			}
			for (var i=0; i<vrem3.length; i++) {
				onPlayerArr[i] = new Item(vrem3[i]);
			}
		}
то есть сначала вызывается конструктор класса DataReceiving и через него принимается информация, а потом уже вызываются get методы..

Старый 01.04.2009, 21:21
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну и где же она раньше вызывается?
сначала нужно дождаться когда socketDataListener() вызовется, а потом уже getPlayerArr() вызывать...
__________________
Hell is the possibility of sanity

Старый 01.04.2009, 21:35
Zergbar вне форума Посмотреть профиль Отправить личное сообщение для Zergbar Найти все сообщения от Zergbar
  № 5  
Ответить с цитированием
Zergbar

Регистрация: Mar 2009
Сообщений: 7
Нуу.. Я вобще думал, что сначала выполнится конструктор DataReceiving, а потом уже программа пойдет дальше..
А как тогда дождаться этого, не подскажете?

Старый 02.04.2009, 04:26
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Конструктор конечно выполниться раньше, только он тут при чем? Вот точно так же, как вы подписались на ProgressEvent подпишитесь на событие извещающее о том, что данные получены.
АS не выполняет практически никакие операции по загрузке синхронно (за исключением FileStream и еще нескольких моментов в работе с файловой системой).
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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