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

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

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

Регистрация: Oct 2010
Сообщений: 85
По умолчанию Ограничение при передвижении объекта [Math.max(Math.min())]

Не могу разобраться, как остановить объект, когда он упрется в грань другого объекта.
Не получается определить длину отрезка.

В примере, если тянуть за кружок, отрезок будет сокращаться до следующей грани, но за ее пределы он не должен заходить.

test.swf   (2.5 Кб)


Main
Код AS3:
package {
 
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class Main extends Sprite {
 
		private var contLine:Sprite = new Sprite();
		private var line:SquareGraphic;
		private var _markers:Array = [];
		private var arrLine:Array = [];
 
		private var cumulateW:Number = 0
 
		public function Main():void {
			addChild(contLine);
 
			for (var i:int = 0; i < 8; i++) {
 
				line = new SquareGraphic(50 + Math.random() * 70, 30, 0xCCCCCC, 1, 0x0);
				contLine.addChild(line);
				line.alpha = 0.5;
				line.x = cumulateW;
				arrLine.push(line);
 
				cumulateW += line.width;
 
				var marker:Marker = new Marker(cumulateW, 15);
				addChild(marker);
 
				_markers[i] = marker;
			}
 
			addEventListener(Marker.MOVED, moved);
		}
 
		private function moved(e:Event=null):void {
 
			for (var i:int = 0; i < _markers.length; i++) {
 
				var pMarker:Number = 0;
				if (i > 0) {
					pMarker = _markers[i - 1].x;  
				}else{
					pMarker = 0;
				}
				arrLine[i].x = pMarker;
				arrLine[i].update(_markers[i].x - pMarker, 30); 
			}
		}
 	}
 
}
Marker
Здесь я пытался с помощью Math.max;min останавливать перемещение.
Код AS3:
package {
 
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class Marker extends Sprite {
 
		static public const MOVED:String = "move";
 
 
		public function Marker(xPos:int = 0, yPos:int = 0) {
			graphics.lineStyle(0.1);
			graphics.beginFill(0xFFFFFF);
			graphics.drawCircle(0, 0, 5);
			graphics.endFill();
 
			x = xPos;
			y = yPos;
 
			buttonMode = true;
 
			addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
		}
 
 
		private function mouseDown(e:MouseEvent):void {
			stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
			stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
		}
 
 
		private function stage_mouseUp(e:MouseEvent):void {
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
			stage.removeEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
		}
 
 
		private function stage_mouseMove(e:MouseEvent):void {
			x = e.stageX;
 
			dispatchEvent(new Event(MOVED, true));
		}
 
		override public function get x():Number { return super.x;}
		override public function set x(value:Number):void {
 
			//!! 
			//value = Math.max(0, 0);
			//value = Math.min(0, 0);
 
			if (x != value) {
				super.x = value;
 
			}
		}
 
	}
 
}
Код AS3:
package {
	import flash.display.Graphics;
	import flash.display.Sprite;
 
	public class SquareGraphic extends Sprite {
		public var g:Sprite;
		private var thickness:Number;
		private var colorLine:uint;
		private var initWidth:Number;
		private var initHeight:Number;
		private var color:uint;
 
		public function SquareGraphic(initWidth:int, initHeight:int, color:uint = 0x000000, thickness:Number = 0, colorLine:uint = 0xFFFFFF) {
			g = new Sprite()
			addChild(g)
			this.thickness = thickness;
			this.color = color;
			this.colorLine = colorLine;
			this.initWidth = initWidth
			this.initHeight = initHeight;
 
			g.graphics.beginFill(color);
			if(thickness > 0)g.graphics.lineStyle(thickness, colorLine, 1, true, "none", "round");
			g.graphics.drawRect(0, 0, initWidth, initHeight);
			g.graphics.endFill();
 
		}
 
 
		public function update(initWidth:Number, initHeight:Number):void {
			this.initWidth = initWidth
			this.initHeight = initHeight;
 
			g.graphics.clear();
 
			g.graphics.beginFill(color);
			if(thickness > 0)g.graphics.lineStyle(thickness, colorLine);
			g.graphics.drawRect(0, 0, initWidth, initHeight);
			g.graphics.endFill();
		}
	}
}
Вложения
Тип файла: swf test.swf (2.5 Кб, 53 просмотров)

Старый 29.10.2015, 10:38
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 2  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Может стоит делать это снаружи? Например в обработчике moved. Проверять чтобы линия не вышла за границы соседские (не стала меньше иксом, чем сосед слева, и больше чем справа). А если стала - скидывать на соседские координаты +- оффсет?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

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

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


 


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


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