Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   цикл проверки столкновений (http://www.flasher.ru/forum/showthread.php?t=150810)

TexHuK 18.02.2011 12:52

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

Код AS3:

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 становится труе, то идет увеличение шара
Код AS3:

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


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

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