Просмотр полной версии : цикл проверки столкновений
Здравствуйте, делаю игрушку небольшую, сюжет простой. Пытаюсь победить одну траблу.
В общем, в верху рандомно появляются танки, но иногда бывает, что танки появляются друг на дружке, я пытаюсь сделать эту проверку,
for (i = 0; i < tankContainer.numChildren; i++)
{
var movingTankA:tankMc = tankContainer.getChildAt(i) as tankMc;
for (j = 0; j < tankContainer.numChildren; j++)
{
var movingTankB:tankMc = tankContainer.getChildAt(j) as tankMc;
if (movingTankA.hitTestPoint(movingTankB.x,movingTankB.y,true))
{
movingTankA.y += 24;
}
break;//завершаем цикл
}
}
если 1 танк налез например на 2-й танк, то надо его отодвинуть назад или вперед безразници
но в место этого, я получаю скорость в 24 пикселя, и танк просто проносится по экрану..
не могу понять, почему условие не становится в false? Прошу помощи..
У вас внутренний цикл идет по всем танкам, на одной из его итераций tankB == tankA, и танк проверяется на пересечение с самим собой. В итоге гарантированно сдвигаются все танки.
Поменяйте начальное значение j c 0 на i + 1.
На первой итерации внешнего цикла переменной movingTankA становиться танк с индексом 0. Во вложенном цикле, на первой же итерации, переменной movingTankB становиться танк с индексом 0, то есть тот же самый, на который ссылается и movingTankA. Разумеется при проверке столкновения танка с его же координатами мы будем получать true.
ага, ясно, спасибо :)
А объясните мне еще такую вещь, как лучше проверять спрайты на столкновения, т. е. проверить не наложился ли спрайт на спрайт? hitTestPoint или hitTestObject?
GAIKER, кстати, поменял, все равно некоторые танки налазят друг на друга :(
Извините, что поднимаю эту тему, но всетеки объясните пожалуйста в чем причина?
Делаю маленькую игру, и не могу понять почему столкновения так некорректно работают
вот пример работы игры, нужно щелкнуть мышкой в любом месте, и уведите результат.
Проблема следующая, шары не долетают друг до друга, и срабатывает столкновение.
http://webexpa.co.cc/ballc.swf
Не могу понять, как организовываются правильно столкновения??
вот примерный код энтерфрейма
если flagColl становится труе, то идет увеличение шара
private function onEnterFrame(e:Event):void
{
for (var i:int = 0; i < continers.numChildren; i++)
{
var chas:Chastica = continers.getChildAt(i) as Chastica;
chas.x += chas.dx;
chas.y += chas.dy;
if (chas.x + ballRadius > rightWall)
{
overshot = (chas.x + ballRadius) - rightWall;
chas.x -= overshot * 2;
if (chas.rightWallF)
{
chas.dx = Math.random() * 3;
chas.rightWallF = false;
}
chas.dx *= -1;
}
if (chas.x - ballRadius < leftWall)
{
overshot = leftWall - (chas.x - ballRadius);
chas.x += overshot * 2;
if (chas.leftWallF)
{
chas.dx = Math.random() * 3;
chas.leftWallF = false;
}
chas.dx *= -1;
}
if (chas.y + ballRadius > downWall)
{
overshot = (chas.y + ballRadius) - downWall;
chas.y -= overshot * 2;
if (chas.downWallF)
{
chas.dy = Math.random() * 3;
chas.downWallF = false;
}
chas.dy *= -1;
}
if (chas.y - ballRadius < upWall)
{
overshot = upWall - (chas.y - ballRadius);
chas.y += overshot * 2;
if (chas.upWallF)
{
chas.dy = Math.random() * 3;
chas.upWallF = false;
}
chas.dy *= -1;
}
for (var j:int = 0; j < continersP.numChildren; j++)
{
var posBall:Chastica = continersP.getChildAt(j) as Chastica;
if (posBall.hitTestObject(chas))
{
chas.flagColl = true;
}
}
for (var k:int = i+1; k < continers.numChildren; k++)
{
var chas2:Chastica = continers.getChildAt(k) as Chastica;
if (chas2.hitTestObject(chas) && chas.flagColl)
{
chas2.flagColl = true;
}
}
}
if (!flagPos)
{
chasP.flagColl = true;
}
}
Cornford
15.04.2011, 14:24
Скорее всего дело в hitTestObject
Anton Riot
15.04.2011, 15:46
столкновение кругов просто проверить без hitTest'а - вычислив расстояние от центра одного до центра другого. Если оно меньше суммы радиусов - круги столкнулись.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.