資訊內(nèi)容
Scratch第72講:精確制導(dǎo)
想了解編程技巧,就請(qǐng)點(diǎn)擊上面藍(lán)字:跟我學(xué)Scratch編程,關(guān)注CC哥
本來想在飛機(jī)大戰(zhàn)的游戲里加入導(dǎo)彈,后來想了一下,CC哥的目的主要還是做教學(xué),所以為了讓大家更好的學(xué)習(xí)和掌握知識(shí),CC哥就把這個(gè)精確制導(dǎo)做成了獨(dú)立的游戲,讓大家更容易學(xué)習(xí)。
導(dǎo)彈的特點(diǎn)
導(dǎo)彈嘛,CC哥總結(jié)的特點(diǎn)就是:
1:自動(dòng)選擇目標(biāo)
2:自動(dòng)追蹤目標(biāo),而且運(yùn)動(dòng)軌跡是弧形的。
在你的游戲里加入導(dǎo)彈是不是給游戲增色很多,有思考怎么實(shí)現(xiàn)的嗎?讓我們一起來看看。
游戲關(guān)鍵點(diǎn)
導(dǎo)彈也好,敵機(jī)也好,如果都是本地的角色之間發(fā)生互動(dòng)關(guān)系,都不會(huì)復(fù)雜,但是這個(gè)游戲的關(guān)鍵是兩個(gè)角色克隆體之間的互動(dòng),因?yàn)榘l(fā)射出去的導(dǎo)彈是導(dǎo)彈角色的克隆體,敵機(jī)是敵機(jī)角色的克隆體,那么克隆體之間怎么進(jìn)行這種實(shí)時(shí)的互動(dòng)呢?
程序介紹
戰(zhàn)機(jī)沒啥好介紹的,控制部分跟飛機(jī)大戰(zhàn)都一樣,用上下左右鍵進(jìn)行移動(dòng)。關(guān)鍵是讓大家看看CC哥找的造型是不是很酷
敵機(jī)的造型也挺酷的
導(dǎo)彈如何選擇目標(biāo)
如果想讓導(dǎo)彈選擇目標(biāo),那么就必須要有一個(gè)可選擇的記錄庫,和選擇的標(biāo)準(zhǔn),所以,當(dāng)導(dǎo)彈發(fā)射的一瞬間,我們需要知道天上有多少敵機(jī),以及他們之間怎么區(qū)別的,只有具備這些條件,你才有選擇的基礎(chǔ)。所以為了選擇目標(biāo),CC哥創(chuàng)建了一個(gè)列表,這個(gè)列表里就包含了所有在天空中出現(xiàn)的敵機(jī)。只要在這個(gè)列表里進(jìn)行選擇就好了。
那這個(gè)列表里存的什么數(shù)據(jù)呢?存的就是一個(gè)一個(gè)敵機(jī)的編號(hào)。所以我們?cè)诳寺硻C(jī)的時(shí)候,需要為每一個(gè)敵機(jī)進(jìn)行編號(hào),否則就無法對(duì)敵機(jī)進(jìn)行一一的識(shí)別,更談不上選擇了。
這是敵機(jī)開始的一段程序,CC哥讓敵機(jī)在舞臺(tái)的高處隨機(jī)的出現(xiàn),但是在出現(xiàn)的同時(shí),用“敵機(jī)編號(hào)”這個(gè)私有變量對(duì)敵機(jī)進(jìn)行編號(hào)。同時(shí)把這個(gè)敵機(jī)編號(hào)加入到{敵機(jī)隊(duì)列}這個(gè)列表里。
但是如果敵機(jī)消失在舞臺(tái)邊緣,或者被擊毀和撞毀,那么它就不再是目標(biāo)了,就需要從目標(biāo)的庫里刪除掉,也就是從{敵機(jī)隊(duì)列}里刪除掉。
這段代碼不難理解,就是敵機(jī)在飛行過程中,如果被導(dǎo)彈擊中,就播放爆炸效果。然后不論是那種情況消失,都需要從敵機(jī)隊(duì)列里刪除這個(gè)編號(hào)。刪除完之后,如果隊(duì)列里還有敵機(jī),那么就選擇隊(duì)列的第一項(xiàng),也是隊(duì)列里出現(xiàn)最早的飛機(jī)。如果刪除完之后隊(duì)列里沒有項(xiàng)目了,就說明飛機(jī)已經(jīng)被打光了,所以要把目標(biāo)敵機(jī)這個(gè)變量設(shè)為0。
CC哥用“目標(biāo)敵機(jī)”這個(gè)變量來代表此時(shí)此刻被導(dǎo)彈鎖定的敵機(jī)!
如果目標(biāo)敵機(jī)為0了,也就是沒有敵機(jī)了,那么下面一刻新克隆出來的敵機(jī)就自動(dòng)成為當(dāng)前的目標(biāo)敵機(jī)。
當(dāng)然,既然知道了目標(biāo)敵機(jī)是誰,那肯定無時(shí)不刻都要盯緊它,要實(shí)時(shí)鎖定它的物理方位才能進(jìn)行攻擊!
導(dǎo)彈飛行過程中跟蹤敵機(jī)
敵機(jī)的坐標(biāo)鎖定了,但是導(dǎo)彈怎么跟蹤它呢?這個(gè)x和y坐標(biāo)可是隨時(shí)在發(fā)生變化,而不是固定在那里讓我打。那你的運(yùn)動(dòng)軌跡如何跟蹤一個(gè)實(shí)時(shí)變動(dòng)的目標(biāo)呢?
一種方法:根據(jù)雙方的X和Y坐標(biāo)來算角度,這就是幾何了,大家可以畫畫圖試一下怎么計(jì)算,CC哥認(rèn)為這也是一種不錯(cuò)的方法呢。
還有一種方法就是用現(xiàn)有的命令,
但是問題是這只能面向一個(gè)角色,不能面向一個(gè)克隆體呀,怎么辦?老辦法,引入影子目標(biāo)角色,也就是用另一個(gè)隱形的角色,實(shí)時(shí)的移動(dòng)到目標(biāo)的X,Y坐標(biāo)上,充當(dāng)靶子。只要導(dǎo)彈面向這個(gè)角色,就相當(dāng)于面向了目標(biāo),只要實(shí)時(shí)去用面向這個(gè)命令來校準(zhǔn),那導(dǎo)彈就始終是往目標(biāo)的地方追。
這就是這個(gè)影子角色,為什么不隨便用個(gè)圓圈或小點(diǎn)代替,是因?yàn)镃C哥要做碰撞檢測的,所以只有影子目標(biāo)的造型和真實(shí)目標(biāo)的造型一模一樣,才能完美的檢測是否真正擊中目標(biāo)。另外CC哥涂這一下子是為了調(diào)試程序用的,否則都長一樣,CC哥也區(qū)分不出哪個(gè)是真身哪個(gè)是影子呀。
為什么不用隱藏,而用虛像99,這兩個(gè)的基本效果都是一樣的,都是讓你看不見,但是區(qū)別是隱藏了就檢測不到碰撞了,而虛到99,那雖然你看不見,但是計(jì)算機(jī)看得見,也就是碰撞檢測不受影響。對(duì)于這段程序就是目標(biāo)角色會(huì)始終盯住目標(biāo)戰(zhàn)機(jī)的位置,任勞任怨的充當(dāng)導(dǎo)彈的靶子。
飛機(jī)上不同的位置開始著火,就能充分表現(xiàn)這一點(diǎn),后來加上去發(fā)現(xiàn)效果還不錯(cuò)。
如果想免費(fèi)獲得CC哥的講座中的程序代碼以及游戲素材,可以通過掃描二維碼關(guān)注《跟我學(xué)Scratch編程》,然后點(diǎn)擊獲取代碼即可。
游戲合理性
CC哥做程序和游戲都有一個(gè)習(xí)慣,要思考你設(shè)計(jì)的東西是不是合理,在目標(biāo)選擇這一塊,CC哥就想了,按照上面的邏輯,肯定是選擇最早出現(xiàn)的敵機(jī),因?yàn)殡x得的會(huì)最近,最有威脅。但是如果用導(dǎo)彈去作為攻擊武器,那么就不那么簡單了,因?yàn)閷?dǎo)彈有導(dǎo)彈的特性,首先導(dǎo)彈都是往前發(fā)射,發(fā)射出去之后再變化軌跡進(jìn)行敵機(jī)追蹤,第二,導(dǎo)彈是飛的很快的,并不會(huì)臨時(shí)轉(zhuǎn)彎,轉(zhuǎn)彎時(shí)需要較大的轉(zhuǎn)彎半徑。所以不是所有的敵機(jī)都適合發(fā)射導(dǎo)彈去攻擊。比如已經(jīng)靠近你左右側(cè)的敵機(jī)就很難擊中,因?yàn)檗D(zhuǎn)彎半徑就已經(jīng)大過與敵機(jī)的距離了。或者已經(jīng)飛到你后面的敵機(jī)就更難擊中一些。當(dāng)然,放著前面的敵機(jī)不去打,非要辛苦的繞到后面去打,肯定不合理。
所以CC哥為了合理性,就在目標(biāo)選擇上增加了篩選條件,也就是只有在戰(zhàn)機(jī)前面并和戰(zhàn)機(jī)保持一定距離以上的敵機(jī)才會(huì)成為攻擊目標(biāo)。
處于這份考量,CC哥在目標(biāo)跟蹤上加了這段代碼,如果在發(fā)射時(shí)檢測到敵機(jī)離戰(zhàn)機(jī)太近和位于戰(zhàn)機(jī)的后方,那么目標(biāo)會(huì)忽略次敵機(jī),自動(dòng)調(diào)整到下一個(gè)可以攻擊的敵機(jī)。
導(dǎo)彈的運(yùn)動(dòng)軌跡
導(dǎo)彈的運(yùn)動(dòng)軌跡也是個(gè)游戲設(shè)計(jì)點(diǎn):
有點(diǎn)象火箭的導(dǎo)彈
這個(gè)就是如果鎖定了目標(biāo)就發(fā)射!發(fā)射的初始方向都是正前方!
然后根據(jù)目標(biāo)的位置進(jìn)行方向修正,如果導(dǎo)彈的方向和飛機(jī)飛行的方向差別比較大時(shí),那么每飛一步就進(jìn)行5度的校準(zhǔn),如果方向差別已經(jīng)在5度以內(nèi)了,那么校準(zhǔn)就變成每步1度。
這段代碼比較長的原因是校準(zhǔn)的方向跟導(dǎo)彈和敵機(jī)所處的位置有所區(qū)別,舉個(gè)例子,如果導(dǎo)彈和敵機(jī)都在垂直方向的一邊,那么軌跡比較簡單,始終朝著減小的方向調(diào)整就能將兩個(gè)角度重合。但是如果一旦出現(xiàn)其中一個(gè)角色飛到了下部中心垂直方向的另一邊,那么兩者之間的角度差就會(huì)突然大了180度。這時(shí)候你如果還是朝著角度差減小的方向去調(diào)整,那么可能會(huì)造成導(dǎo)彈的突然轉(zhuǎn)向,從另一個(gè)方向去追敵機(jī),那肯定是不合理的,這跟Scratch的坐標(biāo)和方向的定義有很大關(guān)系。所以CC哥在這里做的條件判斷,就是不希望導(dǎo)彈會(huì)隨著角色突然跨越下部中心垂直線造成方向角度的突然變化而導(dǎo)致導(dǎo)彈突然轉(zhuǎn)向。
總結(jié)
今天學(xué)到的知識(shí):
1:用列表來存儲(chǔ)克隆體的編號(hào),從而實(shí)現(xiàn)對(duì)克隆體的個(gè)體管理。
2:用影子角色來輔助對(duì)具體某個(gè)克隆體的操作。
3:進(jìn)一步了解位置,方向的相對(duì)性。
聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過郵件及時(shí)和我們聯(lián)系刪除

- 上一篇
Scratch編程基礎(chǔ)課第八講:喵,動(dòng)起來!(1)
Scratch編程基礎(chǔ)課第八講:喵,動(dòng)起來!(1) 在設(shè)計(jì)動(dòng)畫時(shí),角色的移動(dòng)效果是最基本的動(dòng)畫效果。當(dāng)角色在移動(dòng)、轉(zhuǎn)動(dòng)時(shí),在背景中所處的坐標(biāo)到底是以角色的哪個(gè)位置為參照呢?角色移動(dòng)的方向是什么?所以我們?cè)诰幊讨氨仨毰宄@兩個(gè)問題。 1、角
- 下一篇
銘苑教育scratch第三次授課周報(bào)!
昨天,我們銘苑教育碼趣編程結(jié)束了我們scratchA/B班級(jí)的第三次授課,讓我們一起來回顧一下上課的精彩瞬間吧! scratch-A