由于后续的工作要在winform中,xna嵌入winform 是必须的。之前参考过很多博客,其实精髓部分就在官网给出的demo中,核心就是将游戏的gamecontrol类继承:GraphicsDeviceControl类,在winform中添加一个pannel容器,最终将游戏绘制到pannel中。下面详细介绍过程。
这是在xna下,游戏主类的继承关系,可以发现这个skinnggame其实是继承自game类,在skinnggame中可以直接重写game的update()和draw()方法。
我们在嵌入winform时,第一步要做的是把微软写好的两个辅助类添加到我们的项目中,这两个类分别是GraphicsDeviceControl和GraphicsDeviceService,两个类我们暂时不需要做修改,添加完毕之后,我们将skinnggame类继承GraphicsDeviceControl。
重新继承GraphicsDeviceControl之后你会发现项目会出现很多错误,剩下的工作就是要修改这些错误。在winform中,添加一个pannel控件。
private void InitializeComponent()
{
this.panel1 = new System.Windows.Forms.Panel();
this.SuspendLayout();
this.showGames = new BetterSkinned.SkinnedGame();
//
//showGames
//
this.showGames.Cursor = System.Windows.Forms.Cursors.AppStarting;
this.showGames.Dock = System.Windows.Forms.DockStyle.Fill;
this.showGames.Location = new System.Drawing.Point(0, 0);
this.showGames.Name = "showGames";
this.showGames.Size = new System.Drawing.Size(398, 529);
this.showGames.TabIndex = 0;
this.showGames.Text = "showGames";
//
// panel1
//
this.panel1.Location = new System.Drawing.Point(12, 12);
this.panel1.Controls.Add(this.showGames);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(610, 427);
this.panel1.TabIndex = 0;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(634, 451);
this.Controls.Add(this.panel1);
this.panel1.ResumeLayout(false);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
private SkinnedGame showGames;
}