XNA - доступ к vector2 через классы - PullRequest
1 голос
/ 04 августа 2011

Я реализую систему частиц - element.cs, которая мне нужна для доступа к вектору 2 перемещающейся вражеской локации врага. У меня есть несколько экземпляров частицы, а также враг в , они назначены в game1.cs.

Мой вопрос заключается в том, как мне получить доступ к местоположению врагов из списка в game1 и сделать его доступным в частице .cs. Борх частица и враг являются частью именных игр.

Я пробовал разные подходы к назначению новых экземпляров объектов и назначению публичного набора / получения, но не повезло!

Спасибо, Павел.

Добавление дополнительных деталей: Я могу добавить немного реального кода, когда вернусь на свой компьютер разработчика, но сейчас некоторые дальнейшие комментарии.

враги.cs - это просто базовый класс с выделенными переменными - местоположением, скоростью, размером и т. Д. ... хотя все они определены в game1.cs со значениями.

В Game1.cs у меня есть список всех врагов, а также список их позиций.

У меня есть движок частиц, который вызывается в Game1.cs, который, в свою очередь, ссылается на частиц.с ->, где мне нужно назвать значение местоположения врагов вектора 2.

Я попытался назвать местоположение врагов в файле частиц.cs, установив экземпляр game1.cs, но это для каждой частицы и замедляет игру за пределами работы.

Какие части кода я покажу?

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 августа 2011

Если вашему движку частиц нужен доступ к списку врагов, вы можете просто передать этот список в качестве параметра в конструкторе вашего движка частиц.

Я предполагаю, что у вас есть что-то подобное в вашей игре1:

List<Enemy> enemies = new List<Enemy>();

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

class ParticleEngine
{
    private List<Enemy> _enemies;

    public ParticleEngine(List<Enemy> enemies)
    {
        _enemies = enemies;
    }
}

и в Game1, когда вы создаете свою частицуобъект двигателя, пройдите в список врагов.

ParticleEngine particleEngine = new ParticleEngine(enemies);

Теперь в движке частиц у вас есть доступ к врагам через вашего члена _enemies.И поскольку это ссылка на список, даже если список увеличивается, сжимается, изменяется, вы все равно получите доступ к его «текущим» членам.

РЕДАКТИРОВАТЬ: При повторном чтенииЯ вижу, вы хотите, чтобы местоположение врага в ваших частиц.Это означало бы, что каждая частица должна знать положение каждого врага, и это, вероятно, плохой план.Лучшим решением было бы, чтобы ваш ParticleEngine (думаю, ParticleManager) обрабатывал «корреляцию» отдельных частиц с позицией противника.

0 голосов
/ 07 августа 2011

Вот сообщение, которое я сделал о передаче значения из класса в другой:

... Итак, действительно простой способ передать значение всего, что вы хотите (например, ширину экрана) в вашей игре, - это создать «GlobalVariable», который вы можете использовать в ЛЮБОМ классе, который вы хотите. Вот как выполнить этот простой трюк.

Сначала создайте новый класс и назовите его GlobalClass. Вот так:

class GlobalClass
{
}

Теперь добавьте приватную переменную с открытым способом доступа к ней. Здесь я создаю две переменные, одну для высоты экрана, а другую для ширины.

class GlobalClass
{
    private static float screenWidth; 
    private static float screenHeight;

    //As I said I made this for an other post but the
    //concept is the same if you want to get 
    // a vector2 value try this: private static vector2 enemieposition;
    // or a vector2 List: private static List<Vector2> enemieposition; ... etc

    public static float ScreenWidth
    {
        get { return screenWidth; }
        set { screenWidth = value; }
    }

    public static float ScreenHeight
    {
        get { return screenHeight; }
        set { screenHeight = value; }
    }
}

И все готово! С помощью этого класса вы можете передать эти две переменные в любом месте вокруг вашей игры.

Для доступа к этим переменным сделайте следующее:

//In game1.cs
GlobalClass.ScreenWidth = graphics.PreferredBackBufferWidth;
GlobalClass.ScreenHeight = graphics.PreferredBackBufferHeight;

//In an other class.
int TextureHeight = GlobalClass.ScreenWidth;

Вот и все, таким образом, вы можете передавать любое значение в любом месте.

0 голосов
/ 05 августа 2011

Так вы говорите, что пытались дать каждой частице ссылку на Game1? Я не могу сказать, если вы сделали это или пытались создать новую Game1 для каждой частицы. Последнее было бы ... плохо (я не думаю, что когда-либо создавал Game1 внутри игры ... разве это не бесконечная рекурсия?). Но я не вижу проблемы с простой передачей ссылки на Game1 каждому классу частиц. В частицах.cs:

private Game1 game;

public Particle(/*your constructor vars here*/, Game1 mainGame)
{
    //your existing constructor here
    this.game = mainGame;
}

теперь, когда вы хотите проверить позиции врагов:

private void CheckEnemyPositions() //or whatever you do
{
    foreach(Enemy enemy in game.Enemies)
    {
        //do something with enemy.Position
    }
}

это ... не должно вызывать проблем с производительностью. По крайней мере, не так, как я понимаю. Он просто говорит каждой частице, как найти ваш единственный экземпляр Game1.cs, чтобы они могли использовать, так сказать, реестр противника.

...