用于我的DirectX游戏引擎的WPF World Editor

我正在使用DirectX开发C ++中的小游戏和游戏引擎。 目的是教育和娱乐。

我的下一个目标是建立一个使用游戏引擎的简单世界编辑器。 为此,我需要将引擎移动到dll中,以便可以由游戏和/或编辑使用。 世界编辑将是一个独立的工具,而不是游戏的一部分。 世界编辑器的主要目的是读入并显示我的(自定义)场景文件,并允许我注释/修改世界对象(网格)的属性,克隆对象,拾取和移动对象并放下它们,缩放对象等,然后保存修改过的场景,以便以后可以通过游戏读取。

建议我使用wxWidgets作为编辑器。 一些研究让我觉得wxWidgets有点老旧笨重,但我确信使用它可以编写非常好的GUI。 这只是一个陡峭的学习曲线,我不期待。 我已经获得了样本来建立和运行,但这是一个令人头疼的问题。

多一点研究,我发现我可以使用D3DImage将DirectX集成到WPF应用程序中。 我对WPF做了一些小小的改动,并没有觉得它太吓人,并且有很多好书可用(wxWidgets中只有一本旧书),以及网络上的大量信息。 我已经得到了旋转三角形的例子,它看起来非常简单。

所以我的问题是:

WPF是否允许我创建一个体面的小世界编辑器应用程序来重新使用我的游戏引擎?

我的游戏引擎目前使用RawInput作为鼠标和键盘; 这将如何与WPF一起工作?

WPF如何影响我的消息泵?

它看起来像我将不得不写很多功能(外观模式?),以允许WPF与我的游戏引擎进行交互。 有没有简单的方法来分解这个问题,所以它不会被编译到游戏中?

任何其他技巧或想法如何进行将不胜感激!

谢谢。


你需要创建一个包装类来公开你的游戏的某些功能。

例如。 这个函数在我的c ++游戏引擎编辑器中。

extern "C" _declspec(dllexport) void SetPlayerPos(int id, const float x, const float y, const float z);

然后在你的c#wpf应用程序中,你可以创建一个静态类,允许你使用这些函数

[DllImport(editorDllName, CallingConvention = CallingConvention.Cdecl)]
public static extern void SetPlayerPos(int id, float x, float y, float z);

您将不得不通过dll为游戏引擎的基本功能提供功能。 像

EditorMain RenderFrame /更新DXShutdown

那么你可以在你的wpf app构造函数中调用editormain

System.IntPtr hInstance = System.Runtime.InteropServices.Marshal.GetHINSTANCE(this.GetType().Module);
IntPtr hwnd = this.DisplayPanel.Handle;
NativeMethods.EditorMain(hInstance, IntPtr.Zero, hwnd, 1, this.DisplayPanel.Width, this.DisplayPanel.Height);

您将需要创建一个消息过滤器类并在构造函数中初始化它

m_messageFilter = new MessageHandler(this.Handle, this.DisplayPanel.Handle, this);

以下是您的消息过滤器类的外观

public class MessageHandler : IMessageFilter 
{
    const int WM_LBUTTONDOWN = 0x0201;
    const int WM_LBUTTONUP = 0x0202;


    IntPtr m_formHandle;
    IntPtr m_displayPanelHandle;
    EngineDisplayForm m_parent;

    public MessageHandler( IntPtr formHandle, IntPtr displayPanelHandle, EngineDisplayForm parent )
    {
        m_formHandle = formHandle;
        m_displayPanelHandle = displayPanelHandle;
        m_parent = parent;
    }

    public bool PreFilterMessage(ref Message m)
    {
        if (m.HWnd == m_displayPanelHandle || m.HWnd == m_formHandle)
        {
            switch (m.Msg)
            {
                case WM_LBUTTONDOWN:
                case WM_LBUTTONUP:
                    {
                        NativeMethods.WndProc(m_displayPanelHandle, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32());
                        if (m.Msg == WM_LBUTTONUP)
                        {
                            m_parent.SelectActor();
                        }
                        return true;
                    }
            }
        }
        return false;
    }

    public void Application_Idle(object sender, EventArgs e)
    {
        try
        {
            // Render the scene
            NativeMethods.RenderFrame();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

为获胜形式和wpf interop看看这里http://msdn.microsoft.com/en-us/library/ms742474.aspx

链接地址: http://www.djcxy.com/p/95483.html

上一篇: WPF World Editor for my DirectX game engine

下一篇: Networking for Xna (C#) and C++?