开发日志 5-18
? Be honest rather clever.
????? ...........? * *? *...................... *? *? *....................................
?????
??????1)?解決問題:
? (1)碰撞:
?????? 設想:如果能夠分清,人物和碰撞物體之間的方向關系就可以解決。比如人物向左運動,碰到了一個物體,停下來,轉換動作,兩個范圍框交叉在了一起。然后如果人物繼續朝著障礙物的方向運動,當然會碰撞。如果是朝相反的方向,就不檢測碰撞。這樣就不會黏在一起了。
以前為了解決物體的左右翻轉這個問題,曾經設計了一個布爾型的變量 facing,現在或許可以讓他繼續起作用。這么做存在一個問題:在游戲系統中,左右(東西)是一個絕對值(absolute),而facing是根據游戲人物的原始圖是面向左還是面向右的,是一個相對值(relative)。這里需要引入一個新的值來表示人物前行的方向,上下(南北)被忽略了,只有向左向右(或者說向東向西)。如果所有的圖片的朝向都是一樣的,這當然是最好了;但如果不是,那么就需要自定義了。
更深入一些,不但需要了解碰撞的發生,而且需要了解碰撞的方向,這在踩蟲子的游戲中很常見,從上面“踩”中蟲子會把蟲子踩死,但如果你“碰”上了蟲子,那么只好安息了。這里的踩,實際上是玩家對蟲子的碰撞方向為自上而下,碰撞面為底邊,而對于蟲子,這次碰撞是自下而上的(相當于跳躍),碰撞面為上邊。
? 這里我需要提醒一句:實際上游戲的過程并不是連續的,并非一個像素一個像素的移動,所以有可能產生,上一個時刻兩個物體尚未發生碰撞,下一個時刻,兩個物體已經碰撞過來而且分開了,那么檢測仍然認為他們沒有碰撞,這就是一個Bug,而且這個Bug還不容易尋找,這在物體步進速度很大,而且物體較小的時候有可能發生;還有一種可能就是下一個時刻,一個物體正好嵌進另一個物體里面了,稍不注意,會造成很奇怪的結果。繼續討論下去,會發現,碰撞還有一個前檢測碰撞和后檢測碰撞,前者是檢測下一時刻會不會發生碰撞,后者是檢測這一時刻是不是發生了碰撞。后者有可能發生陷到墻里面的情況,原因就是前面提到的游戲過程不是連續的。在這個游戲中,采取的是后檢測的方法。???
?????? 修改碰撞函數bool[] CheckBump(),在碰撞發生后返回一個bool[],【0】:是否發生碰撞【1】:碰撞在左邊/右邊發生 【2】:碰撞在上邊/下邊發生,這樣在檢測碰撞的時候,同時檢測碰撞發生在那一邊上和游戲人物前進的方向,發生了碰撞,而且前進的方向和障礙物所處位置一致,則真正發生碰撞反應(比如速度為零)。???
?????? (2)測試:
原來以為,一個人物運動以后,另一個人物的速度總為零,是因為鍵盤KeyUp后恢復 idle引起的,經過試驗,注釋掉這條語句,發現仍然這樣,可見這個問題還有更深的原因。
?????? (3)思考:
現在采取的數據存儲方式,是在處理邏輯的模板類中,放了一個 靜態的 List<>,在這里存放著一個個同模板的游戲人物數據,這么做雖然麻煩,但避免了裝箱拆箱。但在實驗的過程中,發現裝拆箱的代價似乎沒有那么高。有沒有必要改進一下目前的做法呢?
轉載于:https://www.cnblogs.com/GameCode/articles/1738236.html
總結
- 上一篇: econtrol窗体设计器
- 下一篇: 如何查看正在使用某个端口的应该程序