XNA 游戏 运行时编辑器
最近在寫游戲時(shí)發(fā)現(xiàn)隨著代碼量和資源數(shù)量的加大,編譯速度越來越來慢...而且游戲編程中需要 多次調(diào)整的數(shù)據(jù)有比較多(比如各種移動(dòng)速度,攻擊硬直之類,不可能一次指定正確..),而每次改一個(gè) 數(shù)據(jù)就要重新編譯一次...實(shí)在受不了,所以寫了這樣一個(gè)編輯器,用于游戲前期測試,可以在游戲運(yùn)行時(shí)修改數(shù)據(jù),編輯器的界面會(huì)隨著你設(shè)定要修改的數(shù)據(jù)而自動(dòng)變化。
截圖:
?
下面是下載地址,項(xiàng)目中包括編輯器窗體程序,和一個(gè)測試用的簡單3D游戲模板。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
http://115.com/file/besevsh2#
XNAEditor_3D...eFormwork.rar
現(xiàn)在來解說下編輯器的使用方式: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
1. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
在游戲程序中添加 XNAEditorForm.dll 的引用。
2. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
在游戲代碼中,需要修改的數(shù)據(jù)所在的那個(gè)類加入如下代碼:
2.1
//編輯器對象XNAEditor xnaEditor;
2.2
//放置在Update中if (pControl.F1.IsClick == true)
{
if (xnaEditor == null || xnaEditor.IsDisposed == true)
{
//初始化編輯器對象
xnaEditor = new XNAEditor();
//彈出編輯器窗體
xnaEditor.Show();
//設(shè)置要修改的數(shù)據(jù)
xnaEditor.SetDate(speed, "speed", 16, 0, TestDateControl.Incremental.one);
xnaEditor.SetDate(iA, "iA", 6, -6, TestDateControl.Incremental.zero);
xnaEditor.SetDate(iF1, "iF1", 116, -67, TestDateControl.Incremental.three);
xnaEditor.SetDate(iF, "iF", 116, -67, TestDateControl.Incremental.two);
}
}
?
SetDate(...) 的參數(shù) :
/// <summary>/// 運(yùn)行時(shí)修改值
/// </summary>
/// <param name="ob">要修改的值</param>
/// <param name="strn">要修改的值的名字</param>
/// <param name="max">最大值</param>
/// <param name="min">最小值</param>
/// <param name="incremental">增量值 zero是1 one是0.1 ...three是0.001</param>
public void SetDate(object ob, string strn, float max, float min, TestDateControl.Incremental incremental)
?
2.3
數(shù)據(jù)讀取。
游戲編輯器返回的都是float型數(shù)據(jù),要int的話需要自己轉(zhuǎn)換下。
if (xnaEditor != null && xnaEditor.IsDisposed != true)
{
//讀取編輯器上修改后的數(shù)據(jù)
speed = xnaEditor.GetDateByName(speed, "speed");
iA = (int)xnaEditor.GetDateByName((float)iA, "iA");
iF1 = xnaEditor.GetDateByName(iF1, "iF1");
iF = xnaEditor.GetDateByName(iF, "iF");
//編輯器是否獲得焦點(diǎn)(解決鼠標(biāo)會(huì)在兩個(gè)窗體同時(shí)又效果的問題...)
IsEditorGetFocus = xnaEditor.IsGetFocus;
}
?
3. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
簡單3D游戲模板,編輯器修改的第一個(gè)數(shù)據(jù)(speed)就是 這個(gè)模板程序中在原點(diǎn)的那個(gè)模型的移動(dòng)速度,按Q/E 左/右移動(dòng),程序中的攝像機(jī)操作如下:
攝像機(jī) -- 操作方法:
1.使用鼠標(biāo)按下左鍵+滑動(dòng),改變攝像機(jī)朝向
2.使用鼠標(biāo)滾輪,拉近/退遠(yuǎn)鏡頭(按住右鍵可以加速),鼠標(biāo)中鍵 是視角回原
3.使用鍵盤 上下左右/WSAD,在xz平面上平移攝像機(jī)
?
這樣就能使用了 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
編輯器會(huì)隨著SetDate()設(shè)置的數(shù)據(jù)數(shù)量而自動(dòng)增加控件組(如圖,就是一個(gè)Label, 一個(gè)textBox,一個(gè)TrackBar)的數(shù)量,而TrackBar的長度會(huì)隨著設(shè)置的增量值(incremental)而改變長度.
這樣就可以在運(yùn)行時(shí)修改數(shù)據(jù)了,一定程度上減少了編譯的次數(shù),但是明顯不夠...調(diào)整游戲邏輯的時(shí)也要消耗大量的編譯時(shí)間,這個(gè)編輯器的下一個(gè)版本要加的功能就是在運(yùn)行時(shí)修改游戲邏輯。不過這個(gè)好難...我一點(diǎn)頭緒沒有..求各位高人指點(diǎn)..
轉(zhuǎn)載于:https://www.cnblogs.com/dshGame/archive/2012/03/07/2383285.html
總結(jié)
以上是生活随笔為你收集整理的XNA 游戏 运行时编辑器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redmi将在印度推出首款智能电视 便宜
- 下一篇: PHP 代码规范