1

移動する敵の位置enemy.csのvector2にアクセスするために必要なパーティクルシステム-particle.csを実装しています。パーティクルの複数のインスタンスがあり、<list>の敵もgame1.csで割り当てられています。

私の質問は、game1の<list> isetから敵の場所にアクセスして、particle.csで使用できるようにする方法です。Borhparticle.csとenemy.csはゲームのnamespaeの一部です。

オブジェクトの新しいインスタンスを割り当てたり、public set / getを割り当てたりするさまざまなアプローチを試しましたが、うまくいきませんでした。

ありがとう、ポール。

さらに詳細を追加する:開発PCに戻ったときに実際のコードを追加できますが、今のところはさらにコメントがあります。

enemies.cs-変数が概説された基本クラスです-場所、速度、サイズなど...これらはすべてgame1.csで値を使用して定義されています。

Game1.csには、すべての敵のリストと、それらの位置の別のリストがあります。

Game1.csで呼び出されるパーティクルエンジンがあります。これは、particles.cs->を参照します。ここで、vector2の敵の位置の値を呼び出す必要があります。

game1.csのインスタンスで確立することにより、particle.cs内の敵の場所を呼び出そうとしましたが、これはパーティクルごとであり、実行を超えてゲームの速度が低下します。

コードのどの部分を表示しますか?

ありがとう

4

3 に答える 3

0

パーティクルエンジンが敵のリストにアクセスする必要がある場合は、パーティクルエンジンのコンストラクターでパラメーターとしてリストを渡すことができます。

Game1にはこのようなものがあると思います。

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。また、これはリストへの参照であるため、リストが拡大、縮小、変更された場合でも、その「現在の」メンバーにアクセスできます。

編集:再読すると、あなたはあなたのparticle.csに敵の位置が欲しいと思います。これは、すべてのパーティクルがすべての敵の位置を知る必要があることを意味し、これはおそらく悪い設計です。より良い解決策は、ParticleEngine(ParticleManagerを考えてください)に個々のパーティクルを敵の位置に「相関」させる処理をさせることです。

于 2011-08-05T01:53:54.353 に答える
0

つまり、各パーティクルにGame1への参照を与えようとしたということですか?あなたがそれをしたのか、それともパーティクルごとに新しいGame1を作成しようとしたのかはわかりません。後者は...悪いでしょう(ゲーム内でGame1を実際にインスタンス化したことはないと思います...それは無限の再帰ではないでしょうか?)。しかし、Game1への参照を各パーティクルクラスに渡すだけでは問題はわかりません。particle.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の単一インスタンスを見つける方法を指示するだけで、いわば敵のレジストリを使用できるようになります。

于 2011-08-05T01:48:05.847 に答える
0

これは、クラスから別のクラスに値を渡すことについて私が作成した投稿です。

...つまり、ゲームの周囲に必要なもの(画面の幅など)の値を渡す非常に簡単な方法は、任意のクラスで使用できる「GlobalVariable」を作成することです。この簡単なトリックを実行する方法は次のとおりです。

最初に新しいクラスを作成し、GlobalClassと呼びます。次のようになります。

class GlobalClass
{
}

次に、パブリック変数にアクセスするためのプライベート変数を追加します。ここでは、2つの変数を作成します。1つは画面の高さ用で、もう1つは幅用です。

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; }
    }
}

そして、あなたは完了です!このクラスを使用すると、ゲームのどこにでもこれら2つの変数を渡すことができます。

これらの変数にアクセスするには、次のようにします。

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

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

これで、この方法で、必要な値をどこにでも渡すことができます。

于 2011-08-06T23:05:47.180 に答える