Unity高級項目實戰(zhàn)課件06全方位滾動射擊游戲講述_第1頁
Unity高級項目實戰(zhàn)課件06全方位滾動射擊游戲講述_第2頁
Unity高級項目實戰(zhàn)課件06全方位滾動射擊游戲講述_第3頁
Unity高級項目實戰(zhàn)課件06全方位滾動射擊游戲講述_第4頁
Unity高級項目實戰(zhàn)課件06全方位滾動射擊游戲講述_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

全方位滾動射擊玩耍鎖定,激光制導,消滅敵機,11玩法介紹21玩法介紹鎖定,激光制導,消滅敵機!鼠標把握!鼠標把握玩家方向一舉殲敵將獲得高分!能夠一次性集中鎖定多架敵機同時消滅多架敵機將得高分左鍵放射索敵激光!持續(xù)按下左鍵將放射鎖敵激光。鎖定!索敵激光和敵機相遇則將其鎖定。使用激光制導攻擊!松開左鍵,將使用激光制導進展攻擊。32功能強大的激光制導42功能強大的激光制導 射擊玩耍是種類繁多的玩耍中擁有極高人氣的一種玩耍類型。其歷史作常悠久,繽紛且已經被開發(fā)出了很多種類的玩耍系統。即使只依據!畫面滾動的方向,也可分為縱軸滾動、橫軸滾動以及朝著畫面內部前進的3D滾動。

在3D技術成為主流之后,即使是一平面玩耍,背景和玩家角色使用多邊形繪制的狀況也越來越多。隨著渲染技術的不斷打磨,現在很多玩耍的的面品質絲毫不輸給電影。

這次我們開發(fā)的“噬星者”,雖然是經典的科幻題材,不過玩耍內容卻是全方位滾動這種略顯瘋狂的類型。由于美術設計師的天才創(chuàng)意,玩耍中還參與了能夠鎖定敵機并進展攻擊的激光制導功能。對玩耍內容和程序制作而言,這都是特殊重要的一局部。

玩耍的關鍵詞是強大的激光制導:

被制導的激光在攻擊時看起來就像突襲獵物的蛇,“噬星者”這個名字正是因此而來的。

另外,在玩耍制作的過程中,碰撞處理是一個難點二玩耍中能夠‘·鎖定多架敵機一次性消滅”的特性會導致玩家飛機不射擊僅移動的時間變得較長。這樣玩家飛機和從畫面外飛來的敵機發(fā)生碰撞的狀況將很頻繁。我們通過優(yōu)化敵機的移動算法解決了這個問題。請讀者在試玩玩耍時留意一下這方面的處理。52.1腳本一覽62.2本章小節(jié)索敵激光的碰撞檢測不會重復的鎖定激光制導消息窗口73索敵激光的碰撞檢測3.1關聯文件ScoutingLaser.csScoutingLaserMesh.cs93.2概要 “噬星者”中的玩家飛機除

了一般射擊外,還配備了可以自

動跟蹤敵機的激光制導二為了發(fā)

射制導激光,必需先用索敵激光

探測敵機并將其鎖定?!八鲾场?/p>

一詞就是查找敵人的意思。 通過鼠標操作使玩家飛機旋轉,索敵激光就會繪制出扇形殘影,進入該范圍的敵機將被一次性鎖定。這可以說是“噬星者”的最大特色。下面我們將爭論如何探測到進人索敵激光捕獲范圍的敵機,以及如何推斷鎖定成功。103.3索敵激光的碰撞檢測 索敵激光朝著敵機方向射出,與敵機交會后即可鎖定目標。利用碰撞檢測我們可以很簡潔地感知到對象之間是否發(fā)生了重

合。為了使玩家飛機發(fā)起攻擊時生成的矩形區(qū)域和敵機進展碰撞檢測,需要設定敵機的碰撞外形。 如以下圖,對索

敵激光也要設置符合

其探測區(qū)域的碰撞形

狀。這樣就可以通過

碰撞大事探測到索敵

激光和敵機發(fā)生了重

疊。不過這里需要注

意的是,應當把碰撞

外形設置為觸發(fā)器

(trigger)。 觸發(fā)器也是碰撞器的一種,只不過在這種狀況下,發(fā)生碰撞的兩個物體不會被彼此彈開,而是將保持原有狀態(tài)連續(xù)運動。

圖描述了玩耍對象發(fā)生碰

撞時,承受一般碰撞器和觸發(fā)

器的區(qū)分。

如圖中(1)所示,當使用普

通碰撞器時,玩耍對象會在發(fā)

生碰撞的瞬間停下,彼此不會

發(fā)生重疊。這是由于對象間發(fā)

生了所謂的擠壓。碰撞后物體

將被彈開,或者在發(fā)生碰撞的

位置停下來,至于具體是哪種狀況,還要取決于對象間的彈性和摩擦等物理特性。

但是,假設碰撞對象的一方使用了觸發(fā)器,狀況將如圖中(2)所示。碰撞對象將穿透彼此,各自保持接觸前的速度連續(xù)前進。_碰撞大事不會影響對象的運動。3.3索敵激光的碰撞檢測 索敵激光假設承受一般碰

撞器的話會把敵人彈開,所以

必需設置為觸發(fā)器。

關于索敵激光的碰撞還有

一個要考慮的問題。這就是快

速轉彎時的穿透問題。

Unity中為了削減碰撞處

理的計算量,即使對象正在

移動,也承受Update被調用

瞬間的對象的位置坐標來進展

碰撞檢測,并不考慮對象以何種方向和何種速度運動。

“噬星者”中玩家飛機總是跟隨鼠標光標運動,當玩家用鼠標做出類似畫圓等操作時飛機將高速旋轉。同時,索敵激光總是筆直地伸向玩家飛機的前方,這就導致了在執(zhí)行碰撞檢測時有可能消逝如圖(1)所示的穿透敵機的狀況。3.3索敵激光的碰撞檢測 一種解決方法是,將碰撞檢測的計算方式改為Continuous(連續(xù)的)。前面提到的Discrete(離散的)計算方法中,只使用每一幀內的瞬間位置。而Continuous的計算方法中,會將相鄰幾幀的位置坐標連起來作為碰撞檢測的外形。這樣即使物體在高速運動時也不會發(fā)生穿透的現象。 雖然看起來Continuous是一種好方法,不過它具有運算量大且無法使用網格碰撞器等缺點?;蛟S將來的Unity版本會解決這些問題,但這里我們將使用如圖(2)所示的生成扇形碰撞網格的方法來處理。雖然這種方法比Continuous略微麻煩一些,不過它的應用范圍很廣,所以我們不妨借此時機學習一下。3.3索敵激光的碰撞檢測3.4碰撞網格的生成方法 我們在第10章“迷蹤賽道”的“多邊形網格的創(chuàng)立”一節(jié)中將具體說明如何在Unity中創(chuàng)立網格?!懊咱欃惖馈蓖嫠V袆?chuàng)立了用于顯示和用于碰撞檢測的網格,而在“噬星者”的索敵激光中,我們只需要創(chuàng)立用于碰撞檢測的網格。由于外形比較單一,所以步驟比“迷蹤賽道”更為簡潔。這里我們只對生成網格的必要步驟進展講解。

創(chuàng)立碰撞網格或許需要以下兩步。獵取頂點的位置坐標連接三角形的頂點繪制出多邊形(頂J點數組) 由于索敵激光朝著玩家飛機的前方直線延長,所以發(fā)生旋轉時將描繪出扇形的軌跡。而Unity中的網格不管用于顯示還是用于碰撞檢測都必需由只角形構成。因此,對于扇形的軌跡,可以像切蛋杜一樣,從中心向四周以均等的角度進展切分,利用三角形來近似地表現出扇形。 圖中,頂點0是扇形的中心了頂點1至

頂點5在圓弧上按相等的間隔排列。

不難看出,頂點0到頂點1的直線表示

旋轉開頭時的索敵激光、頂點0到頂點5的

直線表示旋轉完畢時的索敵激光。這兩條

直線中間的扇形區(qū)域就是我們將要生成的

碰撞外形。

計算出圖中的各頂點的排列后,需要

生成用于準備各只角形中的頂點的排列挨次的數據。仍以上圖為例,可知

0號三角形:頂點0-頂點1-頂點2

1號三角形:頂點0-頂點2-頂點3

……

n號三角形:頂點0-頂點n+頂點n+2

計算規(guī)章特殊簡潔。

那么我們來看看生成碰撞網格的相關代碼:3.4碰撞網格的生成方法3.4碰撞網格的生成方法 圖中顯示了代碼中的一些變量。請參考以下說明進展理解。 makeFanShape函數中的參數(a)首先對圓弧的開頭角度

startAngle和終止角度

endAngle橫跨0度的狀況進

行處理。請考慮一以以下圖(1)

的狀況。以時鐘為例。圓弧

從1點鐘的方向開頭,跨越

12點旋轉到11點的位置。

為了生成扇形外形,需要從

startAngle到endAngle的

角度進展分割。由于旋轉以

順時針方向為正,所以該角度將穿過6點鐘的方向。但事實上索敵激光的軌跡是從12點的方向穿過的,這樣就變得截然相反了。為了避開這種狀況,當startAngle和endAngle橫跨12點鐘的方向代表的0度時,我們給startAngle增加了360度圖(2)是將各角度排列在直線上的結果。沿順時針方向,角度越大越靠右。圖(3)表示將startAngle加上360度以后的狀況。可以看到startAngle和endAngle的起始關系發(fā)生了轉變,表示角度的方向的箭頭跨越了360度(=0度)這一界限。由于圓的一周是360度,所以即使加上360度也不會轉變在圓上的位置。3.4碰撞網格的生成方法3.4碰撞網格的生成方法(b)這里使endAngle的值總是大于startAngle。由于Unity中規(guī)定“頂點挨次為順時針方向的外表為正面”。關于這一點我們后續(xù)會再做具體說明。計算出分割扇形所需要的二角形數量。只要將從endAngle到startAngle的角度除以一個三角形所占的中心角度pieceAngle,再將所得值加1后取整即可。(c)需要留意數組的容量應確保頂點

都能被存儲。請再次參考圖??梢?/p>

看到當三角形的個數為triangleNum

時,圓弧上將消逝trigangleNum+1

個頂點。最終追加的一個頂點表示圓

中心的頂點。(d)預備好數組以后,將實際的頂點存人該數組。首先將中心頂點作為數組的第一個元素存人??梢詫⑵渲翟O置為代表原點的Vector.zero。(e)接下來計算圓弧上的頂點坐標。圓弧L的頂點坐標可以通過將距離原點:adios的Z軸上的點“Vector3.}orward*radius“繞Y軸旋轉currentAngle度計算得出。(f)頂點的位置坐標全部計算完畢后,將各二角形的頂點按挨次放人數組circleTriangles中。前面我們已經總結r一個簡一單的規(guī)章,即

n號三角形:頂點0-頂點n+1-頂點n+2

步驟(b)中使endAnglew定大于startAngle就足為了便利這里的頂點排序假設endAngle比startAngle小,為了讓頂點仍按順時針方向排列.就必需變成

n號三角形:頂點0-頂點n+2-頂點n+1(g)當頂點的位置坐標和索引數組都預備好后,將它們設置到網格碰攤器。(h)最終將網格碰撞器的enable成員按false,true的挨次代入。否則網格的變化將無法反映出來。清同學記住這個流程。3.4碰撞網格的生成方法3.5確認碰撞網格 現在讓我們來確認一下制作好的索敵激光的碰撞網格是否符合我們的期望。

碰撞網格通常不會被繪

制在玩耍畫面上二雖然也可

以添加MeshRenderer組件

用于調試,不過通過同時顯

示場景視圖和玩耍視圖,即

可便利地杏看碰撞網格。

在Unity編輯器中把窗口

的布局設為Tall,并將Game

標簽頁拖曳到場景(Scene)視

圖上,能看到圖所示的分割

顯示畫面。在層級視圖中選

擇ScoutinglaseMesh對象

后點擊檢視面板中

MeshCollider旁的三角形。這樣一來,當玩家飛機旋轉時,索敵激光的碰撞外形就通過線框圖顯示出來了。3.6小結本節(jié)內容涉及了很多數學計算,還必需為這些計算準務很多數據,可能理解起來比較困難。不過網格的生成在特效等很多場合中都能應用,是一項作特殊有效的技術,看到線框圖顯示的碰撞外形伸縮的樣子后,估量有些讀者已經躍躍欲試想開發(fā)個精彩的特效了吧。4不會重復的鎖定4.1關聯文件ScoutingLaser.cs在“噬星者”玩耍中,當鎖定敵機時,在播放音效的同時會顯示“鎖定標記”,右上角的“鎖定槽”將消逝一個:另外玩家可以留意到,即使用索敵激光再次定位已經被鎖定的敵機,也不會重復鎖定二這是由于,“噬星者”中不允許對同一敵機鎖定屢次;只有BOSS飛機允許被鎖定兩次以上,不過這其實是分別對組成BOSS飛機的多個局部進展鎖定。一個對象只能被鎖定一次,這個原則是不變的。4.2概要4.3鎖定的治理 為了防止對同一架敵機鎖定兩次以上,首先需要對大量敵機做出明確區(qū)分:“噬星者”中,同一種類的敵時機同時大量消逝:這樣一來,只通過“預設類型”是無法對其進展區(qū)分的。

Unity中允許對對象設置實例ID(instanceID)。每個對象的實例ID各不一樣,不同的對象不能同時使用同一個實例ID。

這種不會重復的特性稱為Uniq?!癠niq”一詞在英文中的本意是“唯一的”?!拔ㄒ坏闹怠本褪恰安粫貜偷闹怠?,實例ID就是這種“唯一的值”?!笆尚钦摺敝芯褪鞘褂眠@樣的實例ID來治理已經鎖定的敵機的。

當前已經鎖定的敵機的實例ID都被記錄在鎖定列表中鎖定列表的槽數等于一次能夠鎖定的敵機的最大數量。

下面我們以鎖定兩架敵機的狀況為例來說明鎖定列表的工作流程。請讀者參照以以下圖進展理解。 現在玩家飛機前方有兩架敵機,實例ID(以下簡稱為ID)分別力10和11。

(1)玩家飛機一邊放射索敵激光,一邊略微向左旋轉,這時ID=10的敵機進入激光的軌跡內,因此從鎖定列表中查詢ID=10的敵機,在鎖定列表中沒有ID=10的記錄,意味著該敵機未被鎖定過,于是就鎖定該機,并將ID=10記錄到鎖定列表中。

(2)玩家飛機在ID=10的敵機被鎖定的了位置連續(xù)左轉,鎖定ID=11的敵機后也把ID=11記錄到鎖定列表中。

(3)鎖定ID=11的敵機后,玩家屹機在該處停下,開頭向右轉,索敵激光在碰撞檢測的過程中將再次命中ID=11的敵機。但是由于鎖定列表中已經存在了ID=11的記錄,所以不會再次對其執(zhí)行鎖定處理。這是避開對同一對象進展屢次鎖定的機制中最關鍵的地方。

(4)玩家飛機向鎖定的敵機放射制導激光。制導激光擊中ID=10的敵機后,從鎖定列表中刪除ID=10的記錄。假設遺忘刪除,就可能會造成鎖定列表的存儲空間缺乏而無法鎖定敵機。因此在擊毀敵機后確定要將相應記錄從鎖定列表中刪除。 了解了鎖定列表的工作流程后,讓我們看看實際的代碼。4.3鎖定的治理 ScoutingLaser.Lockon方法在ScoutingLaserMeshController的OnTriggerEnter中被調用。collider參數也是通過OnTriggerEnter直接傳人。 (a)首先推斷和索敵激光的碰撞區(qū)域(觸發(fā)器)發(fā)生碰撞的對象是否為敵機。假設是敵機,則取得該對象的實例ID。 (b)接下來加上已鎖定的敵機數量。假設鎖定列表中已經含有指定的實例ID,也就是說敵機對象已經被鎖定過,IncreaseLockonCount方法將返回false。當鎖定數量到達了允許的最大值時,也進展同樣的處理。假設函數返回true,則意味著該敵機對象未被鎖定過,處理將連續(xù)進了。 (c)在鎖定列表中,取得記錄新鎖定的敵機的位置,(鎖定編號)。假設鎖定列表中已沒有空位,getLockonNumber方法將返回-1。為已經通過IncreaseLockonCount函數檢查過允許鎖定的址大數量,所以此時鎖定列表中確定存在空位,不過為了增加代碼的強健性,我們照舊將該錯誤檢查添加到代碼中。4.3鎖定的治理4.4小結現在讀者應當能夠理解實例ID的用處了吧?!笆尚钦摺敝袨榱酥卫礞i定的敵機,使用了“記錄處理過的對象”這一實例ID的典型用法。在“需要對大量同類型的對象進展區(qū)分”的狀況下,往往都可以使用實例D來解決問題。5制導激光5.1關聯文件LockonLaserMotion.cs5.2概要“噬星者”中,敵機一且被鎖定就無法逃脫,確定會被制導激光擊中這是一種特殊優(yōu)秀的攻擊武器。假設從武器的性能來考慮,最好使激光朝著敵機直線匕去,不過考慮到玩耍的畫面表現效果,我們使其沿著曲線向敵機飛去。下面我們對這種兼顧性能和視覺效果的制導激光的制作方法進展說明。5.3依據TrailRenderer生成網格 首先我們來對顯示制導激光需要用到的TrailRenderer組件進展講解。

制導激光像彗星一樣拖著長長的尾巴顯示在畫面上。雖然看起來似乎有瘦長的網格,但事實上激光前端的對象并沒有使用用于顯示的MeshRenderer。使用了TrailRenderer的對象在移動時,會像圖6.12那樣沿著運動軌跡自動生成瘦長的網格。固然它也支持貼圖。 圖(1)是使用了TrailRenderer的

制導激光在玩耍中的畫面表現,

(2)是將其用線框圖顯示的結果???/p>

以看到,沿著制導激光的軌跡生成

了很多瘦長的網格。5.3依據TrailRenderer生成網格5.4制導激光的移動 依據上文可知,假設使用了TrailRenderer,軌跡的繪制就會變得比較簡潔。在位于頭部的對象動起來后,TrailRendere:就會沿著其移動的路徑繪制出長長的激光軌跡。

那么現在我們來考慮在每幀的Update方法中該如何更新對象的移動方向。由于制導激光朝著敵機飛去,因此首先需要把握好玩家和敵機的位置關系。

在圖中,位于箭頭頂端的I`1色圓圈表示玩耍對象??梢园鸭^看作是TrailRenderer描繪的軌

跡從放射的那一瞬間開頭,制導

激光始終朝著上方沿著直線前進。

由于TrailRenderer的作用,激光

將不斷地往下延長。敵機位于激光前進方向左側90度的位置。假設此時將激光的前進方向左轉90度,它將朝著敵機飛去。 玩耍中的制導激光是沿著曲線軌跡向敵機飛去的:但是假設每一幀更新時都將其角度轉變?yōu)槌驍硻C的話.就

會消逝圖(1)那樣的直線運動的情

況:為了解決這個問題,我們需要

對征次轉變方向時轉動的角度添

加一個最大值限制。具體來說,

就是先計算出當前前進方向到敵

機方向需要旋轉的角度,再將其

乘以確定的比例,把最終得到的

值作為旋轉角度。

請參考圖(2)進展理解。假設

每次轉變方向只允許旋轉30%的

角度。

這種狀況下,當敵機位于前進方向左側90度時,可以算出旋轉角度是90度的30%等于27度。之所以不把角度的限制設定為諸如30度這樣固定的數值,是為了使激光的運動軌跡顯得更平滑,在激光和敵機的角度差比較大時能夠急轉彎,反之當角度相差不多時又能夠緩慢地轉變方向,這樣就能繪制出較為平滑的曲線。5.4制導激光的移動5.4制導激光的移動 雖然加人了旋轉角度的限制后激光的運動軌跡變得平滑了,但是也帶來了新的問題—激光變得難以擊中敵機了。由于添加了旋轉角度的限制,這意味著激光不能直接朝敵機方向飛去,而只能朝著敵機方向每次轉變

確定的角度。有時

就會消逝在敵機周

圍持續(xù)繞圈的狀況

。

為了避開這種

狀況,我們讓前面

提到的轉彎角度的

一百分比值隨時間

漸漸變大。也就是說,放射后經過的時間越長,轉彎角度就越大。 從圖中可以看到轉彎的角度越來越大。在放射后不久的①處,轉彎角度的比例

很小.只朝著敵機方

向轉變了一點點方

向。②處的轉彎角

度的比例略微增加

了一些,前進方向

的轉變也更大了。

到③的位置后,繼

續(xù)增加轉彎角度的

比例,直接轉向敵

機方向。原來狀況下激光有可能在敵機四周持續(xù)繞圈,現在將沿著一條類似漩渦狀的軌跡擊中敵機。 下面我們通過實際的代碼,來再次梳理整個流程。5.4制導激光的移動(a)首先求出從自己所在位置看到的敵機的方向。通過Quaternion.LookRotation方法使用向量計算出旋轉角度。

(b)接下來,通過turnRate比率計算消逝在的前進方向currentRotationAngle和敵機方向targetRotationAngle的補間值。這相當于前面提到的從當前方向向敵機方向旋轉確定比例的角度。這是程序中最重要的地方。為了不受幀率(玩耍循環(huán)的時間間隔)變化的影響,不要遺忘乘上Time.deltatime。

(c)最終,更新轉彎角度的比例,再通過旋轉轉變前進方向后連續(xù)向前,處理就完畢了。 最終,讓我們通過實際的玩耍來看看程序是如何運作的。

請在工程視圖中選擇Prefabs/Lockon/LockonLaser二可以在檢視面板中看到LockonLaserMotion腳本標簽。我們通過轉變其中的TurnRate和TurnRateAcceleration的值來看激光的運動將如何變化。

TurnRate的值準備了每幀刷新時激光前進方向的轉變程度二假設這個值很大。運動中的激光的轉彎幅度就大;反之假設這個值比較小,激光會接近直線運行二當把這個值設置為60左右時,激光差不多將沿著直線向敵機飛去.

TurnRateAcceleration表示每幀刷新時TurnRate的增加值。其值為0時意味著轉彎的角度是固定的,這樣很可能就會造成激光始終在敵機外圍不停做圓周運動的狀況。5.6小結 現在讀者應當可以理解激光沿著平滑曲線前進的隱秘了。這種算法也常常在制導或者敵人AI規(guī)律中使用。假設敵機總是筆直地沖向玩家角色.玩家可能會對這種強大的敵機感到束手無策,這時不妨像這樣對敵機添加轉彎角度的限制。建議讀者在把握了某種方法以后.在開發(fā)過程中多加思考,看看能否使用這種方法來解決其他問題。6消息窗口6.1關聯文件PrintMessage.cs6.2概要 “噬星者”中會依據玩耍的狀況在畫面左下角顯示各種消息。內容一般是電腦返回的報告信息,或者從“司令部”發(fā)來的指令,這些都是豐富玩耍的

重要元素。 消息中的文字會

按挨次逐個顯示出來,

就似乎有人在打字機

上操作那樣。雖然這

只是個很小的功能,

但卻能給玩耍增色不

少,下面我們就來介紹它的制作方法。6.3消息隊列和顯示緩沖區(qū) 玩耍中的各種消息都在消息窗口中顯示。每行消息并非一次性地顯示出來,而是從頭開頭按挨次逐字顯示。為了實現這種顯示方法,消息窗口的內部構

造如以下圖。 首先是用于顯示的

消息窗口。它擁有橘色

的邊框,并且使用特定

的字體一顯示文字。 其次足令消息逐字

顯示的顯示緩沖區(qū)。一

行消息被放入緩沖區(qū)后,將從行首開頭逐字顯示到消息宙日中。 最終是消息隊列,它用于存儲全部其他玩耍對象發(fā)來的顯示懇求。 接下來我們來看看消息顯示的處理流程。 (1)首先,玩耍開頭后在窗日

內顯示開頭消息。顯示緩沖區(qū)域

和消息隊列的狀態(tài)均為空。(2)然后收到了從其他玩耍對象發(fā)

來的兩條顯示消息的懇求。每個

懇求各一行文本。這些消息都將

被追加到消息隊列中。(3)從隊列失部開頭逐個取出消

息,將其移動到緩沖區(qū)中。由于

緩沖區(qū)只能存儲一行文本,所以只會移動隊列中的第一條消息“CAUTION.“。為了便利后續(xù)處理,我們在移動消息的同時,還把它依據字母單位拆分成數組。6.3消息隊列和顯示緩沖區(qū)(4)將緩沖區(qū)頭部的字母C顯示到窗日

中。顯示完畢后將文字從隊列中刪除。(5)接下來,顯示緩沖區(qū)中的其次個字

母A。這時假設有新的消息顯示懇求

到達,就將其追加到消息隊列的末尾。(6)當緩沖區(qū)中的文字全部顯示出來后

,再次將隊列頭部的消息移動到緩沖

區(qū)中。和之前一樣,從頭開頭按挨次

逐個顯示緩沖區(qū)的文字。固然假設隊

列為空l不會移動任何消息。此時將回

到狀態(tài)(1),連續(xù)等待消息的到來并

將其追加到隊列中。6.3消息隊列和顯示緩沖區(qū) 消息隊列和顯示緩沖區(qū)的關系,就類似醫(yī)院的“候診室”和“治療室”。治療室中只能有一位病人承受醫(yī)生的診斷治療。假設沒有候診室治療室,在治療的過程中將有越來越多的患者間續(xù)擠人,或許后來的某些患者只能選擇回家。而假設設立了候診室,即使后續(xù)來了很多患者,治療室中照舊能夠有條不紊地進展治療。 由于顯示緩沖區(qū)中只能逐字顯示消息,因此處理完全部的消息將會花費一些時間。這期間可能會有其他玩耍對象發(fā)來顯示消息的懇求。在這種狀況下,假設由于緩沖區(qū)正在處理顯示而不能追加消息,就可能會降低消息窗口的易用性。 下面我們來看看進展消息窗口的處理的相關代碼。6.3消息隊列和顯示緩沖區(qū) 首先是從消息隊列往顯示緩沖區(qū)轉送消息的Update方法。

(a)首先確認顯示緩沖區(qū)是否正在進展消息的處理:假設顯示緩沖區(qū)正在處理消息,那么將不能移動新消息。只有當緩沖區(qū)把上一次的消息全部顯示完畢后,才能開頭移動下一條消息并進展顯示。

(b)將用于表示緩沖區(qū)正在處理的標記成員isPrinting設置為true:當顯示緩沖區(qū)的處理完畢后,PlayMessage方法將把isPrinting的值設為fals

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論