17 ноября 2011

Подгоняем элементы на живую

В предыдущем посте я писал о том как считать fps и memory, я решил не останавливаться и дописать еще одну вкусность.

Часто возникает необходимость при верстке сложного интерфейса подгонять некоторые часть графики относительно друг друга, но иногда приходится это делать по-пиксельно, что приводит к большому количеству компиляций, а следовательно к большой трате времени.

Поэтому добавил возможность в наш класс FPSCounter.as события нажатия клавиши F2, что будет приводить к выводу на экран поля с координатами мыши относительно stage а также указателя на все поле.

Но и это еще не все, сделаем возможность передавать в наш класс графического объекта который можно будет двигать с помощью клавиш, что приведет к уменьшению времени подгонки графики.

FPSCounter.as:

//file: FPSCounter.as
//language: actionscript 3.0
//author: mixailflash
//site: mixailflash.livejournal.com

package
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.display.DisplayObjectContainer;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.utils.getTimer;
import flash.system.System;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.ui.Keyboard;
import flash.ui.*;

public class FPSCounter extends Sprite
{
  private var last:uint = getTimer();
  private var ticks:uint = 0;
  private var tf:TextField;
  private var spr:Sprite;
  public static var DRAG:DisplayObjectContainer; //таскаемый объект;
  
  public function FPSCounter(stage:Stage) 
  {
    tf = new TextField();
    spr = new Sprite();
    tf.textColor = 0x000000;
    tf.text = "----- fps --------- memory";
    tf.selectable = false;
    tf.autoSize = 'left';
    tf.textColor = 0xeeeeee;
    tf.background = true;
    tf.backgroundColor = 0x333333;
    //ставим прослушиватель на нажатия кнопок клавиатуры
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
  }
  private function keyPressedDown(event:KeyboardEvent):void 
  {
    var key:uint = event.keyCode;
    if (key == 112) // проверяем нажата ли кнопка F1
    {
      // если еще не нажимали и текст не находится в области видимости
       if (!tf.parent)
       {
         stage.addEventListener(Event.ENTER_FRAME, tick);
         stage.addChild(tf);
       }
       else 
       {
         stage.removeEventListener(Event.ENTER_FRAME, tick);
         stage.removeChild(tf);
       }
    }

    if (key == 113) // проверяем нажата ли кнопка F2
    {
      if (!spr.parent)
      {
        stage.addChild(spr);
        stage.addChild(tf);
        stage.addEventListener(MouseEvent.MOUSE_MOVE, moving);
      }
      else 
      {
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, moving);
        stage.removeChild(spr);
        stage.removeChild(tf);
      }
    }

    // комманды для того чтобы двигать переданный графический объект
    if (key == 39) // налево
      DRAG.x++;
    if (key == 37) // направо
      DRAG.x--;
    if (key == 40) // вниз
      DRAG.y++;
    if (key == 38) // вверх
      DRAG.y--;
  }
  
  private function moving(event:MouseEvent):void
  {
    spr.graphics.clear();
    var str:String = '';
    // показываем координаты мыши
    str = str.concat('x: '+ event.stageX + ' y: ' + event.stageY);
    if (DRAG) 
    {
      str = str.concat('\nDRAG x: '+ DRAG.x +' y: '+ DRAG.y); // координаты объекта
    }
    tf.text = str;
    spr.graphics.lineStyle(1, 0xff0000, 1);
    spr.graphics.moveTo(stage.stageWidth, event.stageY);
    spr.graphics.lineTo(0, event.stageY);
    spr.graphics.moveTo(event.stageX, stage.stageHeight);
    spr.graphics.lineTo(event.stageX, 0);
  }
  public function tick(evt:Event):void 
  {
    //считаем fps и memory  
    ticks++;
    var now:uint = getTimer();
    var delta:uint = now - last;
    if (delta >= 1000) 
    {
      var fps:Number = ticks / delta * 1000;
      tf.text = fps.toFixed(1) + " fps " + int(System.totalMemory/1024) + 'kb'+ " memory";
      ticks = 0;
      last = now;
    } 
  } 
}
}

Main.as:

//file: Main.as
//language: actionscript 3.0
//author: mixailflash
//site: mixailflash.livejournal.com

package
{
import flash.display.Sprite;
import flash.display.Stage;
import FPSCounter;
public class Main extends Sprite
{
  public function Main() 
  {
    var fps:FPSCounter = new FPSCounter(stage);
    addChild(fps);
    
    //рисуем простой прямоугольник
    var spr:Sprite = new Sprite();
    spr.graphics.beginFill(0xff00ff, 1);
    spr.graphics.drawRect(0,0,100,100);
    addChild(spr);
    
    FPSCounter.DRAG = spr; // передаем прямоугольник что бы его можно было двигать
  }
}
}

Теперь мы можем перемещать объекты и смотреть их новые координаты, а так же смотреть координаты других элементов.

3 комментария:

  1. Блин! Я давеча подгонял один элемент, он должен был совпадать со вторым до пикселя. И даже как-то не подумал, что можно было сделать, чтобы его при запущенном ролике клавишами погонять.

    ОтветитьУдалить
  2. вот и я раньше тоже не мог подумать о таком, а потом решил почему не сделать, вообще я сейчас хочу сделать серию статей об инструментах для тестирования и отладки на живую, все клавиши от F1 до F10, чтобы время не тратить

    ОтветитьУдалить
  3. User referenced to your post from Подгоняем элементы на живую saying: [...] Оригинал взят у в Подгоняем элементы на живую [...]

    ОтветитьУдалить

Поделиться своими мыслями...