PDA

Просмотр полной версии : цикл проверки столкновений


TexHuK
18.02.2011, 12:52
Здравствуйте, делаю игрушку небольшую, сюжет простой. Пытаюсь победить одну траблу.
В общем, в верху рандомно появляются танки, но иногда бывает, что танки появляются друг на дружке, я пытаюсь сделать эту проверку,


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? Прошу помощи..

Gaen
18.02.2011, 13:12
У вас внутренний цикл идет по всем танкам, на одной из его итераций tankB == tankA, и танк проверяется на пересечение с самим собой. В итоге гарантированно сдвигаются все танки.
Поменяйте начальное значение j c 0 на i + 1.

bav
18.02.2011, 13:14
На первой итерации внешнего цикла переменной movingTankA становиться танк с индексом 0. Во вложенном цикле, на первой же итерации, переменной movingTankB становиться танк с индексом 0, то есть тот же самый, на который ссылается и movingTankA. Разумеется при проверке столкновения танка с его же координатами мы будем получать true.

TexHuK
18.02.2011, 13:27
ага, ясно, спасибо :)
А объясните мне еще такую вещь, как лучше проверять спрайты на столкновения, т. е. проверить не наложился ли спрайт на спрайт? hitTestPoint или hitTestObject?

GAIKER, кстати, поменял, все равно некоторые танки налазят друг на друга :(

TexHuK
15.04.2011, 12:25
Извините, что поднимаю эту тему, но всетеки объясните пожалуйста в чем причина?
Делаю маленькую игру, и не могу понять почему столкновения так некорректно работают
вот пример работы игры, нужно щелкнуть мышкой в любом месте, и уведите результат.
Проблема следующая, шары не долетают друг до друга, и срабатывает столкновение.

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'а - вычислив расстояние от центра одного до центра другого. Если оно меньше суммы радиусов - круги столкнулись.