Перейти к содержимому
Jet the Hawk

Помогите определить пересечение двух клипов

Рекомендуемые сообщения

У меня такая ситуация: надо определить коллизию двух клипов неправильной формы. метод hitTest () не помогает. Нашол в нете кое-какой код но он не работает, и заодно обьясните как-работает getBounds(). Вот кодик:

// Создаем метод, по стилю использования схожий с hitTest()
MovieClip.prototype.myHitTest = function(clip:MovieClip, n:Number):Boolean  {
// Параметр n задает размер "пикселя". Он необязателен - по умолчанию для
// него используем значение 2
if (n == undefined) {
	var n:Number = 2;
}
// Определяем координаты граничных точек клипов. Так как в дальнейшем 
// придется использовать их как параметры метода hitTest(), то вычислены они
// должны быть в системе координат _root.
var coord1:Object = this.getBounds(_root);
var coord2:Object = clip.getBounds(_root);
// Вычисляем площади клипов. У которого из них она окажется меньше,
// относительно того определяем коллизию
var squarel:Number = Math.abs((coord1.xMax-coord1.xMin)*(coord1.yMax-coord1.yMin));
var square2:Number = Math.abs((coord2.xMax-coord2.xMin)*(coord2.yMax-coord2.yMin));
var coord:Object = square1>square2 ? coord2 : coord1;
// Перебираем все "пиксели"
for (var i = coord.xMin+n/2; i<=coord, xMath; i += n) {
	for (var j = coord.yMin+n/2; j<=coord.yMax; j += n) {
		// Если один и тот же "пиксель" занят в обоих клипах, возвращаем true
		if (((clip.hitTest(i, j, true) ? 1 : 0)+(this.hitTest(i, j, true) ? 1 : 0)) == 2) {
			return true;
		}
	}
	// Если общих "пикселей" не обнаруживается, возвращаем false
	return false;
}
};
onEnterFrame=function(){
if (_root.ball.myHitTest(_root.ball2)) {trace ("Пересеклось")}
}

Флешеры, отзовитес!

Поделиться сообщением


Ссылка на сообщение

Ппробуй клипу создасть символ в виде кружочка(контроллер) а другому клипу Body и попробуй хит тест между ними сделать...мы с друзьяями так делали когда игру делали(аркада)

Поделиться сообщением


Ссылка на сообщение

Интересный метод :)

Однако меня смущает пара моментов:

 

1)for (var i = coord.xMin+n/2; i<=coord, xMath; i += n)

по видимому вместо "coord, xMath" должно быть "coord.xMax"

 

2)if (((clip.hitTest(i, j, true) ? 1 : 0)+(this.hitTest(i, j, true) ? 1 : 0)) == 2)

непонятно для чего такой огород

if ((clip.hitTest(i, j, true))&&(this.hitTest(i, j, true))) чем это хуже?

Поделиться сообщением


Ссылка на сообщение

уже кое-что получается, но trace("Пересеклось") выводится тогда, когда центральная точка меньшего клипа, пересекается со вторым клипом. Всеровно что-то не так.

Поделиться сообщением


Ссылка на сообщение

И вообще ДЖет ты какой-то сложный подход сделал..думай проще :)

Поделиться сообщением


Ссылка на сообщение

Чтобы это работало, цикл должен выглядеть так:

for (var i = coord.xMin+n/2; i<=coord.xMax; i += n) 
{
  for (var j = coord.yMin+n/2; j<=coord.yMax; j += n) 
  {
  if ((clip.hitTest(i, j, true)) && (this.hitTest(i, j, true))) return true;
}
}
return false;

 

Создаётся впечатление, что код специально "подпортили"

Изменено пользователем E-mail

Поделиться сообщением


Ссылка на сообщение

E-mail -- огромное спасибо, все работает!

Поделиться сообщением


Ссылка на сообщение

if (_root.game.wall.hitTest(point.x, point.y, true)) {
	vy = 0;
	startPoint = this._y;
	for (i = startPoint; i < 400; i++) {
		this._y = i;
		point = {x:0, y:0};
		controller.topPoint.localToGlobal(point);			
		if (!_root.game.wall.hitTest(point.x, point.y, true)) {
			break;

Вот ещё способ... вообще тотже хит тест, валл 1 клип а прописываем мы контроллеру... здесь м ыпроверяем пложение по икс и по игрик и если есть конклусио ТО клип(в данном случаее герой) не падает вниз..

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×