從零開始重寫KOK1(萬王之王1) —— (2)優化地圖加載

本來想在第2篇說明物體遮擋與尋路的開發過程,但是因爲我把這問題想簡單了,現在已經完成了遮擋與尋路,但是中間的過程非常多,第一篇文章的系統結構需要做一些修改纔可以,這裏先說一下地圖加載的相關問題。

 

首先是效果圖:

KOK1 DEMO尋路

 

可直接運行版本下載:>>點擊進入下載頁<<

 

在第一篇文章《從零開始重寫KOK1(萬王之王1) —— (1)讓人物可在地圖上使用鼠標跑動》中,地圖是這樣的過程加載的:

1. 在Map對象初始化時將每個小圖個加載到一個整體的大地圖中,如圖:

老地圖管理器原理

2. 在玩家位置作出修改後,也修改屏幕矩形左上角的位置,因爲玩家是在中間,所以要維持屏幕的x,玩家的x - 1/2屏幕寬,縱向同理。

以下是Player類的Move()中的代碼,用來調整屏幕矩形的位置:

3. 要限制住玩家的位置,不能夠使得屏幕矩形超出世界地圖。在老的地圖管理器是這樣做的,限制玩家的目的座標,不可以小於屏幕寬的一半,不可以大於世界地圖寬度 - 屏幕寬的一半,縱向同理。這樣就不會出現屏幕畫地圖外的情況了。但這樣做就使得實際地圖的內容小於了現在世界地圖的大小,因爲要在世界地圖四周補上一圈黑色的貼圖,這樣玩家才知道到達了地圖的邊界。文字上可能不好理解,請看下圖:

老地圖管理器邊界

這個圖假定玩家走到了地圖的右下角,因爲屏幕矩形(藍色框)不能超過世界地圖,所以要在世界地圖裏面加這麼一圈灰色的作爲邊界的紋理,所以也就說,實際的地圖就比這個地圖Data存放的要小了,這顯然不是我們想要的。而且最重要的問題是,當地圖非常之大時,這個超大的地圖表面將佔用巨大的顯存或內存。

 

那麼我們想要的地圖管理器的目標就是:

——整個地圖Data就是實際的地圖,不包括邊界紋理,當因爲玩家的移動而導致屏幕矩形超出了地圖範圍時,自動補黑色。

 

要實現這種效果可以想到這種方法:地圖表面大小= 屏幕大小,每一幀重畫應當出現的地圖塊。但問題也隨之而來,我們要在每1幀都去畫一遍視窗內的地圖,效率不高。那不如我們每次畫一個區域的地圖,當屏幕在這個區域內就不重畫,而是裁剪適當的位置,當超出這個區域時,重新生成新區域,並且剪裁適當的地圖,如下圖:

新地圖管理器

總結一下:

1. 首先確定屏幕矩形在當前地圖表面內,在則不重畫,直接剪裁適當位置,如果不在,進入2。

2. 重新繪製地圖表面,根據屏幕矩形,計算地圖表面中的每個小塊:

    2.1 如果不在世界地圖中,不處理,因爲默認就是黑色。

    2.2 如果在,則計算是哪塊世界地圖,將適當的地圖塊話在這裏。

3. 重新繪製後,剪裁適當的位置,畫在離屏表面上。

 

下面貼出代碼:

Map.h

 

Map.cpp

 

下面給出整個項目源碼,因爲最近的研究是一系列的,所以這個版本的源碼已經有了遮擋、尋路等功能,但是後面的功能不影響Map的代碼。

下載地址:>>點擊進入下載頁<< 資源分是1,有興趣的朋友下吧:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章