ActionScript 3 весы Пример

Пример обычных чашечных весов. Как в овощном магазине или в суде.

Описание задачи

Сделать весы как в жизни. Чтоб можно было бросать на чашу разные штуки и весы качались, качались и склонялись в нужную сторону.

Математика простая. Все достигается перемножением двух функций sin и exp. В терминах ActionScript - Math.pow(t)*Math.sin(t)

Надо чтобы все получилось примерно как на такой картинке:

Добавляем слушателя:

stage.addEventListener(Event.ENTER_FRAME, _scaleHandler);

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

function _scaleHandler(e:Event):void{
if(ves.left.weight > ves.right.weight){
		ves.rotation = -(angle-Math.pow(.2,a)*60) - (Math.sin(.5*a))*(Math.pow(0.92,a))*15;
		prevState = 1;
	}else if(ves.left.weight < ves.right.weight){
		ves.rotation = (angle-Math.pow(.2,a)*60) + (Math.sin(.5*a))*(Math.pow(0.92,a))*15;
		prevState = 2;
	}else if(ves.left.weight == ves.right.weight){
		if(prevState == 1){
			ves.rotation = (angle-Math.pow(.5,a)*20) + (Math.sin(.5*a))*(Math.pow(0.92,a))*15;
		}else if(prevState == 2){
			ves.rotation = -(angle-Math.pow(.5,a)*20) - (Math.sin(.5*a))*(Math.pow(0.92,a))*15;
		}else{
			ves.rotation =  - (Math.sin(.5*a))*(Math.pow(0.92,a))*15
		}
	}
	a = a+.2;
	ves.left.rotation = -ves.rotation;
	ves.right.rotation = -ves.rotation;
}

Чашки весов я поместил внутрь мувика с планкой. Такое расположение позволяет нам легко выравнивать чаши в горизонтальном положении в каждом кадре:

ves.left.rotation = -ves.rotation;
ves.right.rotation = -ves.rotation;

Для наглядности я добавил три кнопки. Они будут эмулировать загрузку весов. Каждый может нагружать на весы разные вещи. Это достаточно просто сделать. В результате получились такие вот весы:

Файлы, используемые в статье.

Упакованный fla файл весов .zip

Александр Смелков
Санкт-Петербург Зима 2011