XNA выбирает подгруппу Game.Components - PullRequest
0 голосов
/ 09 января 2012

G'day All,

В моей маленькой игре 5 прыгающих мячей и 1 игрок. Сначала я написал код для прыгающих шариков, и каждый шарик имеет метод обнаружения столкновений:

 foreach (Bouncer bouncer in Game.Components) //For each bouncer component in the game...
        {
            if (bouncer != this)// Don't collide with myself
            {
                if (bouncer.collisionRectangle.Intersects(this.collisionRectangle))
                {
                    // How far apart of the positions of the top right hand corners of the sprites when they hit?
                    int deltaX = Math.Abs((int)this.position.X - (int)bouncer.position.X);
                    int deltaY = Math.Abs((int)this.position.Y - (int)bouncer.position.Y);

                    // This is the width and height of a sprite so when two sprites touch this is how far the corners are from each other.
                    int targetWidth = 80;
                    int targetHeight = 80;

                    // The following determins the type of collision (vert hit vs horiz hit)
                    // Because the app is driven by a game based timer the actual amount of sprite overlap when the collision detection occurs is variable.
                    // This bit of simple logic has a 10 pixel tollerance for a hit.
                    // If target - delta is > 10 it will be interpreted as overlap in the non-colliding axis.
                    // If both if statements are triggered it is interpreted as a corner collision resulting in both sprites rebounding back along the original paths.

                    if (targetWidth - deltaX < 10) // The hit is a side on hit. 
                    {
                        this.velocity.X *= -1;
                    }

                    if (targetHeight - deltaY < 10) // The hit is a vertical hit
                    {
                        this.velocity.Y *= -1;   
                    }

                    this.numberOfCollisions = this.numberOfCollisions + 1;
                }
            }
        }

        base.Update(gameTime);
    }

Затем я добавил компонент игрока, и колеса отвалились. Приложение компилируется нормально, но когда я его запускаю, я получаю InvalidCastException и сообщение:

Unable to cast object of type 'Bounce2.Player' to type 'Bounce2.Bouncer'.

Я не хочу включать объект игрока в этот детектор столкновений.

Есть ли способ, которым я могу перечислить свой путь через объекты Bouncer и исключить любые другие объекты?

Спасибо, Эндрю.

1 Ответ

1 голос
/ 09 января 2012

Вы можете использовать это:

foreach (Bouncer bouncer in Game.Components.OfType<Bouncer>()) 

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

...