Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.12.2010, 03:17
Robotex вне форума Посмотреть профиль Отправить личное сообщение для Robotex Найти все сообщения от Robotex
  № 1  
Ответить с цитированием
Robotex

Регистрация: Aug 2010
Сообщений: 91
По умолчанию Drag&Drop между ячейками

Встала такая задача. Есть на экране ячейки. В них предметы. Нужно реализовать перетаскивание предметов между ячейками (ну инвентарь в RPG-играх, думаю, все видели). Если курсор мыши с предметом находится над пустой ячейкой, то помещаем в нее, иначе возвращаем на исходную позицию (или не прекращаем перетаскивание - как будет удобнее пользователю?).
Так вот, если само перетаскивание это очень просто, то вот с взятием предмета из ячейки и помещением в другую ячейку я разобраться никак не могу. Может кто-нибудь помочь?

Старый 06.12.2010, 08:45
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
addChild, localToGlobal, hitTestObject - вот три вещи, которые могут вам помочь. addChild сменит родителя, localToGlobal представит локальные координаты вещи-ребенка в глобальном виде, hitTestObject определит, в какую ячейку мы пытаемся запихнуть вещь.
__________________
тут я

Старый 06.12.2010, 09:07
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 3  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Код AS3:
var myObjects: Array = stage.getObjectsUnderPoint(new Point(5, 5));
еще вот такая штука может пригодиться.

Старый 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? Цикл использовать? Долго же.

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:45.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 12:45.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.