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

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

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

Регистрация: Aug 2015
Сообщений: 8
Tools Проблема с подключением к php файлу. Ошибка #1009.

Собственно. Создал я, значит, кнопку переключения между глобальной и локальной таблицей рекордов. Радостно написал код подключения к внешнему пхп файлу. Запустил... И тут(О, нет!!!) flash на меня начинает материться:

"TypeError: Error #1009: Cannot access a property or method of a null object reference.
at leaderboard_fla::changer_mc_2/completeHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
"

После этого удара ниже пояса, я проверил свой код ещё 9000+ раз. Результата - ноль.
Пожалуйста, подскажите, чём заключается моя ошибка и как её исправить?
Непосредственно исходник(для пущей верности):1(DinosaurJump).7z.

И, если вам интересно, код PHP файлика, с которым связывается данная программа*:
PHP код:
<?
include "sqlClass/conf.php";
include 
"sqlClass/class.php";

$sql = new sql($mysqlArr);

$count $_POST['count'];

$scoreArray $sql->select("hiscores""*""1" $count"score"false);
$scoreArray $scoreArray['tableData'];
$scoreArray array_reverse($scoreArray);

$i 0;
$retStr "";
foreach (
$scoreArray as $value) {
    
$retStr .= $value['name']."||";
    
$retStr .= $value['score']."@@";
    
$i++;
}
$retStr substr($retStr0, -2);

$retArray['highscores'] = $retStr;

$returnString http_build_query($retArray);
echo 
$returnString;
?>
_________________________________________________________________________________________________
*Он отвечает правильно по всем статьям. Да и класс для работы с SQL отвечает верным массивом. (Проверено) .

Старый 04.08.2015, 07:06
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Выкладвайте сюда код. Не надо никаких fla прикреплять, тем более новых версий

Так, методом догадки могу предположить, что во флеше загрузчик ожидает совсем не URL переменных, а простой текст. Отсюда и ошибка.
Я вот тут выкладывал класс, который 100% работает правильно.

Старый 04.08.2015, 09:34
Nokard вне форума Посмотреть профиль Отправить личное сообщение для Nokard Найти все сообщения от Nokard
  № 3  
Ответить с цитированием
Nokard
 
Аватар для Nokard

Регистрация: Aug 2015
Сообщений: 8
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Выкладвайте сюда код. Не надо никаких fla прикреплять, тем более новых версий
Это я учту. Забыл, что более поздние версии flash professional не открывают fla новых версий(У самого стоит flash CC).

Цитата:
Сообщение от caseyryan Посмотреть сообщение
Так, методом догадки могу предположить, что во флеше загрузчик ожидает совсем не URL переменных, а простой текст. Отсюда и ошибка.
Странно... Просто данный код работал в другом проекте.

Цитата:
Сообщение от caseyryan Посмотреть сообщение
Я вот тут выкладывал класс, который 100% работает правильно.
А за это вам огромное человеческое Спасибо

Чуть не забыл. Код В кнопке*:
Код AS1/AS2:
import flash.events.Event;
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.net.*;
 
this.addEventListener(Event.ENTER_FRAME, ef);
this.addEventListener(MouseEvent.CLICK, changeTables);
 
var par:MovieClip = MovieClip(parent);
var TableType:int = par.highscoreType;
var loader:URLLoader = new URLLoader();
 
function ef(e:Event){
	if (TableType != par.highscoreType){
		par.highscoreType = TableType
	}
	this.gotoAndStop(TableType);
	if (par.currentFrameLabel != "frame_leaderboard"){
		this.removeEventListener(Event.ENTER_FRAME, ef);
		this.removeEventListener(MouseEvent.CLICK, changeTables);
	}
}
 
function changeTables(e:MouseEvent){
	if(TableType == 2){
		TableType = 1;
		setTables(par.tRexObj.myLeaderboard);
	}else if(TableType == 1){
		TableType = 2;
		getWorldHighscores();
		setTables(par.tRexObj.myLeaderboard);
	}else{
		trace("Incorrect TableType: \""+TableType+"\".");
	}
}
 
function setTables(arr:Array){
	par.TraceHighscores(arr);
}
//Функция, которая подключается к php
function getWorldHighscores() {
	par.setMouseLoading();
    var request:URLRequest=new URLRequest("http://newground.hol.es/dj/getScores.php");
 
    request.method=URLRequestMethod.POST;
    loader.dataFormat=URLLoaderDataFormat.VARIABLES;
    loader.addEventListener(Event.COMPLETE, completeHandler);
 
    var variables:URLVariables = new URLVariables();
    variables['count'] = 5;
    request.data=variables;
    loader.load(request);
}
 
 //функция по окончанию загрузки.
function completeHandler(evt:Event) {
	var RetArr:Array = new Array;
	par.unsetMouseLoading();
	var hgihsc:String = evt.target.data.highscores;
	RetArr = hgihsc.split("||");
	for (var i:int = 0; i<RetArr.length;i++){
		RetArr[i] = RetArr[i].split("@@");
	}
	setTables(RetArr);
	loader.removeEventListener(Event.COMPLETE, completeHandler);
}
Просто интересно в чём же беда, как её исправить и как обходить в будущем?

_________________________________________________________________________________________________
*Кнопка, непосредственно - мувиклип, в разных кадрах которого расположены 2 кнопки(для графической составляющей.) И, по каким-то мистическим причинам, работает данная она только так. Иначе флеш начнёт гнуть 3-х этажные маты про ошибку #1009.

Добавлено через 1 час 1 минуту
Странно... Короче переделал я, значит код под ваш класс. Всё работает. Флеш получает первые 5 записей из бд. И Правильно их трейсит. Но далее случается такая белиберда:

TypeError: Error #2007: Parameter text must be non-null.
at flash.text::TextField/set text()
at leaderboard_fla::MainTimeline/traceInTxtFields()
at leaderboard_fla::MainTimeline/TraceHighscores()
at leaderboard_fla::changer_mc_2/setTables()
at leaderboard_fla::changer_mc_2/onComplete()
at Function/http://adobe.com/AS3/2006/builtin::call()
at classes::Packet/onComplete()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()


В общем теперь функции выглядят так:

Код AS3:
function getGlobalHighscores() {
	par.setMouseLoading();
	var obj:Object  = new Object;
	obj.count = 5;
	var packet:Packet = new Packet("someServerMethod", onComplete, "http://newground.hol.es/dj/", "getScores.php");
}
function onComplete(netObj:Object){
	par.unsetMouseLoading();
	var RetArr:Array = new Array;
	var hgihsc:String = netObj.highscores;
	RetArr = hgihsc.split("||");
	for (var i:int = 0; i<RetArr.length;i++){
		RetArr[i] = RetArr[i].split("@@");
	}
	//trace(String(RetArr));
	setTables(RetArr);
}
Что теперь ему не нравится?!


Последний раз редактировалось Nokard; 04.08.2015 в 10:36.
Старый 04.08.2015, 11:44
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 4  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
с сервера у вас приходит строка:

highscores=Nokard||999999@@a||300000@@Electro||200000@@b||100000

далее нужно разбить ее на массив пар :
Код AS3:
 
RetArr = hgihsc.split("@@");
получаем такой массив :
["Nokard||999999","a||300000","Electro||200000","b||100000"];

далее

нужно сохранить данные в ОБЪЕКТ:

Код AS3:
var highScoreObj:Object = {};
var pairsArray:Array;
for (var i:int = 0; i<RetArr .length;i++){
	pairsArray = RetArr[i].split("||");
       highScoreObj[pairsArray[0]] = pairsArray[1]; 
 
}
потом передаем этот объект в функцию
Код AS3:
 
setTables(highScoreObj);
там его парсим циклом for each


но я не знаю зачем так заморачитьвася и придумывать свой костыльный формат данных, используйте JSON - для такого случая, тогда у вас строка(которую вы грузите с сервера) будет иметь вид:

Код:
{
   "highscores":{
         "Nokard":999999,
         "a":300000,
         "Electro":200000
   }
}
и тогда ваша функция будет выглядеть как-то так:

Код AS3:
 
function onComplete(netObj:Object){
	par.unsetMouseLoading();
 
	var hgihsc:String = netObj as String;
 
        setTables(JSON.parse(hgihsc));
}
в крайнем случае можно посмотреть в сторону XML.


Последний раз редактировалось Isfet; 04.08.2015 в 13:14.
Старый 04.08.2015, 15:35
Nokard вне форума Посмотреть профиль Отправить личное сообщение для Nokard Найти все сообщения от Nokard
  № 5  
Ответить с цитированием
Nokard
 
Аватар для Nokard

Регистрация: Aug 2015
Сообщений: 8
Цитата:
Сообщение от Isfet Посмотреть сообщение
далее нужно сохранить данные в ОБЪЕКТ
Здесь надо сохранять не в объект, а в 2-х мерный массив. Данные функции работают с массивами. Их и сортировать легче, и через циклы проводить...

Цитата:
Сообщение от Isfet Посмотреть сообщение
я не знаю зачем так заморачитьвася и придумывать свой костыльный формат данных, используйте JSON
А это я себе возьму на заметку. Просто ActionscriptJSON - для меня тёмный лес. Практики - ноль.

Нууу... Ошибка уже исправлена и без jsonа. Переписал код и всё пошло как по маслу. Если вкратце, то проблема была в функции, выводящей рекорды непосредственно в txt field-ы если вспомнить, то ей передавался массив, состоящий из 4-х элементов. А полей - то у меня - 5. Вот она и пыталась вывести undefined в текстовое поле. Решением оказалось добавление в тело функции этих строк:
Код AS3:
if (jobArr.length<5){
	for (var i:int = jobArr.length; i<=5; i++){
		jobArr.push(["-", 0]);
	}
}else if(jobArr.length>5){
	jobArr.splice(5);
}//job arr - получаемый функцией массив.
В общем спасибо всем, кто откликнулся на мою просьбу. И отдельно я хочу поблагодарить caseyryan. За предоставленный им класс.

Старый 04.08.2015, 16:28
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 6  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
Цитата:
Сообщение от Nokard Посмотреть сообщение

RetArr = hgihsc.split("||");
вот в этой строке вы парсите неправильно , вы перемешиваете переменные, и когда то вы на эту ошибку наткнетесь, когда у вас данные не будут сходиться.

вы получаете вот такую строку с сервера

Код:
highscores=Nokard||999999@@a||300000@@Electro||200000@@b||100000
и после этой записи массив будет выглядеть так

Код:
["Nokard" ,"999999@@a" , "300000@@Electro" , "200000@@b" , "100000"  ];
и потом вы по этому массиву пробегаетесь


Добавлено через 45 секунд
Цитата:
Сообщение от Nokard Посмотреть сообщение

Нууу... Ошибка уже исправлена и без jsonа.
я и не говорил что без джейсона не будет работать, не хотите делать правильно - ваше дело.

Старый 05.08.2015, 22:22
Nokard вне форума Посмотреть профиль Отправить личное сообщение для Nokard Найти все сообщения от Nokard
  № 7  
Ответить с цитированием
Nokard
 
Аватар для Nokard

Регистрация: Aug 2015
Сообщений: 8
Цитата:
Сообщение от Isfet Посмотреть сообщение
я и не говорил что без джейсона не будет работать, не хотите делать правильно - ваше дело.
Я же сказал.
Цитата:
Сообщение от Nokard Посмотреть сообщение
А это я себе возьму на заметку. Просто ActionscriptJSON - для меня тёмный лес. Практики - ноль.
С вами полностью согласен, но такого костыльного формата данных для альфы 1.0.0 хватит с головой. Json будет добавлен в следующем обновлении(а оно будет), когда в данной теме у меня будет достаточно знаний и опыта.
__________________
Создать проект всегда готов, github для слабаков.

Старый 06.08.2015, 10:03
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
С вами полностью согласен, но такого костыльного формата данных для альфы 1.0.0 хватит с головой. Json будет добавлен в следующем обновлении(а оно будет), когда в данной теме у меня будет достаточно знаний и опыта.
Жестко) То есть возиться с этими костылями лучше, чем уделить полчаса и разобраться что же такое JSON?

Во флеше есть всего 2 метода для работы с JSON.
JSON.stringify() и JSON.parse();

Первый принимает объект и превращает его в JSON строку. Второй наоборот, берет JSON строку и превращает в обычный флеш Object. Вот и все заморочки.
В пыхе так же есть методы для создания и чтения JSON (json_encode()).
Берем просто ассоциативный массив и передаем его в json_encode()

получается примерно так:
PHP код:
$some_array = array( 'name' => 'Vasya''lastName' 'Pupkin');

echo 
"data=" json_encode($some_array); 
Во флешке делаем так
Код AS3:
private function onDataLoaded(urlVars:Object):void {
    var userData:Object = JSON.parse(urlVars.data);
    trace(userData.name, userData.lastName); // Vasya Pupkin
}
Все легко и просто. Не надо никаких костылей

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

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

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


 


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


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