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