我目前正在尝试使用C#中的monogame和winforms创建一个mapeditor。我在Windows 7计算机上使用Visual Studio 2015。我创建了一个winforms项目,然后添加了以下引用:MonoGame.Framework,OpenTk和OpenTK.GLControl。然后我从XNA Winforms Sample中包含了以下文件:GraphicsDeviceControl.cs,GraphicsDeviceService.cs和ServiceContainer.cs。完成后,我跟着this tutorial将XNA Sample移植到MonoGame。这一切都有效。
然后我创建了这个测试类,看它是否有效:
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TileMapEditor
{
class Test : GraphicsDeviceControl
{
ContentManager content;
SpriteBatch spriteBatch;
Texture2D t;
protected override void Initialize()
{
content = new ContentManager(Services, "Content");
spriteBatch = new SpriteBatch(GraphicsDevice);
t = content.Load<Texture2D>("Gameplay/Player");
}
protected override void Draw()
{
spriteBatch.Begin();
spriteBatch.Draw(t, new Rectangle(10, 10, t.Width, t.Height), Color.White);
spriteBatch.End();
}
}
}
然后我构建了项目,因此这个类将显示在表单设计器工具箱中。这也很有效,所以我继续将课程拖到设计师的表格上。这也显示正常。然后我再次构建了这个项目并希望我的纹理能够出现,但是,我只有一个像我在设计师中添加的类一样大的黑色窗口,看到这张图片:prnt.sc/b33my9(不能制作一个第3个链接,因为我没有足够的代表) 我还可以提一下,Visual Studio 2015表示从不使用GraphicsDeviceService.cs中的“GraphicsDeviceService.parameters”字段。我不知道这是否是我问题的一部分。 我还尝试使用以下行替换Draw函数中的代码:
GraphicsDevice.Clear(Color.Blue);
但我仍然有相同的黑色窗口。 我还尝试了位于此gitub repo:github.com/jaquadro/MonoGame-WinFormsControls的MGWinFormsControls项目中的移植xna示例,结果是'GraphicsDeviceService.parameters'警告消失但除了黑色窗口我仍然无法得到任何东西
有没有人知道我该怎么做才能解决这个问题?
提前致谢!
答案 0 :(得分:1)
Jaquadro版仅适用于OpenGL。它基于MonoGame的旧版本,其中GL + winforms是可能的。头部开发人员目前暂时禁用此功能,直到另行通知,但DX与之兼容。我发布了两个实现此目的的库。
这是基于Xna教程DIRECTLY PORTED to monogame。 https://github.com/ArchaicOokami/MonoGame.Framework.Control
这是基于对上述版本的修改。 https://github.com/ArchaicOokami/Microsoft.Xna.Framework.Control
在Microsoft Xna Framework Control中 - 基于xna表单控件示例 - 您必须拥有3个类。 - GraphicsControlDevice - GraphicsDeviceService - 服务容器
使用它时,您将创建一个新类,继承GraphicsDeviceControl(后者又进行UserControl)并修改绘图功能以执行您的任务。准备好之后将它扔到一个表单上,这需要每个窗口有一个全新的控件(即使它们只是略有不同),也可以在代码中的某处调用绘制。这可以通过将绘图代码添加到Application.Idle,或通过在主循环中手动调用绘图来完成。
我的git帖子中的当前编译版本是针对.net 4.0并使用MonoGame 3.4。
使用我修改过的库时,MonoGame Framework Control只需将GraphicsDeviceControl放到表单上即可。然后从可视化设计器添加Draw事件并在那里添加代码。 clearcolor在调用draw之前自动完成,可以通过代码或可视化设计器设置,因为它是可以从Properties窗口修改的属性。为了完成这一个绘制,你只需要从可视化设计器中将AutoDraw设置为true或将其设置为false并手动调用循环内的绘制。
我的git帖子中的当前编译版本是针对.net 4.5并使用MonoGame 3.5。
这两个也可以通过搜索ArchaicSoft或他们在git aka中列出的名称在Nuget上找到 - MonoGame.Framework.Control Microsoft.Xna.Framework.Control
就个人而言,为了便于使用+方便,我建议我为Windows风格的表单控件修改而不是用户控制体验,但这是您的选择。