Как скомпилировать и запустить демки Physics2D.NET в 64-битной среде - PullRequest
1 голос
/ 24 июля 2011

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

Я хотел поиграть с физическим движком 2D в C #. Я скачал Box2dx и Physics2D.Net. Демонстрации для Box2dx прошли хорошо, но меня беспокоит производительность и сложность кодирования. Поэтому я решил попробовать Physics2D.Net (я не могу найти много информации для сравнения Box2dx и Physics2d.Net, но я уверен, что Physics2D.Net проще кодировать на основе того, что я прочитал, и я есть подозрения, что это может работать лучше). К сожалению, демо не запустится. Я получаю исключения BadImageFormat при попытке запустить пример программы Physics2DDemo в 64-разрядной версии Windows 7.

Как я уже сказал, я выяснил, как запустить демонстрацию, поэтому я надеюсь, что вы не возражаете против того, чтобы я опубликовал и принял мой собственный ответ, но за любые другие полезные комментарии, связанные с этой темой, я все равно буду голосовать и если у кого-то есть лучший ответ (например, «попробуйте другую загрузку, которая работает лучше»), я все равно могу выбрать свой собственный.

Ответы [ 3 ]

1 голос
/ 24 июля 2011

После загрузки исходного кода для SdlDotNet для отладки в источник BadImageformatException, возникшего при загрузке шрифта, я обнаружил, что это происходит при попытке инициализировать систему шрифтов.Мое предположение относительно того, почему это происходило, заключалось в том, что где-то там еще работала какая-то 32-битная DLL, и все сборки .NET работали в 64-битном процессе.Поэтому я заставил сборки .NET самого высокого уровня ориентироваться на x86 вместо любого процессора.Для этого в Visual C # 2010 Express я открыл меню «Сборка», выбрал «Диспетчер конфигурации», выбрал «x86» в качестве платформы Active Solution и внес некоторые изменения в 3 проекта

  • Physics2DDemo
  • Physics2DDotNet
  • Physics2DDotNet.Demo

(мне, вероятно, не нужно было менять все это, но изменение только Physics2DDemo, похоже, не сработало.потому что мне нужно было заново открыть решение и / или восстановить его более принудительно, но в итоге это сработало.) Вот изменения, которые я внес в каждый проект:

  1. В столбце платформы выберите «"
  2. Во всплывающем диалоговом окне выберите x86 в качестве новой платформы и выберите" Любой ЦП "в качестве источника для копирования.
  3. Установите флажок" Сборка ".
  4. Закройте окно Configuration Manager и откройте настройки проекта для этого отдельного проекта.
  5. На вкладке «Сборка» удалите «x86» из пути вывода, оставив только bin \ Debug.

Оглядываясь назад, я думаю, что должен был поставить флажок «Сборка» в каждом проекте, что могло бы уменьшить некоторые мои проблемы с синхронизацией версий DLL проекта.

Это помогло мне справиться с проблемой шрифта, но только с помощью пары строк кода. Затем произошел сбой при выполнении инициализатора типа для SurfaceGl. В этой строке произошел сбой:

static glLoadIndentityDelegate glLoadIdentity = 
(glLoadIndentityDelegate)Marshal.GetDelegateForFunctionPointer(
Sdl.SDL_GL_GetProcAddress("glLoadIdentity"), typeof(glLoadIndentityDelegate));

Видимо SDL_GL_GetProcAddress возвращался0. Как оказалось, код, который я скачал для SdlDotNet, будучи несколько новее, чем код, поставляемый с Physics2D.Net, не работал с Physics2D.Net. Я заменил обновленный DLLs с оригинальными DLL, и теперь я могу скомпилировать и запустить демонстрацию Physics2D.NET!

Конечно, любой, кто хочет включить Physics2D.NET в чистый движок .NET, или тот, кто может для 64-битного процесса, вероятно, захочет создать цель решения AnyCPU вместо цели x86.И, возможно, стоит поменять все проекты в цели решения x86 на x86.

Я заметил, что теперь я могу переключать цели проекта так, чтобы Physics2DDemo была единственной сборкой проекта как x86.Остальные сборки, являющиеся DLL, будут загружаться в этот процесс так, как того пожелает этот процесс.Поэтому достаточно просто заставить эту сборку запустить 32-битный процесс.

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

0 голосов
/ 28 августа 2014

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

        string dataDir = "C:\\Windows\\Fonts\\arial.ttf";
        font = new Font(dataDir, 40);
        font.Bold = true;
        font2 = new Font(dataDir, 15);

в строках 97 - 100 на "Demo.cs". Работал на меня.

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

если вы получили «файл не найден» после вышеуказанных изменений,

вам также может понадобиться добавить .. |к началу dataDir, поэтому он становится

static readonly string dataDir =
  @"..|..|..|..|data".Replace('|',Path.DirectorySeparatorChar);

, как в VS2010, вы получаете дополнительный уровень каталогов, когда вы играете с платформами и целями ...

...