/src/tc/friendrescue/social/Leaderboard.as

https://github.com/statico/friend-rescue · ActionScript · 116 lines · 90 code · 25 blank · 1 comment · 13 complexity · 62729c364312a2fda3c1311b9eec17c9 MD5 · raw file

  1. // Copyright (c) 2010 Ian Langworth
  2. package tc.friendrescue.social {
  3. import flash.display.Bitmap;
  4. import flash.display.Sprite;
  5. import flash.events.Event;
  6. import flash.events.MouseEvent;
  7. import flash.filters.GlowFilter;
  8. import tc.common.application.ISpriteRegistry;
  9. import tc.common.application.IUpdatable;
  10. import tc.common.ui.CommonTextField;
  11. import tc.friendrescue.controllers.FontController;
  12. import tc.friendrescue.controllers.SoundController;
  13. public class Leaderboard extends Sprite implements IUpdatable {
  14. private static const BITMAP_WIDTH:int = 50;
  15. private static const POSITION_WIDTH:int = 100;
  16. private var app:ISpriteRegistry;
  17. private var socialNetwork:AbstractSocialNetwork;
  18. private var startX:int;
  19. private var realWidth:int;
  20. public function Leaderboard(app:ISpriteRegistry, socialNetwork:AbstractSocialNetwork) {
  21. super();
  22. this.app = app;
  23. this.socialNetwork = socialNetwork;
  24. addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
  25. app.getParent().addChild(this);
  26. }
  27. private function onAddedToStage(e:Event):void {
  28. removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
  29. var friends:Array = socialNetwork.getTopFriends();
  30. if (friends == null || friends.length == 0) {
  31. trace('No top friends for leaderboard');
  32. return;
  33. }
  34. for (var i:int = 0, friend:Friend; friend = friends[i] as Friend; i++) {
  35. var start:int = i * POSITION_WIDTH;
  36. var copy:Bitmap = new Bitmap(friend.bitmap.bitmapData.clone());
  37. var scale:Number = BITMAP_WIDTH / copy.width;
  38. copy.scaleX = scale;
  39. copy.scaleY = scale;
  40. var image:Sprite = new Sprite();
  41. image.addChild(copy);
  42. image.x = start + ((POSITION_WIDTH / 2) - (BITMAP_WIDTH / 2));
  43. image.y = 0;
  44. addChild(image);
  45. var field:CommonTextField = new CommonTextField();
  46. field.format.font = FontController.CONSOLE_FONT;
  47. field.format.size = FontController.CONSOLE_SIZE;
  48. field.centerAlign(POSITION_WIDTH);
  49. if (friend.highScore > 0) {
  50. field.format.color = 0x00ffff;
  51. field.setText(friend.name + "\n" + friend.highScore);
  52. } else {
  53. field.format.color = 0xffff00;
  54. field.setText("Rescue\n" + friend.name + " !");
  55. }
  56. field.x = start + ((POSITION_WIDTH / 2) - (field.textWidth / 2));
  57. field.y = image.y + image.height + 7;;
  58. addChild(field);
  59. var navigateToProfile:Function = makeOnClickClosure(friend);
  60. image.addEventListener(MouseEvent.CLICK, navigateToProfile);
  61. field.addEventListener(MouseEvent.CLICK, navigateToProfile);
  62. if (i == 0) {
  63. startX = Math.min(image.x, field.x);
  64. }
  65. }
  66. filters = [new GlowFilter(0x000000)];
  67. x = 500;
  68. y = 500 * 0.66;
  69. realWidth = width + startX;
  70. app.subscribe(this);
  71. }
  72. public function makeOnClickClosure(friend:Friend):Function {
  73. return function(e:Event):void {
  74. SoundController.playBigClick();
  75. friend.navigateToProfile();
  76. };
  77. }
  78. public function update(deltaTime:int):void {
  79. x -= deltaTime * 0.05;
  80. if (x < -realWidth) {
  81. x = stage.width - startX;
  82. }
  83. }
  84. public function destroy():void {
  85. app.unsubscribe(this);
  86. if (parent != null) {
  87. parent.removeChild(this);
  88. }
  89. }
  90. }
  91. }