in XNA

XNA – CameraManager In Game Programming From Novice to Professional

目前採用部分「Beginning XNA 2.0 Game Programming : From Novice to Professional」書本裡面的一些類別
今天在做一些測試時才發現的問題,也就是類別 CameraManager 。
發現問題的大略過程如下…

1. 加入幾個攝影機。
2. 將某個攝影機設為使用中(Active)。
3. 在加入其他攝影機。

問題的關鍵在於,管理員所用的集合(Collections)是使用 SortList
當加入新的攝影機時,如果很不幸地(很大的機率XD)排序在使用中的攝影機之前。
那麼就會從…

 攝影機索引值  攝影機名稱(Key)
 0  AAA
 1  BBB
 2  CCC


(設定 BBB 為使用中的攝影機)

這時候使用中的攝影機索引值為「1」

(加入一台叫做 AA 的攝影機)

 攝影機索引值  攝影機名稱(Key)
 0  AA
 1  AAA
 2  BBB
 3  CCC


注意,這個時候,使用中的攝影機索引值還是「1」
簡單來說就是沒有同步更新索引值。
當然,在他的使用方式下是看不太出來有啥問題…
但如果要用到索引值,而且後續會加入攝影機的狀況下,問題就會發生了。
解決的方式很多種,最小更動的方式就是在 Add 時更新索引值:

         public void Add(String id, ICamera camera)
        {
            String activeCam = null;
            if (this.activeCamera != null)
            {
                // 記錄原本活動中的攝影機名字
                activeCam = this.cameras.Keys[this.activeCameraIndex];
            }

            this.cameras.Add(id, camera);

            if (this.activeCamera == null)
            {
                this.activeCamera = camera;
                this.activeCameraIndex = this.cameras.IndexOfKey(id);
            }
            else
            {
                // 重新設定攝影機
                this.SetActiveCamera(activeCam);
            }
        }

Highlight版
藍字的部分是新加入的 code,笨笨的,但是簡單明瞭

其他像是阻止進行排序,或者乾脆別用 Sort 系列的集合等等…
嘛~
就是這樣~
即使沒用到索引,但有改有保佑,哈哈!
話說…
書本第12章的範例我一直都沒辦法編譯成功,真不曉得哪邊出了問題
別人都跑得好好的…

–End

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.