0

В данный момент разрабатываю проект по проекту 2d Side Scrolling Game или проще говоря, что-то похожее на игру Марио. Проект обязательно должен был быть выполнен в Windows Form Application. Поэтому в архитектуре проекта было решено совершить следующее. Создать две формы. Один для механик, а другой для уровня. Форма с механиками наследует от Form, а форма Level_1 (в данном конкретном случае рассмотрим для первого уровня лишь) наследует от формы с механиками, назовём его Mechanics. Так вот, вся идея этого заключается в том, что когда создается форма Level_1 по умолчанию создается его родитель Mechanics. А это как бы шаблонный форм, то есть все его параметры изначально не проинициализированы, а инициализируются уже в конструкторе класса предка, то есть Level_1, объектами их второго. То есть рассмотрим объект игрока, это PictureBox, в форме Mechanics создаётся пустой PixtureBox, а в форме Mechanics этот же объект получает значение объекта из Level_1, который будет соответствовать игроку в Level_1.

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

System.NullReferenceException: Object reference not set to an instance of an object. at My_Mario_Beta_v1.Mechanics.Gametime_Tick(Object sender, EventArgs e) at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, WM msg, IntPtr wparam, IntPtr lparam)

Оставлю код на всякий случай тут. Уточнено: Код в целом большой, я конкретно не знаю какая часть для решения проблемы будет нужна, поэтому добавлю при надобности.

    public partial class Mechanics : Form
    {
        bool isLeft = false, isRight = false, isJumping = false, gotKey = false;
        int jumpSpeed = 14;
        int force = 10;
        int score = 0;
        const int playerSpeed = 8;
        const int backgroundSpeed = 10;
       public int lifeNum;
        bool hasImmune = false;
        const int ghostSpeed = 4;
        bool returned = false; // false is left, true is right
        const int NS = 70; //NS is number of steps
        int count = NS;
        int timerTicks = 0;
        public PictureBox player;
        Label txtScore;
        PictureBox background;
        PictureBox key;
        PictureBox door_closed;
        PictureBox heart1, heart2, heart3;
        public Mechanics()
        {
            Gametime.Start();
        InitializeComponent();
    }
    //body

}

 public partial class Level_1 : Mechanics
    {
        public Level_1(int heartnum = 3)
        {
            this.player = this.Player1;
            this.lifeNum = heartnum;
            InitializeComponent();
        }
        // body
     }

Vlad
  • 35
  • 7
  • 1
  • @tym32167 Откладка не вариант. Попытка сразу же приводит к исключению выше. Я даже не могу открыть дизайн формы, чтобы понять какой из элементов может конфликтовать с кодом. – Vlad Dec 05 '22 at 14:32
  • 2
    Уберите из конструкторов форм весь код, кроме вызова метода InitializeComponent(). – Alexander Petrov Dec 05 '22 at 15:04
  • 1
    Свой код в конструкторе - зло. Есть же обработчик события Form.Load для такого кода. – aepot Dec 05 '22 at 17:35
  • @AlexanderPetrov, я конечно убрал, ради пробы. Но как и ожидал никаких изменений. В целом понятно в чём может быть логика вами сказанного. Но на данный момент это точно не вызвано этим. – Vlad Dec 05 '22 at 17:48
  • @aepot это конечно хороший совет. Но например в случае количеством жизней при другой архитектуре работала нормально. И в целом не представлю как их переделать с этим обработчиком. Пойду статью поищу. – Vlad Dec 05 '22 at 17:49
  • 1
    Вынесите игровую логику из формы в отдельный класс. Форма не должна ничего делать ароме того чтобы отображать что-либо. Все ваши проблемы в первую очередь от того что каша в коде. Уберите наследование в форме, уберите логику. Почитайте про шаблон проектирования MVP для винформ. Справитесь - жить станет гораздо легче, а писать код интереснее. – aepot Dec 05 '22 at 18:31
  • 1
    @aepot Отметили совершенно правильно, если справлюсь. В целом это потребует большего опыта работы с винформс . Но, однозначно спасибо! – Vlad Dec 06 '22 at 16:11

0 Answers0