Как вызвать метод из WindowsForms в Monogame?

Привет, я сейчас работаю над проектом. Моя основная форма - это форма, и всякий раз, когда я нажимаю кнопку, запускается программа моноигры. Это работает.

Теперь я сделал метод в основной форме и хочу передать логическое значение в форму моногейма.

Метод основной формы: (если флажок установлен, моноигра должна рисовать линию горизонта)

public bool skyCheck()
    {
        if (checkBox1.Checked == true)
        {
            sky = true;                
        }
        else
        {
            sky = false;
        }
        return sky;

Проверка моноигры:

if (skyCheck() == true)
        {
            DrawSky();
        }

Это дает мне имя «skyCheck» не существует в текущем контексте.


person user2393839    schedule 05.06.2013    source источник
comment
Код, который вы разместили, не имеет ничего общего с вашей проблемой. Похоже, вы объявляете skyCheck() в другом классе, где вы пытаетесь его использовать. Вам нужно будет предоставить больше информации, которую вы хотите, чтобы кто-то помог вам с этим.   -  person craftworkgames    schedule 06.06.2013


Ответы (2)


Я сделал элемент управления, который встраивает моноигру в форму, чтобы не запускать отдельную программу. Это не обычная встроенная моноигра, которую вы видите, которая дает вам только графическое устройство и не требует обновлений или игровых методов. это настоящая встроенная моноигра.

Это не является источником вашей проблемы, но может помочь исправить ее, а также улучшить вашу программу.

Здесь находится источник, а в файле Readme содержится краткая документация по использованию Это

person Daniel Johnson    schedule 19.06.2013

Передайте ссылку на форму конструктору Game1:

public class Game1 : Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    //Change the Form1 to the name of the form class.
    Form1 form;

//...

    public Game1(Form1 form)
    {
       this.form = form;
       graphics = new GraphicsDeviceManager(this);
       Content.RootDirectory = "Content";
    }
//...
// I will assume the DrawSky() should be called in Draw.

    protected override void Draw(GameTime gameTime)
    {
//...
       if (form.skyCheck()) // the "== true" is redundant.
       {
           DrawSky();
       }
//...
    }
}

Следующий код обычно был бы в Program.cs, но для приложения Window Forms этот код будет в форме, которая запускает игру:

game = new Game1(this); // where "this" refers to the current form
game.Run();

Обратите внимание на предостережения относительно смешивания форм Windows и MonoGame:

  1. Помпа сообщений формы и игра работают в одном потоке. Любая задержка в форме приведет к задержке игры.
  2. Будет штраф за производительность.
  3. Убедитесь, что игра корректно завершает работу, прежде чем форма будет выгружена, чтобы убедиться, что ресурсы правильно очищены.

Можно запустить еще один поток для запуска игры (таким образом обойдя первые два предостережения), но вся связь между двумя потоками должна быть потокобезопасной. Потокобезопасность гарантируется для логических назначений, а также для целочисленных назначений (=‹ 32 бита для 32-битных процессов и =‹ 64 для 64-битных процессов).

Требуется согласование выхода в обоих потоках.

person Strom    schedule 25.04.2019