Показать сообщение отдельно
Старый 07.12.2010, 05:21
Robotex вне форума Посмотреть профиль Отправить личное сообщение для Robotex Найти все сообщения от Robotex
  № 4  
Ответить с цитированием
Robotex

Регистрация: Aug 2010
Сообщений: 91
Вот я по быстрому наваял пример.

Код AS3:
package {
 
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.MouseEvent;
  import flash.text.TextField;  
 
  public class Main extends Sprite { 
    private var dragTarget:Sprite;
	private var startX:int;
	private var startY:int;
 
    public function Main() {
 
 
	  var board:Sprite = new Sprite();
      var letters:Array = new Array("d","i","r","t","y","r","o","o","m")
      var l:String;
      var xPos:uint = 50
      var yPos:uint = 100
      for each (l in letters) {
        var tile:Sprite = new Sprite();
        tile = createLetterTile(l as String) // size, color yellow
        tile.x = xPos;
        tile.y = yPos;
        xPos += 50;
        board.addChild(tile);
        tile.addEventListener(MouseEvent.MOUSE_DOWN, dragStarter, false);
        tile.addEventListener(MouseEvent.MOUSE_UP, dragStopper);
		tile.addEventListener(Event.MOUSE_LEAVE, dragLeave);
      }
      addChild(board)
 
      var instructions:TextField = new TextField();
      instructions.text = "Re-order the letters to form another word."
	  instructions.selectable = false;
	  instructions.mouseEnabled = false;
      instructions.x = 20
      instructions.y = 20
      instructions.width = 300;
      addChild(instructions);
 
    }
 
    private function dragStarter(event:MouseEvent):void {
      if (event.target is Sprite) {
        dragTarget = event.target as Sprite;
		startX = dragTarget.x;
		startY = dragTarget.y;
        dragTarget.startDrag();
      }
    }
 
    private function dragStopper(event:MouseEvent):void {
      dragTarget.stopDrag();
 
 
	  if(dragTarget.hitTestObject(this.obj1) && obj1.busy == null)
	  {
		  dragTarget.x = obj1.x;
		  dragTarget.y = obj1.y;
		  obj1.busy = true;
		  obj2.busy = null;
		  obj3.busy = null;
	  }
	  else if(dragTarget.hitTestObject(this["obj2"]) && obj2.busy == null)
	  {
		  dragTarget.x = obj2.x;
		  dragTarget.y = obj2.y;
		  obj1.busy = null;
		  obj2.busy = true;
		  obj3.busy = null;
	  }
	  else if(dragTarget.hitTestObject(this["obj3"]) && obj3.busy == null)
	  {
		  dragTarget.x = obj3.x;
		  dragTarget.y = obj3.y;
		  obj1.busy = null;
		  obj2.busy = null;
		  obj3.busy = true;
	  }
	  else
	  {
		  dragTarget.x = startX;
		  dragTarget.y = startY;
	  }
 
    }
 
	private function dragLeave(event:Event):void
	{
		dragTarget.x = startX;
		 dragTarget.y = startY;
	}
 
    private function createLetterTile(txt:String):Sprite {
      var s:Sprite = new Sprite();
      var letter:TextField = new TextField();
	  letter.selectable = false;
      var tileBackColor:uint = 0xDBD9A6;
      var tileShadowColor:uint = 0x676420;
      var tileBorderColor:uint = 0x000000;
 
      s.graphics.beginFill(tileShadowColor);
      s.graphics.drawRect(-2, 2, 40, 40);
      s.graphics.endFill();
      s.graphics.beginFill(tileBackColor);
      s.graphics.drawRect(0, 0, 40, 40);
      s.graphics.endFill();
      s.graphics.lineStyle(1, tileBorderColor, 100);
      s.graphics.drawRect(0, 0, 40, 40);
 
      letter.text = txt
      letter.selectable = false;
      letter.mouseEnabled = false;
      letter.x = 14
      letter.y = 14
      letter.width = 14
      letter.height = 16
      s.addChild(letter)
 
      return s;
    }
  }
}
На стейдже лежат три мувиклипа с именами obj1, obj2 и obj3.

Когда курсор с перетаскиваемым объектом уходит за пределы приложения, объект должен возвращаться на исходную позицию, а этого не происходит. И как бы поразумнее проверять сводна ячейка или занята? Да и проверка столкновений не по вкусу - а если ячеек 100? Цикл использовать? Долго же.