遊戲地圖編輯器之地圖儲存格式

來源:互聯網
上載者:User

遊戲地圖編輯器之地圖儲存格式

     《星空之翼》的地圖編輯器模組最重要的是確定地圖檔案的儲存格式,在探索地圖檔案儲存體格式中經曆了4種方案,分別為:自訂二進位檔案、XML檔案、類的序列化和資料庫。最後結合遊戲要求和自身技術水平選擇了嵌入式資料庫(SQLite)。
(1) 自訂二進位檔案:由於本身技術水平限制,不能很好的儲存變化較大的二進位檔案,最後放棄了這種地圖檔案組織方式。
(2) XML檔案:由於XML對玩家過於透明,玩家很容易修改地圖檔案,導致地圖檔案極其不穩定,因此放棄了自訂二進位檔案。
(3) 類的序列化:類的序列化可以很好的組織地圖檔案,但是考慮到以後的地圖檔案的儲存格式會發生改變,擴充性不強,每次修改都要修改類的定義。
(4) 資料庫:考慮到隨著遊戲開發的不斷推進,延續的變更會使遊戲的整體結構日漸紊亂,使程式難以理解和維護,遊戲地圖是遊戲主程式與地圖編輯器聯絡的紐帶,要延續地圖的穩定性,採用了資料庫可以一定程度上,保持遊戲地圖的穩定性。最開始選擇的資料庫是access,可是考慮到許多玩家的電腦不一定安裝了access的驅動,因此放棄access,很高興找到SQLite資料庫,SQLite太好了,只要一個System.Data.SQLite.dll就可以了使用該資料庫。
目前地圖檔案主要儲存的資訊有兩個,一個是靜態地圖背景,另一個是動態敵人。還包括一些配置資訊。地圖編輯器大體上分為兩地區,一個是遊戲地圖的控制項菜單區,另一個是遊戲地圖編輯區。在控制項菜單區可以選擇背景和精靈兩種類別,通過背景玩家可以載入自己喜歡的背景Tile,然後添加到地圖中。通過精靈可以添加自訂的敵人,可以設定敵人的運動方式、速度、攻擊力,生命值,攻擊模式。
採用SQLite資料庫的優勢是實現簡單,便於組織和方便擴充。

地圖檔案包括3個表Level,Sprite,LevelSprite。
(1) Level:描述了當前遊戲關卡的遊戲介面的尺寸、背景圖片、故事劇情資訊、地圖尺寸等資訊。
(2) Sprite:儲存了當前關卡裡所有的精靈的詳細資料。
(3) Levelsprite:儲存了當前關卡敵人、隕石和動態背景的具體的詳細資料,包括生命值、攻擊力、運動速度、運動模式、攻擊模式、出現地點等詳細資料。
在地圖編輯器產生地圖時,會將Level、Sprite和LevelSprite表的資訊加入到地圖檔案中,然後在遊戲主程式讀取地圖資訊。

採用SQLite來管理地圖資料,就對地圖的操作變為,對資料庫的操作。其中最重要的莫過與對圖片的儲存,這裡重點就講解SQLite對圖片的儲存。

讀取圖片

SQLiteConnection sqliteConn1 = new SQLiteConnection("Data Source=" + ofd.FileName + ";New=False;Compress=True;Version=3;"); //串連資料庫<br />sqliteConn1.Open(); //開啟串連<br />SQLiteCommand sqlcmd1 = new SQLiteCommand(sqliteConn1);<br />string cmd = "select * from level";<br />SQLiteDataAdapter sda = new SQLiteDataAdapter(cmd, sqliteConn1);<br />DataSet ds = new DataSet();<br />sda.Fill(ds);<br />byte[] data = null;<br />int map_width = 1;<br />int map_height = 1;<br />int title_width = 1;<br />int title_height = 1;<br />MemoryStream myStream = new MemoryStream();<br />foreach (DataRow dr in ds.Tables[0].Rows) //因為表中中只有一行資料讀取一次就行了<br />{<br />data = (byte[])dr["level_background"];<br />map_width = Int32.Parse(dr["map_width"].ToString());<br />map_height = Int32.Parse(dr["map_height"].ToString());<br />title_width = Int32.Parse(dr["title_width"].ToString());<br />title_height = Int32.Parse(dr["title_width"].ToString());<br />}<br />foreach (byte a in data)<br />{<br />myStream.WriteByte(a);<br />}<br />Bitmap bbg = new Bitmap(myStream); //bbg為成功讀出的圖片</p><p>

 

儲存圖片

MemoryStream ms = new MemoryStream();<br />tempbm.Save(ms, ImageFormat.Bmp);<br />byte[] bitmapData = ms.ToArray();<br />SQLiteConnection sqliteConn = new SQLiteConnection("Data Source=" + Mapconfig.MapSavePath + ";New=False;Compress=True;Version=3;");<br />sqliteConn.Open();<br />SQLiteCommand sqlcmd = new SQLiteCommand(sqliteConn);<br />sqlcmd.CommandText = "insert into level(level_id,level_name,level_background,level_story,map_width,map_height,title_width,title_height) values(1,1,@image,@story,@map_width,@map_height,@title_width,@title_height)";<br />SQLiteParameter param_m= new SQLiteParameter("@image", DbType.Binary, bitmapData.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bitmapData);<br />sqlcmd.Parameters.Add(param_m);<br />SQLiteParameter param_mS = new SQLiteParameter("@story", Mapconfig.MapStory.ToString());<br />sqlcmd.Parameters.Add(param_mS);<br />SQLiteParameter param_mmw = new SQLiteParameter("@map_width", Mapconfig.MapWidth);<br />sqlcmd.Parameters.Add(param_mmw);<br />SQLiteParameter param_mmh = new SQLiteParameter("@map_height", Mapconfig.MapHeight);<br />sqlcmd.Parameters.Add(param_mmh);<br />SQLiteParameter param_mtw = new SQLiteParameter("@title_width", Mapconfig.TileWidth);<br />sqlcmd.Parameters.Add(param_mtw);<br />SQLiteParameter param_mth = new SQLiteParameter("@title_height", Mapconfig.TitleHeight);<br />sqlcmd.Parameters.Add(param_mth);<br />sqlcmd.ExecuteNonQuery();<br />sqlcmd.Dispose();<br />sqliteConn.Dispose();<br />ms.Dispose();<br />//圖片插入成功<br />

地圖編輯器下載  作者其他源碼下載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.