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

Только готовые уроки по использованию ВКонтакте API. Flash + PHP + API. НЕ IFrame!

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

Сообщение 12funteam89 » 19 окт 2012, 21:00

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

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

2) Теперь создадим файлик get_score.php :
  1. <?php
  2. $mysql_host='localhost';
  3. $mysql_user='пользователь БД';
  4. $mysql_pass='пароль БД';
  5. $mysql_base='название БД';
  6. $mysql_table='score_score';  //тут название нашей таблицы
  7. $uid=$_GET['uid'];
  8. $auth=$_GET['auth'];
  9.  
  10. $api_id=2626409;
  11. $api_secret='K520ZVsdB0VgOCMGFiBv';
  12.  
  13. $auth2=md5($api_id.'_'.$uid.'_'.$api_secret);
  14. if ($auth==$auth2)
  15. {
  16. mysql_connect($mysql_host,$mysql_user,$mysql_pass);
  17. mysql_selectdb($mysql_base);
  18. mysql_query('SET names "utf-8"');
  19. $sql=@mysql_query('SELECT * FROM `'.$mysql_table.'` ORDER BY `score` DESC LIMIT 100');    //тут пишем сколько рекордов выводить
  20. echo '<?xml version="1.0" encoding="utf-8" ?>';
  21. echo '<response>';
  22. for ($i=0;$i<mysql_num_rows($sql);$i++)
  23. {
  24. echo '<user>';
  25. $res=mysql_fetch_array($sql);
  26. echo '<uid>'.$res['uid'].'</uid>';
  27. echo '<score>'.$res['score'].'</score>';
  28. echo '</user>';
  29. }
  30. echo '</response>';
  31. }
  32. else
  33. {
  34. echo 'error';
  35. }
  36.  
  37. ?>


3)Теперь создадим файлик score.php :
  1.  
  2. <?php
  3. $mysql_host='localhost';
  4. $mysql_user='пользователь бд';
  5. $mysql_pass='пароль бд';
  6. $mysql_base='название БД';
  7. $mysql_table='score_score';  //название нашей таблицы
  8. $uid=$_GET['uid'];
  9. $score=$_GET['score'];
  10. $auth=$_GET['auth'];
  11.  
  12.  
  13. $api_id=тут id приложения;
  14. $api_secret='здесь защищенный ключ';
  15. $auth2=md5($api_id.'_'.$uid.'_'.$api_secret);
  16.  
  17. if ($auth==$auth2)
  18. {
  19. mysql_connect($mysql_host,$mysql_user,$mysql_pass);
  20. mysql_selectdb($mysql_base);
  21. mysql_query('SET names "utf-8"');
  22. $sql=@mysql_query('SELECT * FROM `'.$mysql_table.'` WHERE `uid`='.$uid.'');
  23. $num=mysql_num_rows($sql);
  24. if ($num<1)
  25. {
  26. mysql_query('INSERT INTO `'.$mysql_table.'` (`uid`,`score`) VALUES ('.$uid.','.$score.');') or die(mysql_error());
  27. echo 'new';
  28. }
  29. else
  30. {
  31. mysql_query('UPDATE `'.$mysql_table.'` SET `score`='.$score.' WHERE `uid`='.$uid.'') or die(mysql_error());
  32. echo 'exists';
  33. }
  34. }
  35. else
  36. {
  37. echo 'error';
  38. }
  39.  
  40. ?>
  41.  


Теперь перейдем к ActionScript
Создаем кнопки:
btn2 - это будет кнопка для записи рекорда
next12 - перелистывает игроков вправо
back12 - перелистывает игроков влево

Теперь сам код:
  1.  
  2. import vk.APIConnection
  3. import flash.display.Loader;
  4. import flash.net.URLRequest;
  5. import vk.*;
  6. import vk.api.*;
  7. import fl.containers.UILoader;//delete
  8.  
  9. var photo:Loader= new Loader();
  10. var flashVars:Object=stage.loaderInfo.parameters as Object;
  11. var VK:APIConnection=new APIConnection(flashVars);
  12.  
  13. var host:String = 'http://site.ru/api';    //здесь пишем путь к папке с файлами get_score.php и score.php
  14.  
  15. var xml:XML = new XML();
  16. var uids1:String = '';
  17. var auth_key:String=flashVars['auth_key'];
  18. this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
  19. getScores();
  20.  
  21.  
  22. function getScores():void
  23. {
  24.     var loader:URLLoader = new URLLoader();
  25.     loader.load(new URLRequest(host+'/get_score.php?uid='+flashVars["viewer_id"]+'&auth='+auth_key));
  26.     loader.addEventListener(Event.COMPLETE,scoreLoaded);
  27. }
  28.  
  29. function scoreLoaded(e:Event):void
  30. {
  31.     xml = new XML(e.target.data);
  32.     for (var i:uint;i<xml..user.length();i++)
  33.     {
  34.         if (i!=xml..user.length())
  35.         {
  36.             uids1+=xml..user[i].uid+',';
  37.         }
  38.         else
  39.         {
  40.             uids1+=xml..user[i].uid;
  41.         }
  42.     }
  43.     getProfiles();
  44. }
  45.  
  46.  var massivfotok:Array=new Array;
  47.  var massivimen1:Array=new Array;
  48.  var massivimen2:Array=new Array;
  49.  var massivimen3:Array=new Array;
  50.  var counter:int=0;
  51.  
  52.  next12.addEventListener(MouseEvent.CLICK, nextv);
  53.     function nextv(Event:MouseEvent)
  54.         {
  55.         counter=counter+10;
  56.             vivodinfa();
  57.         }
  58.  
  59.   back12.addEventListener(MouseEvent.CLICK, backv);
  60.     function backv(Event:MouseEvent)
  61.         {
  62.         counter=counter-10;
  63.             vivodinfa();
  64.         }  
  65.  
  66.  
  67. function getProfiles():void
  68. {
  69.     wrapper.external.api('getProfiles',{uids:uids1,fields:'first_name,last_name,photo'},ProfilesLoaded,APIError);
  70. }
  71.  
  72. function ProfilesLoaded(data:Object):void
  73. {
  74.     var count = data.length;
  75.      for (var i=0; i<count; i++)
  76.             {
  77.                 massivfotok[i] = data[i]['photo'];
  78.                 massivimen1[i] = data[i]['first_name'];
  79.                 massivimen2[i] = data[i]['last_name'];
  80.                 massivimen3[i] = data[i]['uid'];
  81.                 }
  82.             vivodinfa();    
  83.  
  84. }
  85.  
  86.  
  87. function vivodinfa():void
  88. {          
  89.  
  90.   // массив блоков с информацией о пользователях
  91.             var usersBoxArray = new Array();
  92.            
  93.             // стиль текста
  94.             var textformat:TextFormat = new TextFormat();
  95.             textformat.align = TextFormatAlign.CENTER;
  96.             textformat.font = 'Tahoma';
  97.             textformat.size = 9;
  98.             textformat.color = 0xffffff;
  99.    
  100.    
  101.    
  102.    
  103.     for(var i:int=0;i<10;i++)
  104.     {
  105.    
  106. var user_box = new MovieClip;
  107.                 // рамка блока
  108.                 user_box.graphics.lineStyle(5, 0x000000);
  109.                 user_box.graphics.drawRect(0,0,72,100);
  110.                 // заливка блока
  111.                 user_box.graphics.beginFill(0x336699);
  112.                 user_box.graphics.drawRect(1,1,70,98);
  113.                 user_box.graphics.endFill();
  114.                
  115.                 user_box.x = 9 + i * 79;
  116.                 user_box.y = 620;
  117.                 user_box.buttonMode = true;
  118.                 user_box.useHandCursor = true;
  119.                 user_box.mouseChildren = false;
  120.                
  121.                
  122.                
  123.                
  124.                
  125.                
  126.                
  127.                
  128.                 // добавляем фото
  129.                 var user_photo:UILoader = new UILoader  ;
  130.                 user_photo.autoLoad = true;
  131.                 user_photo.scaleContent = false;
  132.                 user_photo.source = massivfotok[counter+i];;
  133.                 user_photo.move(11,10);
  134.                 user_box.addChild(user_photo);
  135.                 // добавляем имя
  136.                 var user_name_tf:TextField = new TextField  ;
  137.                 user_name_tf.width = 80;
  138.                 user_name_tf.height = 40;
  139.                 user_name_tf.wordWrap = true;
  140.                 user_name_tf.defaultTextFormat = textformat;
  141.                 user_name_tf.appendText( massivimen1[counter+i]+'\n'+ massivimen2[counter+i]+'\n' +xml..user[i].score);
  142.                 user_name_tf.x = 0;
  143.                 user_name_tf.y = 60;
  144.                 user_box.addChild(user_name_tf);
  145.                  usersBoxArray.push(user_box);
  146.                  addChild(usersBoxArray[i]);
  147.        
  148.                 // записываем id пользователя в массив
  149.                 usersBoxArray[i].uid = massivimen3[counter+i];
  150.                 // клик по блоку
  151.                 usersBoxArray[i].addEventListener(MouseEvent.CLICK, function(e:MouseEvent){
  152.                                     navigateToURL(new URLRequest('http://vkontakte.ru/id' + e.currentTarget.uid));
  153.                                     trace('http://vkontakte.ru/id' + e.currentTarget.uid);
  154.                                     });
  155.  
  156. }
  157. }
  158.  
  159.  
  160. function APIError(data:Object):void
  161. {
  162.     result_txt.text=data.error_msg;
  163. }
  164.  
  165. btn2.addEventListener(MouseEvent.CLICK,postScore);
  166.  
  167. function postScore(e:MouseEvent):void
  168. {
  169. var loader:URLLoader = new URLLoader();
  170. var request:URLRequest = new URLRequest(host+'/score.php');
  171. var variable:URLVariables = new URLVariables();
  172. variable['uid']=flashVars['viewer_id'];
  173. variable['score']=scoreText.text   //сюда пишем переменную ваших очков
  174. variable['auth']=auth_key;
  175. request.data= variable;
  176. loader.load(request);
  177. loader.addEventListener(Event.COMPLETE,scorePosted);
  178. }
  179.  
  180. function scorePosted(e:Event):void
  181. {
  182.     scoreText.appendText(' OK');  //сюда пишем переменную ваших очков
  183.     getScores();
  184. }
  185.  


Вроде все работает))
Вот ссылочка на Api Vk:
http://depositfiles.com/files/ltdehwc7q

Всем желаю успехов.
Изображение
Аватара пользователя
12funteam89

 
Автор темы
Сообщения: 99
Зарегистрирован: 29 окт 2010, 15:34
Откуда: Санкт-Петербург
Благодарил (а): 4 раз.
Поблагодарили: 2 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



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

Сообщение sanych_dv » 20 окт 2012, 14:26

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

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

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

  1.  
  2. private var _profiles:Array = [];
  3. //...
  4. private function ProfilesLoaded(data:Object):void
  5. {
  6.  for (var i:int = 0; i < data.length; i++)
  7.             {
  8. _profiles.push( {photo: data[i]['photo'], first_name: data[i]['first_name'], last_name: data[i]['last_name'], uid: data[i]['uid']} );
  9.             }
  10. }
  11.  


либо:

  1.  
  2. private var _profiles:Object = {};
  3. //...
  4. private function ProfilesLoaded(data:Object):void
  5. {
  6.  for (var i:int = 0; i < data.length; i++)
  7.             {
  8. _profiles[data[i]['uid']] = {photo: data[i]['photo'], first_name: data[i]['first_name'], last_name: data[i]['last_name']};
  9.             }
  10. }
  11.  
sanych_dv
Разработчик
Разработчик
 
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52
Благодарил (а): 1 раз.
Поблагодарили: 77 раз.

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

Сообщение 12funteam89 » 20 окт 2012, 15:07

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

 
Автор темы
Сообщения: 99
Зарегистрирован: 29 окт 2010, 15:34
Откуда: Санкт-Петербург
Благодарил (а): 4 раз.
Поблагодарили: 2 раз.


Вернуться в Уроки по использованию ВКонтакте API



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron