Проверка на конфликт между несколькими динамическими экземплярами в AS3 - PullRequest
0 голосов
/ 20 июня 2011

Хорошо, вот руб.Я делаю небольшую игру лабиринт.В этой игре лабиринт у меня есть стены.Они ссылаются на класс под названием Wall.as.Чтобы обнаружить столкновение с игроком, я делаю это:

MovieClip(parent).checkCollisonWithPlayer(this);

Где (родительский) - класс логики менеджера.Родитель делает это

public function checkCollisonWithPlayer(wall:MovieClip)
    {

        if(player != null)
        {
            Collision.block(player,wall);
        }
    }

Теперь вот моя проблема.У меня есть класс Bullet.as, который делает то же самое:

private function onEnterFrame(event:Event):void
    {
         x+= _vx;
         //Check for collisions with walls and enemies
         MovieClip(parent).checkCollisionWithEnemies(this);
         //Remove if it leads off the stage
        if (x > stage.stageWidth)
        {
            parent.removeChild(this);
        }
    }

Что если я хотел бы проверить на столкновение одну из этих пуль () и одну из этих стен ()?Как я могу это сделать?Они никогда не выполняют одну и ту же функцию в одно и то же время, и почти наверняка в любой момент в игре присутствует более одного.Я новичок в AS, и это похоже на общую проблему, но я не могу выкопать любой материал, который имел смысл.

Вот что мне нужно:

public function checkCollisonWithWall(wall:MovieClip,bullet:MovieClip)
{

    if(bullet.hitTestObject(wall))
        Collision.block(bullet,wall);
    }
}

Но, конечно, это не работает.Какие у меня варианты?

Ответы [ 2 ]

1 голос
/ 20 июня 2011

На простом уровне:

1) отделяет физику от всего остального: она делает вещи проще и удобнее для повторного использования.

2) пусть каждый физический объект зарегистрирует себя, скажем, с менеджером по физике. вы должны следить за тем, чтобы объект был статическим или динамическим (движущимся) и, возможно, даже флагом формы (если вы только хотели столкнуть определенные объекты с другими объектами). флаг формы - это просто целое число, которое сообщает вам, какой это тип

3) иметь одно событие onEnterFrame, а не входной кадр для каждого объекта. это облегчит вашу жизнь

4) в этом единственном событии onEnterFrame вызовите своего менеджера по физике, чтобы обновить объекты и посмотреть, не сталкиваются ли они. Вы можете проверить столкновения между статическими и динамическими объектами и (возможно) динамическими объектами с другими динамическими объектами. Вы можете использовать флаги формы, чтобы исключить ненужные тесты. Если вы обнаружите столкновение, вы можете отправить событие / уведомить ваши объекты / удалить их из игры.

что-то вроде

private function _init():void
{
    // create 4 walls
    for( var i:int = 0; i < 4, i++ )
    {
        var w:Wall = new Wall;

        // position and add to stage etc

        // add it to the physics manager (they don't need an update)
        this._physicsManager.addStatic( w, ShapeFlags.WALL );
    }

    // create 10 bullets
    for( i = 0; i < 10; i++ )
    {
        var b:Bullet = new Bullet;

        // position and add to stage etc

        // add it to the update and physics manager
        this._updateManager.add( b );
        this._physicsManager.addDynamic( b, ShapeFlags.BULLET ); // ShapeFlags is a static class of different types of objects
    }
}

private function _onEnterFrame( e:Event ):void
{
    // if you're moving your objects based on time, then
    // dt is "delta time", i.e., the amount of time that
    // has passed since the last update

    // you can have an update manager that will move your 
    // different objects according to their speed.
    this._updateManager.update( dt );

    // now your objects have moved to their new position,
    // get the physics manager (though in fairness, if it's
    // only doing collisions, then it should just be a 
    // collisions manager) to check for collisions
    this._physicsManager.update();

    // do whatever else
}

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

// frame one: object a is heading towards object b
// and object b is heading towards object a
(a)->   <-(b)

// frame two: because of their speed, they pass through
// each other, and you don't see a collision
<-(b)   (a)->

Эта система - самый простой и простой способ сделать это и, вероятно, подходит для многих игр. Если вам нужно более сложное (например, при проверке коллизий между кадрами), то это немного сложнее, но вы все равно можете это использовать.

Обнаружение / реагирование на столкновения - большая тема, и вы можете найти сотни примеров кода в сети. Однако хорошая структура кода может изменить мир.

0 голосов
/ 20 июня 2011

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

...