Редактирование свойств классов из другого класса - PullRequest
0 голосов
/ 27 января 2019

Название, вероятно, слишком упрощено, поэтому, пожалуйста, прочитайте всю проблему здесь.

У меня есть 4 класса: менеджер уровней, игроков, сеток и физики.
Менеджер должен управлять сетками.У игрока есть одна сетка (сетки содержат несколько хитбоксов).Они оба загружены в конструктор уровня.

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

Вот как я хочу, чтобы мой код был структурирован (и как это почти сейчас):

public class Player
{
    public SFPhyMesh Mesh { get; set; }

    public Player()
    {
        Mesh = new Mesh();
    }
}

public class PhysicsManager
{
    public List<Mesh> Meshes;

    public void AddMesh(Mesh mesh)
    {
        Meshes.Add(mesh);
    }
}

public class Level
{
    PhysicsManager physics;
    Player player;

    public Level()
    {
        player = new Player();

        physics = new PhysicsManager();
        physics.AddMesh(player.Mesh);
    }
}

Обратите внимание, что я исключил все менее важные части.
Проблема здесь в том, что функция AddMesh создает копию для добавления в список.Я попытался поместить ключевое слово ref перед его параметром, но безуспешно.Я также пытался создать открытую переменную для сетки игрока вместо открытого свойства в сочетании с ключевым словом ref в функции AddMesh, но безуспешно.Выглядит так:

public class Player
{
    public SFPhyMesh Mesh;
    ...
}
public void AddMesh(ref Mesh mesh)
{
    Meshes.Add(mesh);
}
public class Level()
{
    player = new Player();

    physics = new PhysicsManager();
    physics.AddMesh(ref player.Mesh);
}

Единственный способ, которым это работает, это когда конструктор Level выглядит так:

public class Level
{
    PhysicsManager physics;
    Player player;

    public Level()
    {
        var pMesh = new Mesh();

        player = new Player();
        player.Mesh = pMesh();

        physics = new PhysicsManager();
        physics.AddMesh(pMesh);
    }
}

Я не хочу, чтобы уровень класса беспокоился осетка каждого игрока / врага / лица.Мне нужно, чтобы каждый из этих классов отвечал за свою собственную сетку.Но я изо всех сил стараюсь предоставить менеджеру по физике точное местоположение в памяти меша игрока.

Я проверяю это, добавляя гравитацию к сетке с метками «падающие».В менеджере я только добавляю эту одну сетку, и я ставлю точку останова, где должна применяться сила тяжести, и эта точка останова попадает.Я вижу, что сетка, которую притягивает гравитация, успешно меняет свою скорость и положение, но я не вижу этого на экране.Я вижу, что мой игрок стоит на месте, а не падает.Это может означать только то, что копия меша игрока добавляется в список мешей в менеджере физики вместо меша реального игрока.Конечно, это происходит только с первой версией конструктора уровня.

Есть ли способ оставить конструктор уровня вне всего этого бизнеса с сетками?

1 Ответ

0 голосов
/ 27 января 2019

Я полагаю, что вы ищете метод AddPlayer на уровне:

public class Level
    {
        PhysicsManager physics;

        public Level()
        {
            physics = new PhysicsManager();
        }

        public void AddPlayer(Player Player)
        {
            physics.AddMesh(Player.Mesh);
        }
    }

Вам нужно назвать его в своем коде как:

Level myLevel = new Level();
myLevel.AddPlayer(newPlayer);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...