Таблица рекордов на AS3

Только готовые уроки по использованию ВКонтакте API. Flash + PHP + API. НЕ IFrame!
Ответить
Аватара пользователя
12funteam89
Сообщения: 99
Зарегистрирован: 29 окт 2010, 15:34

Таблица рекордов на AS3

Сообщение 12funteam89 »

Всем привет!
Хочу вам рассказать как можно сделать таблицу рекордов для игры на as3, с сохранением результатов на своем сервере. Я сам еще новичек, очень долго ковырял много разных уроков, чтобы у меня наконец получилась рабочая таблица рекордов. Сразу говорю, что код кривой, но в нем все работает=) Строго не судите, пишу свой первый урок. Возможно кому то пригодится.
Вот так она будет выглядеть:
Изображение
Начнем:

1)Создаем базу данных, а потом таблицу score_score c 3 столбцами:
первый назовем id тип: INT длина значения : 10 и ставим галочку auto increment
второй uid тип: INT длина значения : 10
третий score тип: INT длина значения : 3
Сюда у нас будут записываться id и результаты игроков.

2) Теперь создадим файлик get_score.php :

Код: Выделить всё

<?php$mysql_host='localhost';$mysql_user='пользователь БД';$mysql_pass='пароль БД';$mysql_base='название БД';$mysql_table='score_score';  //тут название нашей таблицы$uid=$_GET['uid'];$auth=$_GET['auth']; $api_id=2626409;$api_secret='K520ZVsdB0VgOCMGFiBv'; $auth2=md5($api_id.'_'.$uid.'_'.$api_secret);if ($auth==$auth2){mysql_connect($mysql_host,$mysql_user,$mysql_pass);mysql_selectdb($mysql_base);mysql_query('SET names "utf-8"');$sql=@mysql_query('SELECT * FROM `'.$mysql_table.'` ORDER BY `score` DESC LIMIT 100');    //тут пишем сколько рекордов выводитьecho '<?xml version="1.0" encoding="utf-8" ?>';echo '<response>';for ($i=0;$i<mysql_num_rows($sql);$i++){echo '<user>';$res=mysql_fetch_array($sql);echo '<uid>'.$res['uid'].'</uid>';echo '<score>'.$res['score'].'</score>';echo '</user>';}echo '</response>';}else{echo 'error';} ?>
3)Теперь создадим файлик score.php :

Код: Выделить всё

 <?php$mysql_host='localhost';$mysql_user='пользователь бд';$mysql_pass='пароль бд';$mysql_base='название БД';$mysql_table='score_score';  //название нашей таблицы$uid=$_GET['uid'];$score=$_GET['score'];$auth=$_GET['auth'];  $api_id=тут id приложения;$api_secret='здесь защищенный ключ';$auth2=md5($api_id.'_'.$uid.'_'.$api_secret); if ($auth==$auth2){mysql_connect($mysql_host,$mysql_user,$mysql_pass);mysql_selectdb($mysql_base);mysql_query('SET names "utf-8"');$sql=@mysql_query('SELECT * FROM `'.$mysql_table.'` WHERE `uid`='.$uid.'');$num=mysql_num_rows($sql);if ($num<1){mysql_query('INSERT INTO `'.$mysql_table.'` (`uid`,`score`) VALUES ('.$uid.','.$score.');') or die(mysql_error());echo 'new';}else{mysql_query('UPDATE `'.$mysql_table.'` SET `score`='.$score.' WHERE `uid`='.$uid.'') or die(mysql_error());echo 'exists';}}else{echo 'error';} ?> 
Теперь перейдем к ActionScript
Создаем кнопки:
btn2 - это будет кнопка для записи рекорда
next12 - перелистывает игроков вправо
back12 - перелистывает игроков влево

Теперь сам код:

Код: Выделить всё

 import vk.APIConnectionimport flash.display.Loader;import flash.net.URLRequest;import vk.*;import vk.api.*;import fl.containers.UILoader;//delete var photo:Loader= new Loader(); var flashVars:Object=stage.loaderInfo.parameters as Object;var VK:APIConnection=new APIConnection(flashVars); var host:String = 'http://site.ru/api';    //здесь пишем путь к папке с файлами get_score.php и score.php var xml:XML = new XML();var uids1:String = '';var auth_key:String=flashVars['auth_key'];this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);getScores();  function getScores():void{    var loader:URLLoader = new URLLoader();    loader.load(new URLRequest(host+'/get_score.php?uid='+flashVars["viewer_id"]+'&auth='+auth_key));    loader.addEventListener(Event.COMPLETE,scoreLoaded);} function scoreLoaded(e:Event):void{    xml = new XML(e.target.data);    for (var i:uint;i<xml..user.length();i++)    {        if (i!=xml..user.length())        {            uids1+=xml..user[i].uid+',';        }        else        {            uids1+=xml..user[i].uid;        }    }    getProfiles();}  var massivfotok:Array=new Array; var massivimen1:Array=new Array; var massivimen2:Array=new Array; var massivimen3:Array=new Array; var counter:int=0;  next12.addEventListener(MouseEvent.CLICK, nextv);    function nextv(Event:MouseEvent)        {        counter=counter+10;            vivodinfa();        }   back12.addEventListener(MouseEvent.CLICK, backv);    function backv(Event:MouseEvent)        {        counter=counter-10;            vivodinfa();        }     function getProfiles():void{    wrapper.external.api('getProfiles',{uids:uids1,fields:'first_name,last_name,photo'},ProfilesLoaded,APIError);} function ProfilesLoaded(data:Object):void{    var count = data.length;     for (var i=0; i<count; i++)            {                massivfotok[i] = data[i]['photo'];                massivimen1[i] = data[i]['first_name'];                 massivimen2[i] = data[i]['last_name'];                 massivimen3[i] = data[i]['uid'];                }            vivodinfa();      }  function vivodinfa():void{             // массив блоков с информацией о пользователях            var usersBoxArray = new Array();                        // стиль текста            var textformat:TextFormat = new TextFormat();            textformat.align = TextFormatAlign.CENTER;             textformat.font = 'Tahoma';            textformat.size = 9;            textformat.color = 0xffffff;                    for(var i:int=0;i<10;i++)    {    var user_box = new MovieClip;                // рамка блока                user_box.graphics.lineStyle(5, 0x000000);                user_box.graphics.drawRect(0,0,72,100);                // заливка блока                user_box.graphics.beginFill(0x336699);                user_box.graphics.drawRect(1,1,70,98);                user_box.graphics.endFill();                                user_box.x = 9 + i * 79;                user_box.y = 620;                user_box.buttonMode = true;                user_box.useHandCursor = true;                user_box.mouseChildren = false;                                                                                                                                                // добавляем фото                var user_photo:UILoader = new UILoader  ;                user_photo.autoLoad = true;                user_photo.scaleContent = false;                user_photo.source = massivfotok[counter+i];;                user_photo.move(11,10);                user_box.addChild(user_photo);                // добавляем имя                var user_name_tf:TextField = new TextField  ;                user_name_tf.width = 80;                user_name_tf.height = 40;                user_name_tf.wordWrap = true;                user_name_tf.defaultTextFormat = textformat;                user_name_tf.appendText( massivimen1[counter+i]+'\n'+ massivimen2[counter+i]+'\n' +xml..user[i].score);                user_name_tf.x = 0;                user_name_tf.y = 60;                user_box.addChild(user_name_tf);                 usersBoxArray.push(user_box);                 addChild(usersBoxArray[i]);                        // записываем id пользователя в массив                usersBoxArray[i].uid = massivimen3[counter+i];                // клик по блоку                usersBoxArray[i].addEventListener(MouseEvent.CLICK, function(e:MouseEvent){                                    navigateToURL(new URLRequest('http://vkontakte.ru/id' + e.currentTarget.uid));                                    trace('http://vkontakte.ru/id' + e.currentTarget.uid);                                    }); }}  function APIError(data:Object):void{    result_txt.text=data.error_msg;} btn2.addEventListener(MouseEvent.CLICK,postScore); function postScore(e:MouseEvent):void{var loader:URLLoader = new URLLoader();var request:URLRequest = new URLRequest(host+'/score.php');var variable:URLVariables = new URLVariables();variable['uid']=flashVars['viewer_id'];variable['score']=scoreText.text   //сюда пишем переменную ваших очковvariable['auth']=auth_key;request.data= variable;loader.load(request);loader.addEventListener(Event.COMPLETE,scorePosted);} function scorePosted(e:Event):void{    scoreText.appendText(' OK');  //сюда пишем переменную ваших очков    getScores();} 
Вроде все работает))
Вот ссылочка на Api Vk:
http://depositfiles.com/files/ltdehwc7q

Всем желаю успехов.
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Таблица рекордов на AS3

Сообщение sanych_dv »

1. Намного проще передавать данные в формате JSON, а не XML.

2. Для визуального представления подобных таблиц во флэше правильнее использовать компонент fl.controls.TileList, он не будет тормозить при большом количестве элементов.

4. Лишние массивы в ProfilesLoaded. Достаточно одного:

Код: Выделить всё

 private var _profiles:Array = [];//...private function ProfilesLoaded(data:Object):void{ for (var i:int = 0; i < data.length; i++)            {_profiles.push( {photo: data[i]['photo'], first_name: data[i]['first_name'], last_name: data[i]['last_name'], uid: data[i]['uid']} );            }} 
либо:

Код: Выделить всё

 private var _profiles:Object = {};//...private function ProfilesLoaded(data:Object):void{ for (var i:int = 0; i < data.length; i++)            {_profiles[data[i]['uid']] = {photo: data[i]['photo'], first_name: data[i]['first_name'], last_name: data[i]['last_name']};            }} 
Аватара пользователя
12funteam89
Сообщения: 99
Зарегистрирован: 29 окт 2010, 15:34

Re: Таблица рекордов на AS3

Сообщение 12funteam89 »

Я же говорю, что новичек, еще только учусь)
Спасибо, что подсказал как будет лучше.
Ответить