freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

國(guó)內(nèi)賽車發(fā)展現(xiàn)狀和趨勢(shì)畢業(yè)論文-資料下載頁(yè)

2025-06-28 00:41本頁(yè)面
  

【正文】 圖,直到貼圖到達(dá)黃色為止,則表示污染到達(dá)最嚴(yán)重地步。同時(shí)這種變色效果也為游戲增加的趣味和真實(shí)感。圖311 五套漸變紋理 3D音效根據(jù)相機(jī)位置從一個(gè)3D位置播放聲音即為3D聲音。要讓3D游戲更真實(shí),讓每個(gè)聲音都位于3D空間的某個(gè)位置。通過(guò)這種方式,在相機(jī)右側(cè)發(fā)生的碰撞會(huì)主要通過(guò)右聲道播放,這樣用戶就會(huì)感到碰撞是真的發(fā)生在他的右側(cè)。即使碰撞不在相機(jī)的視野中,玩家也可以知道在他的右側(cè)發(fā)生了什么事。XNA可以讓這些事變得簡(jiǎn)單。對(duì)每個(gè)聲音,開(kāi)發(fā)者必須設(shè)置相機(jī)的3D位置和使用聲音Cue對(duì)象的Apply3D方法設(shè)置聲源的位置。注意當(dāng)相機(jī)或聲源移動(dòng)時(shí),需要調(diào)用這個(gè)方法更新Cue。如果要設(shè)置聲源的3D位置,首先必須為這個(gè)音源設(shè)置一個(gè)AudioEmitter對(duì)象和為相機(jī)設(shè)置一個(gè)AudioListener對(duì)象。當(dāng)將這兩者傳遞到Cue的Apply3D方法中時(shí),XNA會(huì)計(jì)算音響(或耳機(jī))左右聲道聲音的分配。下面的方法創(chuàng)建了兩個(gè)對(duì)象:private void UpdateSoundPosition(Cue cue, Vector3 sourcePos, Vector3 camPos, Vector3 camForward, Vector3 camUp){ AudioEmitter emitter = new AudioEmitter()。 = sourcePos。 AudioListener listener = new AudioListener()。 = camPos。 = camForward。 = camUp。 (listener, emitter)。 }對(duì)emitter(音源)來(lái)說(shuō),只需設(shè)置位置。對(duì)listener(相機(jī))來(lái)說(shuō),還要設(shè)置Forward和Up向量,因?yàn)楫?dāng)相機(jī)旋轉(zhuǎn)了180度后,左右聲道會(huì)互換。當(dāng)創(chuàng)建了這兩個(gè)變量后,可以將它們傳遞到Cue的Apply3D方法中,當(dāng)音源或相機(jī)發(fā)生移動(dòng)時(shí)都要進(jìn)行這個(gè)操作。需要在第一次調(diào)用Play方法前調(diào)用Apply3D方法。所以,確保在Cue中還沒(méi)有調(diào)用 Play方法:protected override void Initialize() { fpsCam = new QuakeCamera(, new Vector3(0,0,5) , 0, 0)。 audioEngine = new AudioEngine(Content/Audio/)。 waveBank = new WaveBank(audioEngine, Content/Audio/)。 soundBank = new SoundBank(audioEngine, Content/Audio/)。 cue1 = (audio1)。 ()。 }在Update方法中,如果移動(dòng)了相機(jī)位置或音源位置,就需要調(diào)UpdateSoundPosition方法:protected override void Update(GameTime gameTime){ GamePadState gamePadState = ()。 if ( == ) ()。 MouseState mouseState = ()。 KeyboardState keyState = ()。 (mouseState, keyState, gamePadState)。 float time = (float)。 Vector3 startingPos = new Vector3(0, 0, 10)。 Matrix rotMatrix = (time)。 modelPos = (startingPos, rotMatrix)。 UpdateSoundPosition(cue1, modelPos, , , )。 if () ()。 ()。 (gameTime)。 }這個(gè)方法的前半部分檢查用戶輸入并將輸入傳遞到相機(jī)。當(dāng)中的代碼塊更新音源位置。當(dāng)相機(jī)和音源更新后,需要調(diào)用UpdateSoundPosition方法告知cue1對(duì)象最后的位置。如果cue1還沒(méi)有播放,則開(kāi)始播放。 因?yàn)?D effect是通過(guò)控制左右聲道的音量實(shí)現(xiàn)的,所以聲音中的任何立體聲信息會(huì)丟失:首先將聲音轉(zhuǎn)換為單聲道,然后對(duì)應(yīng)物體的3D位置設(shè)置左右聲道的音量。、雪、霧l 雨:使用粒子系統(tǒng)完成雨的生成。其中粒子在下雨模擬中使用一條透明直線表示,在運(yùn)行過(guò)程中對(duì)各粒子的速度和運(yùn)動(dòng)方向進(jìn)行控制,合理調(diào)整參數(shù)即可達(dá)到效果。l 雪:使用粒子系統(tǒng)完成雪的生成。其中粒子在下雪模擬中使用一個(gè)白色的點(diǎn)來(lái)表示。在運(yùn)行過(guò)程中對(duì)各粒子的速度和運(yùn)動(dòng)方向進(jìn)行控制,合理調(diào)整參數(shù)即可達(dá)到效果。l 霧:利用離子系統(tǒng)可以設(shè)置霧的一些參數(shù),如FogColor、FogStart、FogEnd。這些參數(shù)可以為場(chǎng)景定義自己的霧,在霧化范圍內(nèi)的物體被看起來(lái)像是透過(guò)一層濃煙存在一樣??梢酝ㄟ^(guò)設(shè)置顏色、霧開(kāi)始、霧結(jié)束的距離范圍來(lái)設(shè)置霧效。重力作用是3D游戲中非常重要的一項(xiàng)內(nèi)容,如果缺少了重力作用,那么游戲的可玩性將大打折扣。賽車在三維賽道上的受力情況如圖312所示:圖312 賽車受力圖由受力圖分析可得:①當(dāng)玩家加油門時(shí),汽車的發(fā)動(dòng)機(jī)推進(jìn)汽車向前行駛。②風(fēng)、路面摩擦等,阻礙汽車向前行駛并使車速減慢。玩家也可以通過(guò)踩剎車來(lái)實(shí)現(xiàn)減速。③重力加速度豎直向下,使得車可以保持在路面上。如果汽車速度足夠快,汽車可能會(huì)脫離地面飛起來(lái)一段時(shí)間,直到重力加速度再次把車?yán)氐孛?。在平面上駕駛是很容易做到的,但不是非常有趣,特別是這個(gè)賽車游戲還可以在循環(huán)軌道,隧道,曲線等等上行駛。碰撞檢測(cè)將在本章后面討論,但可以在TestCarPhysicsOnPlane單元測(cè)試中添加重力并調(diào)整它。單元測(cè)試的其他部分保持不變,重力計(jì)算在CarPhysics類的Update方法中,它調(diào)用ApplyGravity方法/// Apply gravityprivate void ApplyGravity(){ // Fix car on ground float distFromGround = (carPos, groundPlanePos, groundPlaneNormal)。 isCarOnGround = distFromGround 。 // Use very hard and instant gravity to fix if car is below ground! float moveFactor = 。 float maxGravity = Gravity * moveFactor。 // Use more smooth gravity for jumping float minGravity = Gravity * moveFactor。 if (distFromGround maxGravity) { distFromGround = maxGravity。 gravitySpeed = 0。 } // if (distFromGround) if (distFromGround minGravity) { distFromGround = minGravity。 gravitySpeed = distFromGround。 } // if (distFromGround) += distFromGround。} // ApplyGravity()此代碼僅降低了z值,來(lái)處理車到達(dá)地面。當(dāng)駕駛上山時(shí)汽車可能會(huì)低于道路,或因?yàn)橐恍┚日`差,但z值都會(huì)被修正使車重回到公路上。調(diào)整要用到許多常數(shù),這些都是在CarPhysics類的一開(kāi)始被定義的。下面是前三個(gè)常數(shù)。改變CarMass,例如,如果汽車很重則它幾乎貼到地面行駛,或很輕,可在空中飛行很長(zhǎng)一段時(shí)間:/// Car is 1000 kgconst float CarMass = 1000。//。/// Gravity on earth is m/s^2const float Gravity = 。/// Max speed of our car is 275 mph./// While we use mph for the display, we calculate internally with/// meters per sec since meter is the unit we use for everthing in the game.public const float MaxSpeed = * MphToMeterPerSec。/// Convert our meter per sec to mph for display./// 1 mile = kilometers/// Each hour has 3600 seconds (60 min * 60 sec)./// 1 kilometer = 1000 meter.public const float MeterPerSecToMph = * ((*)/),MphToMeterPerSec = / MeterPerSecToMph。當(dāng)汽車停止發(fā)動(dòng)機(jī)后,汽車仍然具有一定的速度向前行駛,這便是慣性。模擬慣性需要記錄的數(shù)據(jù)包括賽車前一狀態(tài)下的速度值和速度方向。當(dāng)發(fā)動(dòng)機(jī)停止后,就以慣性保存的值去操作賽車。慣性可以增加真實(shí)感,并且慣性的設(shè)置對(duì)漂移等非常重要。作為一款賽車游戲,漂移給游戲者提供了更多的樂(lè)趣。玩家可以根據(jù)當(dāng)前路段的情況進(jìn)行不同方向上的漂移動(dòng)作,使汽車可以順利及高速地通過(guò)彎道,節(jié)省了因轉(zhuǎn)彎而造成的減速消耗的時(shí)間。高水平的玩家甚至可以在彎道較多的路段全程漂移,達(dá)到極限過(guò)關(guān)速度。漂移過(guò)程中需要對(duì)車輪的空間坐標(biāo)變換進(jìn)行控制,包括車輪旋轉(zhuǎn)、轉(zhuǎn)向、升降、碰撞反彈等動(dòng)作。車輪的空間坐標(biāo)信息如圖313所示:圖313 車輪坐標(biāo)系常見(jiàn)的漂移包括拐彎漂移和剎車漂移。l 拐彎漂移:利用車子的重心左右移動(dòng)實(shí)現(xiàn)漂移,優(yōu)點(diǎn)就是實(shí)現(xiàn)起來(lái)容易,但是要控制入彎的角度,要求控制得比較精細(xì)剎車漂移,利用車子重心的前后移動(dòng),在入彎時(shí)剎車,將重心移到車子前面,而車子尾部瞬間失去抓地力,然后將車尾甩出去,然后車子開(kāi)始打滑。l 剎車漂移:相對(duì)簡(jiǎn)單些,只要在賽車剎車后保持汽車原有行駛方向前進(jìn)一段位移就可以了,但此過(guò)程中要必須保持車輪不進(jìn)行轉(zhuǎn)動(dòng)。要在游戲中實(shí)現(xiàn)保存功能。首先,這意味著創(chuàng)建/打開(kāi)/刪除文件是很容易的。接著,使用XmlSerializer類能非常容易地將數(shù)據(jù)保存到文件并在以后加載數(shù)據(jù)。唯一的問(wèn)題是找到在PC平臺(tái)能保存的位置,要解決這個(gè)問(wèn)題,可用StorageDevice,它必須首先被建立。創(chuàng)建一個(gè)StorageDevice的原理非常簡(jiǎn)單和有效,而且這個(gè)方法并不局限與在XNA上使用。在將數(shù)據(jù)保存到磁盤之前,需要一個(gè)可用的位置進(jìn)行寫入。這可以通過(guò)創(chuàng)建一個(gè)StorageDevice實(shí)現(xiàn),StorageDevice會(huì)詢問(wèn)PC平臺(tái)上的用戶將數(shù)據(jù)保存到哪兒。 在這個(gè)過(guò)程中會(huì)打開(kāi)XNA Guide并終止程序直到用戶關(guān)閉Guide。要解決這個(gè)問(wèn)題,可以讓這個(gè)過(guò)程異步處理。Guide需要將GamerServicesComponent添加到游戲中,所以要將下列代碼添加到Game1構(gòu)造函數(shù)中:public Game1(){ graphics = new GraphicsDeviceManager(this)。 = Content。 (new GamerServicesComponent(this))。}下一步,當(dāng)調(diào)用Update方法時(shí),需要檢查用戶是否想保存數(shù)據(jù),如果是,則調(diào)用Guide. BeginShowStorageDeviceSelector,它會(huì)打開(kāi)一個(gè)對(duì)話框讓用戶選擇在哪里保存數(shù)據(jù)。程序并不會(huì)在此終止,但會(huì)暫停程序直到關(guān)閉對(duì)話框。,一旦用戶關(guān)閉對(duì)話框這個(gè)方法就會(huì)被調(diào)用:KeyboardState keyState = ()。 if (!) if (()) (FindStorageDevice, null)。 如果用戶按下S鍵就會(huì)打開(kāi)對(duì)話框,但代碼并不會(huì)終止直到用戶關(guān)閉對(duì)話框。當(dāng)對(duì)話框顯示在屏幕上時(shí)程序仍在運(yùn)行,一旦用戶做出選擇并關(guān)閉對(duì)話框,作為第一個(gè)參數(shù)的FindStorageDevice方法就會(huì)被調(diào)用,這意味著開(kāi)發(fā)者應(yīng)事先定義這個(gè)方法,否則編譯器會(huì)報(bào)錯(cuò):private void FindStorageDevice(IAsyncResult result){ StorageDevice storageDevice = (result)。 if (storageDevice != null) SaveGame(storageDevice)。 } BeginShowStorageDeviceSelector的輸出結(jié)果作為這個(gè)方法的參數(shù),如果將結(jié)果傳遞到Guide. EndShowStorageDeviceSelector方法,就可以獲取data storage。但是如果用戶取消操作,結(jié)果將會(huì)是null,所以應(yīng)該事先檢查。如果StorageDevice可用,要將它傳遞到SaveGame方法,這個(gè)方法一會(huì)兒后就會(huì)定義。一旦有了一個(gè)正確的StorageDevice,就可以很容易地為寫入數(shù)據(jù)的文件指定一個(gè)名稱:private void SaveGame(StorageDevice storageDevice){ StorageContain
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1